手写体数字很熟悉吧,来自经典的Mnist数据集,我在不同阶段训练过这个数据集:不会神经网络时我用keras简单搭建全连接神经网络;学会深层神经网络原理后,我不用TensorFlow/Pytorch深度学习框架,手工搭建DNN;学习了TensorFlow的基本操作后,我用tf搭建了全连接神经网络。
回顾我做过的这些工作,让我对Mnist数据集有了较深的理解。然而纵观我实现这个训练过程的方式,仅仅用到的是DNN,甚至仅仅是SNN,完全没有涉及到做图像分类更好的网络模型——卷积神经网络CNN。
学到这一课,我也很欣喜!接下来一起学习学习如何搭建自己的卷积神经网络,完成手写数字的识别过程!
一、CNN网络搭建
- 这个卷积神经网络的过程基于LeNet-5
- 一般认为有权重的才作为神经网络的一层,所以CONV+POOL作为一层
拉伸后与全连接层FC进行连接,此时和DNN过程相同,要识别0-9数字,输出层用Softmax回归。
有关超参数调试的建议:
不要直接自己尝试参数,因为参数太多,尽量去选择文献中的优秀参数,选取别人任务中效果很好的架构去训练。
参数数量怎么计算?
- 卷积过滤器中元素数量加1(偏置值b),再乘上过滤器的数量。
- 池化层不含权重,这里默认为无参数。
- FC层是DNN中的,FC3层的权重维度是(120,400),故有w 48000个,b 1个。
注意!默认卷积层中的过滤器各个通道参数相同,所以计算参数数量时不需要乘上通道数!
208
=
(
5
∗
5
+
1
)
∗
8
208=(5*5+1)*8
208=(5∗5+1)∗8
416
=
(
5
∗
5
+
1
)
∗
16
416=(5*5+1)*16
416=(5∗5+1)∗16
48001
=
400
∗
120
+
1
48001=400*120+1
48001=400∗120+1
10081
=
120
∗
84
+
1
10081=120*84+1
10081=120∗84+1
二、为什么要使用卷积?
相比DNN来说,CNN有什么优势?
卷积可以减少参数的数量!我们可以用更小的数据集训练,从而防止过拟合!
CNN仅仅需要更少的参数,而DNN需要相当大数量的参数。举个例子如下:
如果是用DNN的全连接方式,参数的数量是3072*4704=14M
那如果用CNN呢?每个过滤器25+1=26个参数,6个过滤器共156个参数(默认每个过滤器的各个通道拥有相同参数)
CNN可以使用更少的参数进行训练,就是因为参数共享,如果一个特征检测器(过滤器)可以检测某个部分垂直边缘,那么它也可以检测其他部分的垂直边缘。
- 参数共享
CNN可以使用更少的参数进行训练,就是因为参数共享,如果一个特征检测器(过滤器)可以检测某个部分垂直边缘,那么它也可以检测其他部分的垂直边缘。 - 稀疏连接
在每一层中,每个输出值仅仅依赖于一小部分输入。比如输出中的第一个元素0,仅和图像中36个元素的左上角9个相连接,与其他元素无关。
提到卷积神经网络的属性——善于捕捉平移不变性(将猫向右平移两个像素,猫依旧清晰)我们用同一个过滤器生成各层中的图像的所有像素值,网络通过自动学习变得更加健壮。
三、整合CNN神经网络
- 通过卷积层、池化层、全连接层搭建神经网络结构,最后通过Softmax回归输出预测值。
- 计算代价函数J。
- 通过梯度下降/动量梯度下降/RMSProp/Adam优化器对所有参数进行优化更新。