在上一篇中,使用了全连接网络进行手写数字识别的分类。
准确率为97% 本次,将采用卷积神经网络的方法,提升准确率。
目录- 1、什么是卷积?
- 2、对RGB图像进行卷积
- 3、对N个通道的图像进行卷积
- 4、padding的引入
- 5、步长(stride)的概念
- 6、池化(Pooling)的概念
- 7、卷积神经网络工作流程
- 8、GPU的使用
- 9、训练结果分析
1、什么是卷积?
与数学上卷积的概念略有不同,在数学上,卷积的含义是将一个函数先进行y轴翻转,之后对应点相乘累加,在神经网路中,由于卷积核的参数是自己定义的,因此若要进行翻转,相当于修改卷积核的数值。因此,不需要再单独进行翻转,直接对应点相乘之后累加。具体过程如下图所示:
2、对RGB图像进行卷积
对一副图像而言,存在RGB三个通道,因此需要三个卷积核,每个卷积核分别对每个通道做卷积,最后把三个通道的卷积结果相加,形成一个矩阵。
3、对N个通道的图像进行卷积
由于卷积核是对每个通道的图像进行卷积运算,因此n个通道必须对应n个卷积核,最后将卷积结果相加到一个通道,所以输出通道数为1。 如果想要输出通道数为m,自然需要m个卷积核。 (输出通道数=卷积核个数)
把所有卷积放在一起形成卷积层,那卷积层就是四维张量,即mnkernel_size(width)*kernel_size(height)
程序语言:
输入为1批量(batch_size)5通道,100*100的图像 输出为1批量,10通道,98*98的图像 卷积层为10个,5通道,3*3大小 由于卷积是滑动式的,中心点移动了98个单位(即100-2),3*3的卷积核大小,边缘需要减去两格,因此输出是98*98的图像大小。
4、padding的引入
要使输出图像大小不变,则需要padding。 padding即在原图周边加上一圈,加上多上可由下面的公式确定 增加的圈数=卷积核大小/2(注意:这里是整除) 比如,33的卷积核,要使图像大小不变,需要增加1圈的padding 55的卷积核,要使图像大小不变,需要增加2圈的padding
程序实现:
注:倒数三四行为卷积核的赋值
5、步长(stride)的概念
在默认不设定步长参数时,步长默认为1,即卷积核滑动时每次都滑动一个单位。 若设置2,即每次滑动2个单位,输出图像将更小。
在程序中,添加stride参数即可
6、池化(Pooling)的概念
池化也叫下采样(这里看到有人说这两个概念不完全等价,不过作为初学者,暂且将其理解为同一个事物) 下采样的“下”即让图像维度向下(变小) 池化有两种:一个是取平均值,一个是取最大值,一般都取最大值。 池化的作用可以简单理解为进一步提取特征而降维。
程序实现:
7、卷积神经网络工作流程
细节解释: 1、第一步使用了55的卷积核,因此图像缩小5/22=4个像素,即从28->24 2、第二步使用22的池化层,总体缩小一半,即从24->12 3、第三步同样使用55的卷积核,图像从12->8 4、第四步池化后8->4 5、全部输入全连接层,输入个数=2044=320,要分成10类,因此输出为10
程序语言:
注:之前最后一层的输入320是通过手动计算出来的,在程序中,改成-1,计算机会自动帮我们计算这个数值。
8、GPU的使用
如果电脑有英伟达的GPU且安装了CUDA,则可以用GPU加快训练速度。 调用语言:
其中cuda:0代表使用机器上第一个GPU 同样,训练和测试时,也需要将数据抛入GPU内:
9、训练结果分析
最终,训练的准确率从97%提升到了98%,看似只提升了一点点,但是从错误率角度出发,错误率从3%降到了2%,因此总体性能提升了1/3! (邪魅一笑)