卷积神经网络中的stride、padding和channel概念

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络中的stride、padding和channel概念相关的知识,希望对你有一定的参考价值。

参考技术A

如图,对6x6的原图像使用3x3的卷积核进行卷积操作后得到的图像是一个4x4的图像(6-3+1=4),也就是说每次进行卷积后, 原始图像都会变小失真,所以没有办法设计层数足够多的深度神经网络 ,除此之外还有另一个重要的原因是,原始图像中的边缘像素永远都不会位于卷积核的中心,只有原始图像的4x4的像素会位于中心, 这样会使得边缘像素对网络的影响小于位于中心点的像素的影响 ,不利于抽取特征。

所以为了解决这个问题,一般堆在原始图像的周围填充一圈像素,如图:

一般的图像都是三通道的,分别为R、G、B,所以卷积核也应该为三个通道,通过卷积核作用后生成的图像也会有三个,如图:

得到三个图像后,然后把这三个图像通过矩阵相加的计算最后得到一个“合成”图像,如图:

最后,将这个图像与一个偏置项(bias)相加后就会得到一个最终的结果,偏置项不影响结果的矩阵形状只影响矩阵的值,如图:

总结一下
如果对于一个三通道即:32x32x3的图像,使用 一个 :5x5x3的卷积核,最终会得到 一个 28x28x1 的特征图,如图:

如果使用 两个 :5x5x3的卷积核,最终会得到 两个 :28x28x1的特征图,即: 28x28x2 ,如图:

如果使用 六个 :5x5x3的卷积核,最终会得到 六个 :28x28x1的特征图,即: 28x28x6 ,如图:

卷积层的算力评估(MACC和FOPS)

以比较简单的lenet网络模型为例,我们尝试推导主要算子的算力计算公式,并看一下它的各层理论算力要求。

lenet网络结构

以第二层为例,他的输入尺寸是1*28*28*1的一张feature map,卷积核为 5*5*1,stride_h和stride_w均为1, pad_h,pad_w均为0,说明不做padding,输出feature map会缩小。

卷积层的算力评估方法

卷积模型,典型的卷积层计算如下图所示:

如果输入特征图的宽高分别是,输出特征图的宽高分别是,上下左右填充分别为,水平和垂直方向上的卷积步长为,卷集核宽高分别为,则输出特征图的尺寸计算公式如下:

 根据此公式,可以计算得到:

所以,输出feature map的尺寸是24*24。

卷积算力计算

每做一次卷积,生成一个右图中的黄色方块,假设卷积核个数为M,通道数为C,所以卷积总的浮点计算量如下:

 所以,带入数据得到:

之所以乘以2是因为每次卷积都要分成乘法和加法两次运算,也就是总共需要576000次的浮点数运算。

实际测量

前面我们已经计算出lenet第二层卷积层的理论浮点计算量为28800.pegasus有分析工具也可以对模型进行算力分析,我们用分析工具来验证一下,上面的计算是否正确:

测试命令为:

pegasus measure --model lenet.json

输出结果如下图所示:

最后输出总的结果为:

sum_macc:2.29M sum_param:420.41K sum_activation:20.51K

同时生成了analysis.json文件,里面列出了各层的算力需求清单,我们直接看第二层conv层面的分析数据,注意看第40行,macc值为:288000,和理论值差着一个因子2,原因何在?

这里直接计算macc表示MAC而不是FOPS了,如果计算FOPS,需要乘以2,计算MACC,就不需要了,应该是这样的吧。

这样就和工具分析一致了。

param个数计算:

卷积层中,参数完全有卷积核提供,所以参数个数为 5*5*20=500个,实际上,由于每个卷积核通道对应一个偏置,准确的数量应该是500+20=520个。

而激活函数的数量为24*24*20=11520


结束!

以上是关于卷积神经网络中的stride、padding和channel概念的主要内容,如果未能解决你的问题,请参考以下文章

卷积神经网络填充和步幅(padding-and-strides)

深度学习:《PyTorch入门到项目实战》卷积神经网络:填充(padding)和步幅(stride)

卷积层里的填充Padding和步幅Stride 动手学深度学习v2 pytorch

卷积神经网络学习

神经网络中的卷积

卷积层的算力评估(MACC和FOPS)