一.卷积层的定义和计算
1.卷积层的定义
卷积层 = 感受野 + 权值共享
每一个感受野( receptive field) 内会有多个filter,而每个filter的参数设置都不一样(一般随机初始化后,由神经网络自主学习得到)。每个filter负责侦测该感受野内出现的某种特征(pattern),而同样的特征可能会在图像的其他位置重复出现,因而同一张图片的不同区域需要同样的一组filter来侦测,即权值共享(Parameter Sharing),以实现filter的高效复用及参数量的缩减。
2.卷积层的计算
假设输入的图像是(3,6,6),即channel = 3, H x W = 6 x 6的彩色图片,我们用一组,共64个(3,3,3)的filter,即channel = 3,kernel size = 3 x 3 ,padding = 0的卷积核,来进行卷积操作的话,输出的特征图(feature map )的形状该由下面的公式进行确定。
其中,Hi、Hk分别表示输入图像的高和卷积核的高(把高换成宽公式不变),S为步长(stride),P表示Padding(如果有)。根据上面的例子,代入公式计算如下:
这里故意取了除不尽的数,因为很多博客都只是举了能除尽的整数解的情况,而往往实际遇到的很多都不是整数,看了下pytorch的源码,其中关于这部分的处理采用的是向下(左)取整,即2.5→2,其它框架应该也类似。因为总共有64个不同的卷积核,所以经过卷积后的输出为(64,2,2)。
另外,还有一点需要注意的是,想必大家都知道卷积运算实际上就是把卷积核和图像某一区域(感受野)做矩阵点积运算(elementwise product 对应元素相乘再相加),但你是否知道每个卷积核的通道数需要和输入图像的通道数相匹配。这里其实有个容易被忽略但又十分重要的点是,每个卷积核对于图像的某一区域的卷积运算是在该图像的深度方向上同时进行的,也就是说上面的例子中,三通道的彩色图像的某一区域和卷积核做卷积运算时,是三通道的图像信息同时和一个三通道卷积核做点积,然后再把三通道的卷积结果相加得到一个卷积核的运算结果,总共有64个卷积核,所以输出结果的通道数是64,即卷积层的输出结果的通道数只取决于卷积核的数量,与输入图像的通道数无关。
(注:同一个卷积核的三个通道上的参数设置往往也是不同的。)
二.池化层
关于池化层,大家都知道它是用来实现降维,缩减参数量的。但有一点大家可能会忽略的是,池化层和卷积层的一大不同之处在于池化层没有参数需要学习,并且池化层也不改变输入图像(卷积层得到的特征图也可以看成某种意义上的图像)的通道数,所以在定义通道数的时候是省略通道数,只有大小(kernel size)和步长(stride)的定义,所以在pytorch等框架的实现中也是直接将池化层作用在输入图像的每一个通道上从而得到相同通道数的输出。池化层的输出图像大小计算公式与卷积层相同。
参考
(强推)李宏毅2021春机器学习课程_哔哩哔哩_bilibili
如何理解卷积神经网络中的通道(channel)_Medlen-CSDN博客_卷积神经网络通道