重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)

article/2025/7/3 9:50:51

重学深度学习系列—LeNet5实现手写数字识别(TensorFlow2-mnist数据集)

文章目录

  • 重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)
    • 我的环境:
    • 一、LeNet5简单介绍
    • 二、LeNet-5代码实现
    • 三、训练
    • 四、对图片进行预测
    • 五、训练过程截图:
    • 参考资料

我的环境:

TensorFlow2.3.0 、Pycharm、Windows10

代码已发布在码云上:https://gitee.com/jiangyi-yan/re-learning-and-deep-learning/tree/master/1.LeNet5_Mnist

或者在百度网盘下载:
链接:https://pan.baidu.com/s/1J–9eUJMDB9SbRB5xwIr8Q
提取码:2022
–来自百度网盘超级会员V4的分享

一、LeNet5简单介绍

​ LeNet-5模型由LeCun等人于1998年提出,主要用于手写数字识别和英文字符识别,是卷积神经网络的鼻祖,其网络结构简单,却能取到良好的识别的效果。在MNIST数据集上,LeNet-5模型可以达到99.2%的准确率。

​ 论文链接:http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf

​ 其网络结构图如下:

image-20220117233940263

​ 可以看到LeNet5网络有7层

​ 1.第1层:卷积层

​ 输入:原始的图片像素矩阵(长度、宽度、通道数),大小为32×32×1;

​ 参数:滤波器尺寸为5×5,深度为6,不使用全0填充,步长为1;

​ 输出:特征图,大小为28×28×6。

​ 分析:因为没有使用全0填充,所以输出尺寸 = 32 - 5 + 1 = 28,深度与滤波器深度一致,为6。

​ 2.第2层:池化层

​ 输入:特征图,大小为28×28×6;

​ 参数:滤波器尺寸为2×2,步长为2;

​ 输出:特征图,大小为14×14×6。

​ 3.第3层:卷积层

​ 输入:特征图,大小为14×14×6;

​ 参数:滤波器尺寸为5×5,深度为16,不使用全0填充,步长为1;

​ 输出:特征图,大小为10×10×16。

​ 分析:因为没有使用全0填充,所以输出尺寸 = 14 - 5 + 1 = 10,深度与滤波器深度一致,为16。

​ 4.第4层:池化层

​ 输入:特征图,大小为10×10×16;

​ 参数:滤波器尺寸为2×2,步长为2;

​ 输出:特征图,大小为5×5×6。

​ 5.第5层:全连接层

​ 输入节点个数:5×5×16 = 400;

​ 参数个数:5×5×16×120+120 = 48120;

​ 输出节点个数:120。

​ 6.第6层:全连接层

​ 输入节点个数:120;

​ 参数个数:120×84+84 = 10164;

​ 输出节点个数:84。

​ 7.第7层:全连接层

​ 输入节点个数:84;

​ 参数个数:84×10+10 = 850;

​ 输出节点个数:10。

二、LeNet-5代码实现

# LeNet5网络模型
model = tf.keras.Sequential([# 第1层-卷积层 滤波器尺寸5*5,6个keras.layers.Conv2D(6,5),# 第2层-池化层,滤波器尺寸为2×2,步长为2keras.layers.MaxPooling2D(pool_size=2,strides=2),keras.layers.ReLU(),# 第3层-卷积层 滤波器尺寸5*5,16个keras.layers.Conv2D(16,5),# 第4层-池化层,滤波器尺寸为2×2,步长为2keras.layers.MaxPooling2D(pool_size=2,strides=2),keras.layers.ReLU(),keras.layers.Flatten(), # 拉平之后方便做全连接# 第5层-全连接层keras.layers.Dense(120,activation='relu'),# 第6层-全连接层keras.layers.Dense(84,activation='relu'),# 第7层-全连接层keras.layers.Dense(10,activation='softmax') # 最后输出10类,0-9的数字
])

​ 由于MNIST数据集图片大小是28×28的,所以在训练时可以把卷积核尺寸调小为3×3。当然,不修改也没问题。

三、训练

import tensorflow as tf
from tensorflow import keras
print(tf.__version__) # 打印出TensorFlow的版本# 设置一次送入GPU的量
batchsize = 32# LeNet5网络模型
model = tf.keras.Sequential([# 第1层-卷积层 滤波器尺寸5*5,6个keras.layers.Conv2D(6,5),# 第2层-池化层,滤波器尺寸为2×2,步长为2keras.layers.MaxPooling2D(pool_size=2,strides=2),keras.layers.ReLU(),# 第3层-卷积层 滤波器尺寸5*5,16个keras.layers.Conv2D(16,5),# 第4层-池化层,滤波器尺寸为2×2,步长为2keras.layers.MaxPooling2D(pool_size=2,strides=2),keras.layers.ReLU(),keras.layers.Flatten(), # 拉平之后方便做全连接# 第5层-全连接层keras.layers.Dense(120,activation='relu'),# 第6层-全连接层keras.layers.Dense(84,activation='relu'),# 第7层-全连接层keras.layers.Dense(10,activation='softmax') # 最后输出10类,0-9的数字
])model.build(input_shape=(batchsize,28,28,1)) # 28*28*1 1个通道# 打印出网络结构
model.summary()# 编译
model.compile(optimizer=keras.optimizers.Adam(),loss = keras.losses.CategoricalCrossentropy(),metrics=['accuracy'])# 数据预处理
def preprocess(x,y):x = tf.cast(x,dtype=tf.float32) / 255x = tf.reshape(x,[-1,28,28,1]) #y = tf.one_hot(y,depth=10)return x,y# 加载数据集
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()
# 查看类型
print('x_train=',type(x_train))
print('y_train=',type(y_train))train_db = tf.data.Dataset.from_tensor_slices((x_train,y_train))
print('train_db=',type(train_db))
train_db = train_db.shuffle(10000) # 打乱数据
train_db = train_db.batch(128)
train_db = train_db.map(preprocess)test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test))
print('test_db=',type(test_db))
test_db = test_db.shuffle(10000)
test_db = test_db.batch(128)
test_db = test_db.map(preprocess)# 开始训练
model.fit(train_db,epochs=10)# 在测试集上验证
model.evaluate(test_db)# 保存训练的模型
model.save('./lenet5.h5')

四、对图片进行预测

​ 前面已经训练过并已经保存了训练后的模型,因此可以调用模型进行预测。

from PIL import Image
import numpy as np
from tensorflow.keras.models import load_model
import cv2# 加载模型
model = load_model('./model/lenet5.h5')def predict(image_path):# 以黑白方式读取图片img = Image.open(image_path).convert('L')img.resize((28,28))img = np.reshape(img, (28, 28, 1)) / 255.x = np.array([1 - img])y = model.predict(x)# 因为x只传入了一张图片,取y[0]即可# np.argmax()取得最大值的下标,即代表的数字print(image_path)print(y[0])print('the number is :', np.argmax(y[0]))if __name__ == "__main__":img = cv2.imread('./imgs/1.jpg', 0)img = cv2.resize(img, (28, 28))cv2.imwrite('./test.jpg', img)predict('./test.jpg')

​ 我们预测的图片可以是任意尺寸的,但是送入网络预测时都必须resize成28×28的,这里由于我不太熟悉image库,格式调整起来比较麻烦,所以我先用opencv库进行resize再保存下来,然后对这张图片进行预测(比较笨的方法)。

​ 预测结果:

image-20220118110209106

image-20220118110228800

五、训练过程截图:

1.输出网络结构:

image-20220118104704547

2.训练过程:

image-20220117230558941

参考资料

1.《深度学习实践教程》吴微

2.LeNet-5论文链接:http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf


http://chatgpt.dhexx.cn/article/Il0pdBKb.shtml

相关文章

经典网络-LeNet-5

上图展示展示了 LeNet-5 模型的架构。 是Yann LeCun 教授于1998 年在论文Gradient-based learning applied to document recognition中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。 LeNet-5 详细结构 在下面的篇幅中将详细介绍LeNet-5 模型每一层的…

深度学习---卷积神经网络之LeNet5(TensorFlow 代码实现)

一、前言 1.1 使用全连接神经网络对图像进行处理存在的问题 1、需要处理的数据量大,效率低 现在的图像都有着极高的像素,假设一张需要处理的图片像素是 1000 * 1000 * 3(彩色图片,具有 RGB 3 个通道),使用具有 100 个隐藏单元的…

浅谈LeNet-5

浅谈LeNet-5 基于Tensorflow的实现欢迎查看我下一篇博客Tensorflow实战 LeNet-5神经网络进行手写体数字识别 一、LetNet是什么? LetNet是一种入门级的神经网络模型,是一个简单的卷积神经网络,可以用来做手写体识别。 下面我将以上图为例简…

卷积神经网络CNN与LeNet5详解(可训练参数量、计算量、连接数的计算+项目实战)

文章目录 神经网络CNN卷积神经网络CNN的由来局部感受野共享权重池化CNN的结构光栅化 LeNet5详解LeNet5-C1层LeNet5-S2层LeNet5-C3层LeNet5-S4层LeNet5-C5层LeNet5-F6层LeNet5-OUTPUT层计算公式 LeNet5实战定义网络模型初始化模型参数训练测试准确率预测结果 神经网络 神经网络可…

lenet5实现

Pytorch环境下搭建lenet5网络实现手写数字识别 (文章采用cuda9.0cudnn7.4pytorch1.6环境) 数据集选用EMNIST dataset中的手写数据集,参考链接如下: 数据集下载地址 代码部分参考S.E作者的pytorch实现手写英文字母识别&#xff0…

从零开始的神经网络构建历程(三,LeNet5复现)

前两篇博文主要介绍了torch如何构建全连接前馈神经网络,本篇博客主要针对经典卷积神经网络LeNet5进行复现。 卷积神经网络的基本结构 相信不少人都看过不少博客,也都对卷积神经网络的大致结构了解一点,这里本人站在神经元的角度来描述卷积神…

卷积神经网络LeNet5结构

LeNet5可以说是最早的卷积神经网络了,它发表于1998年,论文原文Gradient-Based Learning Applied to Doucment Recognition作者是Yann Le Cun等。下面对LeNet5网络架构进行简单的说明,有兴趣的同学可以去参考原文,论文原文地址http…

Lenet5(1998)

先读 https://blog.csdn.net/zhangjunhit/article/details/53536915 https://blog.csdn.net/qianqing13579/article/details/71076261 第三个卷积层,S2 6个1010的特征映射,C3是16个1010的特征映射,怎么做的呢? 关注C3层 Why not …

LeNet5的论文及理解

LeNet5网络的来源:Lcun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11):2278-2324. 1. 卷积神经网络(Convolutional Neural Network,CNN)基…

Pytorch搭建LeNet5网络

本讲目标:   介绍Pytorch搭建LeNet5网络的流程。 Pytorch八股法搭建LeNet5网络 1.LeNet5网络介绍2.Pytorch搭建LeNet5网络2.1搭建LeNet网络2.2测试LeNet网络输出2.3下载数据集2.4加载并配置网络2.5训练并保存网络2.6测试图片 1.LeNet5网络介绍 借鉴点:…

HLS:卷积神经网络LeNet5的实现与测试

目录 一、引言二、LeNet5的学习三、数学知识补充四、HLS代码设计五、仿真综合与优化六、Zynq平台搭建测试七、一些注意点八、文献时间线与后续工作 一、引言 1、开发环境。 Windows10、Vivado2018.2、Vivado HLS与Xilinx SDK。 2、LeNet5概述。 1994年,CNN网络&…

卷积神经网络(一):LeNet5的基本结构

在机器视觉,图像处理领域,卷积神经网络取得了巨大的成功。本文将参考UFLDL和DEEPLEARNING.NET的教程,结合自己的理解,梳理一下卷积神经网络的构成以及其BP算法的求解。虽然利用theano可以方便的实现LeNet5,但是不利于学…

LeNet5网络结构详解

文章目录 1.论文地址:2.LeNet5网络结构:3.首先了解参数量和计算量之间的区别和计算:(1)参数量(Params):(2)计算量(FLOPS):&#xff08…

经典网络模型介绍系列——LeNet-5

从今天开始,带大家从LeNet5开始学习经典的网络模型。 一、LeNet-5 LeNet-5是LeNet系列的最终稳定版,它被美国银行用于手写数字识别,该网络有以下特点: 所有卷积核大小均为5*5,步长为1;所有池化方法为平均…

LeNet5的深入解析

论文:Gradient-based-learning-applied-to-document-recognition 参考:http://blog.csdn.net/strint/article/details/44163869 LeNet5 这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,…

LeNet5模型讲解

加粗样式LeNet5模型讲解 LeNet5模型总览 总共8层网络,分别为: 输入层(INPUT)、卷积层(Convolutions,C1)、池化层(Subsampling,S2)、卷积层(C3)、…

LeNet-5详解

一、前言 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 本文将从卷积神经网络结构的基础说起,详细地讲解每个网络层。 论文下载:请到文章结尾处下载。 …

卷积神经网络:LeNet-5

2021SCSDUSC LeNet-5卷积神经网络的整体框架: 特征映射:一幅图在经过卷积操作后得到结果称为特征图。 LeNet-5共有8层,包含输入层,每层都包含可训练参数;每个层有多个特征映射(,每个特征映射通过一种卷积…

LeNet-5网络详解

文章目录 1 模型介绍2 模型结构3 模型特性 1 模型介绍 LeNet-5出自论文《Gradient-Based Learning Applied to Document Recognition》,是由 L e C u n LeCun LeCun 于1998年提出的一种用于识别手写数字和机器印刷字符的卷积神经网络,其命名来源于作者 …

深度学习入门(一):LeNet-5教程与详解

1.什么是LeNet LeNet5诞生于1994年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从1988年开始,在多年的研究和许多次成功的迭代后,这项由Yann LeCun完成的开拓性成果被命名为LeNet5。 LeNet: 主要用来…