在上一篇中,使用了全连接网络进行手写数字识别的分类。

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积


准确率为97%

本次,将采用卷积神经网络的方法,提升准确率。

目录

1、什么是卷积?

与数学上卷积的概念略有不同,在数学上,卷积的含义是将一个函数先进行y轴翻转,之后对应点相乘累加,在神经网路中,由于卷积核的参数是自己定义的,因此若要进行翻转,相当于修改卷积核的数值。因此,不需要再单独进行翻转,直接对应点相乘之后累加。具体过程如下图所示:

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_池化_02

2、对RGB图像进行卷积

对一副图像而言,存在RGB三个通道,因此需要三个卷积核,每个卷积核分别对每个通道做卷积,最后把三个通道的卷积结果相加,形成一个矩阵。

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积_03


pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积核_04

3、对N个通道的图像进行卷积

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积_05


由于卷积核是对每个通道的图像进行卷积运算,因此n个通道必须对应n个卷积核,最后将卷积结果相加到一个通道,所以输出通道数为1。

如果想要输出通道数为m,自然需要m个卷积核。

(输出通道数=卷积核个数)

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积_06


pytorch学习笔记(九):卷积神经网络CNN(基础篇)_池化_07


把所有卷积放在一起形成卷积层,那卷积层就是四维张量,即mnkernel_size(width)*kernel_size(height)程序语言:

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_池化_08


输入为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
5
5的卷积核,要使图像大小不变,需要增加2圈的padding

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积核_09


程序实现:

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_池化_10


注:倒数三四行为卷积核的赋值

5、步长(stride)的概念

在默认不设定步长参数时,步长默认为1,即卷积核滑动时每次都滑动一个单位。

若设置2,即每次滑动2个单位,输出图像将更小。

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积_11


在程序中,添加stride参数即可

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积_12

6、池化(Pooling)的概念

池化也叫下采样(这里看到有人说这两个概念不完全等价,不过作为初学者,暂且将其理解为同一个事物)

下采样的“下”即让图像维度向下(变小)

池化有两种:一个是取平均值,一个是取最大值,一般都取最大值。

池化的作用可以简单理解为进一步提取特征而降维。

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积核_13


程序实现:

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_池化_14

7、卷积神经网络工作流程

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_池化_15


细节解释:

1、第一步使用了55的卷积核,因此图像缩小5/22=4个像素,即从28->24

2、第二步使用22的池化层,总体缩小一半,即从24->12
3、第三步同样使用5
5的卷积核,图像从12->8

4、第四步池化后8->4

5、全部输入全连接层,输入个数=2044=320,要分成10类,因此输出为10程序语言:

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积核_16


注:之前最后一层的输入320是通过手动计算出来的,在程序中,改成-1,计算机会自动帮我们计算这个数值。

8、GPU的使用

如果电脑有英伟达的GPU且安装了CUDA,则可以用GPU加快训练速度。

调用语言:

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积核_17


其中cuda:0代表使用机器上第一个GPU

同样,训练和测试时,也需要将数据抛入GPU内:

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_池化_18


pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积核_19

9、训练结果分析

pytorch学习笔记(九):卷积神经网络CNN(基础篇)_卷积核_20


最终,训练的准确率从97%提升到了98%,看似只提升了一点点,但是从错误率角度出发,错误率从3%降到了2%,因此总体性能提升了1/3!

(邪魅一笑)