卷积层的基本操作

158 阅读3分钟

最近将以前所学的卷积方面知识复习一下

卷积层 Convolution Layers 是为了提取图像特征

我对于卷积的学习,是从B站上一个up主学习的([土堆说卷积操作(可选看)_哔哩哔哩_bilibili] (www.bilibili.com/video/BV1hE…

在pytorch的官方文档上,可以看到卷积的参数如下 image.png 就是一个输入通道数,一个输出通道数,

一个kernel_size(卷积核尺寸,也可以说是权重weight),int=3,就是3×3的矩阵;

stride步幅,就是卷积核在图像上移动的距离,默认是1;

pandding就是在输入图像上四边填充的像素数,主要是为了stride移动时,输入图像像素不够的情况下的填充,默认值是0,

dilation是控制卷积核元素之间的距离,默认值是1(空洞卷积);

image.png bias,偏置,一般不加,后面加了BN层,就不用加了,因为BN层会抵消bias;

ceil—mode,true是ceil模式,false是flood模式,就是向上取整或者向下取整;

image.png 卷积核的数值分别与图像上的像素值相乘,就是输出值

image.png 卷积层会根据公式计算不同参数值下输入、输出图像的值

例如,3@32×32->32@32×32,宽高不变,通道变成32, 假如使用一个5×5的卷积核,

微信图片_20240407111104.jpg 所以采用(3,32,5,1,2)会宽高不变 image.png

假如要用一个7×7的卷积核,把3@600×600变成64@300×300

微信图片_20240407112217.jpg

这里为什么会说padding太大了呢?

因为0<=pading<=(kernrl_size)/2,padding不大于卷积核的一半

而stride取2,padding取3的时候,结果不是整数,为什么还能变成整数呢?

因为卷积层和池化层不一样,卷积是向下取整,池化是向上取整

当stride=2,padding=3时,结果是299.5,向下取整变成299,就符合了

所以采用(7,2,3)会宽高减少一半;

image.png

再例如,宽高从416->208,k=3时怎么办? (416+2p-1*(3-1)-1)/s+1=208

if s=1,(413+2p)/1=207,p不能小于0;

if s=2,(413+2p)/2=207,p=1,415/2=207.5,向下取整=207;

所以采用(3,2,1)会宽高减少一半;

至此,知道了(C_in,C_out,5,1,2)会保证宽高不变,只调整通道数;

(C_in,C_out,7,2,3)会宽高减少一半;

(C_in,C_out,3,2,1)会宽高减少一半;

而使用1×1的卷积,也可以保证宽高不变,只调整通道数;

(C_in,C_out,1),其实是(C_in,C_out,1,1,0)保证宽高不变,只调整通道数;

深度学习训练过程,其实就是对kernrl_size不断调整的过程。

以上就是我关于卷积的学习笔记,如果有不对的地方,可以找我交流。