本文先分析了LeNet-5模型的结构,然后基于LeNet-5模型写了TensorFlow代码实现mnist数字识别,代码部分进行了详细注解,目前也在学习阶段,有错误欢迎指出,大家一起学习。
LeNet-5模型结构图如下图:
LeNet-5模型总共有7层。
第一层:卷积层
第一层卷积层的输入为原始的图像,原始图像的尺寸为32×32×1。卷积层的过滤器尺寸为5×5,深度为6,不使用全0补充,步长为1。由于没有使用全0补充,所以这一层的输出的尺寸为32-5+1=28,深度为6。这一个卷积层总共有5×5×1×6+6=156个参数,其中6为偏置项参数个数,卷积层的参数个数只和过滤器的尺寸,深度以及当前层节点矩阵的深度有关。因为下一层节点矩阵有28×28×6=4704个节点,每个节点和5×5=25个当前层节点相连,所以本层卷积层总共有4704×(25+1)=122304个连接。
第二层:池化层
这一层的输入为第一层的输出,是一个28×28×6的节点矩阵。本层采用的过滤器大小为2×2,步长为2,所以本层的输出矩阵大小为14×14×6。
第三层:卷积层
本层的输入矩阵大小为14×14×6,采用的过滤器大小为5×5,深度为16,不使用全0补充,步长为1。这一层的输出的尺寸为14-5+1=10,深度为16,即输出矩阵大小为10×10×16。本层参数有5×5×6×16+16=2416个,连接有10×10×16×(5×5+1)=41600个。
第四层:池化层
本层的输入矩阵大小为10×10×16,采用的过滤器大小为2×2,步长为2,本层的输出矩阵大小为5×5×16。
第五层:全连接层
本层的输入矩阵大小为5×5×16,在LeNet-5模型的论文中将这一层称为卷积层,但是因为过滤器的大小就是5×5,所以和全连接层没有区别,这里直接看成全连接层。本层输入为5×5×16矩阵,将其拉直为一个长度为5×5×16的向量,即将一个三维矩阵拉直到一维空间以向量的形式表示,这样才可以进入全连接层进行训练。本层的输出节点个数为120,所以总共有5×5×16×120+120=48120个参数。
第六层:全连接层
本层的输入节点个数为120个,输出节点个数为84个,总共有120×84+84=10164个参数。
第七层:全连接层
本层的输入节点个数为84个,输出节点个数为10个,总共有84×10+10=850个参数。
接下来以TensorFlow代码展示一个基于LeNet-5模型的mnist数字识别代码。
mnist数据集png图片格式下载链接:链接:http://pan.baidu.com/s/1eRG6TqU 密码:uf4m
tensorflow版本:1.2.1
代码如下:
1 |
|
最终测试准确率大概在99%左右。
随机运行一次的训练及测试结果如下:
1 | ... |
参考:《TensorFlow:实战Google深度学习框架》