Phoebe's blog

大创学习记录(二)之CNN-1 LeNet5卷积神经网络初学习

Word count: 2.6kReading time: 9 min
2020/05/06 Share

五一假期忙忙碌碌就快过去了,虽然也不知道具体自己都在忙些什么,但是还是每天都有每天的收获,很充实,我常常在想人为什么需要假期,忙着奔跑之后的停顿可能也会带来一些小惊喜,对我来说,可能是去野餐瞥见阳光下的夏天的味道让人沉溺的只想睡去,可能是去串门发现高二的妹妹满墙的公式单词和“鸡汤”拼命地把我往回忆里拽,原来那时看起来那么幼稚的举动竟然真的能给现在的我这么大的力量……哈哈哈还是改不了一开始在键盘上敲字就要写小作文的习惯,不多说啦,假期的最后一天,记录一下大创学习的内容。‘
老师在五一放假前请研究生学姐来给我们简要的介绍了一下深度学习LeNet-5的一些架构,当时来说还不是很明白,所以假期期间去看了老师推荐的一些教学视频和博客,再来理解学姐给我们的动手去跑一跑的代码,并且记录如下:
对于卷积和池化的操作都比较简单了,卷积主要是做特征提取后向量的一些內积,计算方式可以用下图来表示
在这里插入图片描述
有几个符号及计算关系需要记住:
H:图片高度;
W:图片宽度;
D:原始图片通道数,也是卷积核个数;
F:卷积核高宽大小;
P:图像边扩充大小;
S:滑动步长。
在上图中,H=5,W=5,D=3,P=1,经过卷积操作得到输出为3×3×2(用Ho×Wo×K表示)大小的特征图,即3×3大小的2通道特征图,其中Ho计算公式为:Ho=(H−F+2×P)/S+1,Wo同理。
池化则是通过减少网络的参数来减小计算量,并且能够在一定程度上控制过拟合。通常在卷积层的后面会加上一个池化层。池化包括最大池化、平均池化等。其中最大池化是用不重叠的矩形框将输入层分成不同的区域,对于每个矩形框的数取最大值作为输出层,是比较常采用的形式。
然后有一个LeNet5网络图比较有助于理解,一层一层的去剖析:
在这里插入图片描述
1、INPUT层-输入层
首先是数据 INPUT 层,输入图像的尺寸统一归一化为32×32。
本层是不算LeNet-5的网络结构,传统上,不将输入层视为网络层次结构之一。
2、**C1层-卷积层*
输入图片:32×32
卷积核大小:5×5
卷积核种类:6
输出featuremap大小:28×28 (32-5+1)=28
神经元数量:28×28×6
可训练参数:(5×5+1) ×6(每个滤波器5×5=25个unit参数和一个bias参数,一共6个滤波器)
连接数:(5×5+1)×6×28×28=122304
3、S2层-池化层(下采样层)
输入:28×28
采样区域:2×2
采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
采样种类:6
输出featureMap大小:14×14(28/2)
神经元数量:14×14×6
连接数:(2×2+1)6×14×14,S2中每个特征图的大小是C1中特征图大小的1/4。
*
4、C3层-卷积层**
输入:S2中所有6个或者几个特征map组合卷积核大小:5×5
卷积核种类:16
输出featureMap大小:10×10 (14-5+1)=10
C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合
存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。
则:可训练参数:6×(3×5×5+1)+6×(4×5×5+1)+3×(4×5×5+1)+1×(6×5×5+1)=1516
连接数:10×10×1516=151600
详细说明:第一次池化之后是第二次卷积,第二次卷积的输出是C3,16个10x10的特征图,卷积核大小是 5×5. 我们知道S2 有6个 14×14 的特征图,怎么从6 个特征图得到 16个特征图了? 这里是通过对S2 的特征图特殊组合计算得到的16个特征图。具体如下:
在这里插入图片描述
之前这里一直不是特别懂,现在理解了!C3的前6个feature map(对应上图第一个红框的6列)与S2层相连的任选3个feature map相连接(上图第一个红框),后面6个feature map与S2层相连的任选4个feature map相连接(上图第二个红框),后面3个feature map与S2层部分不相连的任选4个feature map相连接,最后一个与S2层的所有feature map相连。
在这里插入图片描述
5、S4层-池化层(下采样层)
输入:10×10
采样区域:2×2
采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
采样种类:16
输出featureMap大小:5×5(10/2)
神经元数量:5×5×16=400
连接数:16×(2×2+1)×5×5=2000
S4中每个特征图的大小是C3中特征图大小的1/4
6、C5层-卷积层
输入:S4层的全部16个单元特征map(与s4全相连)
卷积核大小:5×5
卷积核种类:120
输出featureMap大小:1×1(5-5+1)
可训练参数/连接:120×(16×5×5+1)=48120
C5层的网络结构如下:
在这里插入图片描述
7、F6层-全连接层
输入:c5 120维向量
计算方式:计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出。
可训练参数:84
(120+1)=10164
详细说明:6层是全连接层。F6层有84个节点,对应于一个7x12的比特图,-1表示白色,1表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。该层的训练参数和连接数是(120 + 1)x84=10164。ASCII编码图如下:
在这里插入图片描述
F6层的连接方式如下:
在这里插入图片描述
8、Output层-全连接层
Output层也是全连接层,共有10个节点,分别代表数字0到9,且如果节点i的值为0,则网络识别的结果是数字i。采用的是径向基函数(RBF)的网络连接方式。假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:
在这里插入图片描述

上式w_ij 的值由i的比特图编码确定,i从0到9,j取值从0到7*12-1。RBF输出的值越接近于0,则越接近于i,即越接近于i的ASCII编码图,表示当前网络输入的识别结果是字符i。该层有84x10=840个参数和连接。
在这里插入图片描述
上图是LeNet-5识别数字3的过程。
以上参考自这篇博客。 LeNet5详解

把上述过程的一些参数的计算弄清楚之后,再去看代码。就会更好理解一些,但是在开始准备运行代码的时候,又遇到了一个障碍,学姐给的代码是pytorch环境的,而我之前搭的是tensorflow的,基于初学者,对于两者之间的转换可能不是很熟悉,想着以后反正都要用,就再去下载了一下pytorch。
过程如下:
使用conda来安装pytorch
在这里推荐一篇博客,安装过程写的非常详细。 pytorch环境搭建

安装的命令同样可以登录pytorch的官网,然后选择和自己电脑配置以下的信息,会自动生成的对应conda命令

https://pytorch.org/get-started/locally/
在这里插入图片描述

如果不知道自己的各种安装的版本号,可以在anaconda navigator中查看,在Anaconda prompt中运行这句话之后,(我的是10.0)就会出现以下画面:
在这里插入图片描述
但是我在运行了之后怎么都下载不下来,百度了一下很多人都有这个问题,有人说退出再运行一次就可以,但我的问题显然不是网络问题,所以无奈之下,只好换了一个命令,又去pytorch官网搜了更以前的版本来运行

1
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch

终于可以正常下载了,但是下载的过程还是花了很久,有人说把后面的-c pytorch去掉可以下载的快一点,不建议用pip安装,还是参照官网更好一点。
不管怎么样,最终还是下载完了,用下面这个命令查看已经搭建了哪些环境

1
conda info --env

在这里插入图片描述
可以看到pytorch已经存在了(tf2.0b是之前搭的tensorflow的环境)
接下来激活环境

1
activate pytorch

之后进入python

1
python

进行测试

1
import torch

都是可以正常运行的
于是开始运行项目以及代码,进入到保存代码的目录下,以后都可以直接用vscode或者什么吧代码编辑好之后,改成.py文件,放在目录下,我的这个目录下已经包括了下载好的MNIST手写数据集,所以直接用python运行就可以了
在这里插入图片描述
结果截图:
在这里插入图片描述
可以看到准确度非常高,但是我仍然疑惑loss应该是一直下降的,我的结果不是一直下降的,而且震荡是非常大的,这个问题之前学姐演示的时候也被老师指出过,于是去问了老师,老师说是learning_rate太大的问题,于是后来又改小了那个指数,这个问题就解决的比较好了,结果如下:
在这里插入图片描述
在这里再放上篇博客,对于LeNet5每一层的讲解以及代码的呈现都是经典的LeNet5结构,非常值得学习的代码思路,所以我又在tensorflow环境里去跑了一下这篇博客里的代码,得到的结果也和博客里的结果是一样的。CNN-1 LeNet5卷积神经网络模型

CATALOG