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

2022-06-14 10:43:05 浏览数 (1)

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

准确率为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! (邪魅一笑)

0 人点赞