[网络层]什么是卷积

参考资料:

CNN中常用的四种卷积详解

1、什么是卷积

卷积是在特征图上进行滑动的矩阵,它的参数是可学习的,然后计算矩阵跟被滑动到的区域内的像素点进行内积计算,再求和。这种操作可以使得卷积学习到局部特征,并且每个被滑动到的区域之间都共享了权重。共享权重操作使得卷积相比全连接网络节省了大量的参数。


2、为什么要引入卷积

① 卷积可以通过共享权重来减少大量的参数量。例如使用全连接层会导致参数量太多,假如输入的图片尺寸大小为 1000*1000*3,即 3 百万个像素点,假如全连接层有 1000 个节点,则总共有 30 亿 1000 个参数。但是换成使用卷积核组数为 100 的 5*5 的卷积,则仅需 5*5*3*100 + 100,即 7600 个参数

② 图片中存在重复的特征,卷积可以通过共享权重的方式更高效率地将这些特征学习出来

③ 图片固有的空间特征,如果使用全连接层或 RNN 来学习,则会破坏图片的空间特征,而卷积则可以不破坏图片的空间特征


3、卷积的计算过程

① 对于有多组的卷积组,每次使用一组卷积组去计算

② 每组卷积组内有输入通道数个卷积核,每个卷积核是参数可学习的二维矩阵

③使用一组内的卷积核同时在输入的每个通道上,分别按指定步长从左到右,从上到下在通道上进行滑动,然后计算二维矩阵跟被滑动到的区域的值进行内积计算,然后再求和。然后将所有通道上求得的值再求和,再加上偏置项。如此即可得到一个二维的输出矩阵,作为输出的一个通道。

④ 逐次使用每组卷积组,按 ③ 中的过程去进行计算,即可得到一个三维的输出矩阵,通道数等于卷积组数。


4、卷积的优点

① 通过共享权重来减少参数量

② 可以学习局部特征,更符合应用于图片

③ 具有平移不变性,因为卷积通过共享权重和滑动处理,所以即使特征不在同一个位置,也可以被卷积核学习到


5、卷积的缺点

① 学习到的特征受到感受野的影响太大,需要人工设置卷积核的大小

② 对序列输入的提取效果不够好


6、卷积的变种

① 空洞卷积(扩张卷积、膨胀卷积):指的是在正常的卷积核的点之间插入空洞 ,以此在不增加计算量来增大卷积核的感受野。


优点:

a、在不丢失分辨率的情况下增大感受野,对于检测大物体效果更好

b、调整扩张率(卷积点之间的空洞个数)获得多尺度信息

缺点:

a、对于检测小物体效果不好


② 转置卷积(反卷积、逆卷积):转置卷积是相对于卷积的相反操作,例如 3*3 卷积得到的结果是 1 个值,而转置操作则是将 1 个值变成 3*3 的大小。不过转置卷积并不能够恢复被卷积前的值,因为卷积是不可逆操作,只能够恢复尺寸。


优点:

a、可以将小尺寸的特征变成大尺寸的特征,实现类似上采样的效果,可以应用于 CNN 可视化、FCN 全卷积网络、GAN 等

缺点:

只能恢复尺寸,不能恢复数值


空间可分离卷积:将一个卷积核分离成两个更小的卷积核,节省参数量

深度可分离卷积:将在每个通道上使用卷积,再将所有的通道卷积结果相加,再使用每组卷积去重复上述过程的步骤拆分成两个步骤。

(1)只改变特征图的大小,但是不改变特征图的通道数。在每个通道上使用卷积,但是不将所有的通道卷积结果相加,而是保持原样。例如输入的是 256 通道,则卷积后的通道数仍然还是跟输入通道数 256 相等。而原本的卷积输出通道数跟组数相等。

(2)只改变特征图的通道数,但不改变特征图的大小。在 (1)的基础上再使用 输出通道数*1*1*通道数 进行卷积

深度可分离卷积本质上是卷积核组之间共享了第一阶段卷积核的参数


7、卷积后的特征尺寸计算公式

假设 n 为输入的特征尺寸, f 为卷积核的大小,p 为 padding 的大小,s 为卷积核移动的步长


8、1*1、3*3、5*5、7*7 的卷积核大小的作用和优缺点,以及相互之间的比较

作用:

① 1*1 的作用可以用来进行通道数变换,以及在部分情况下替代全连接的作用

② 3*3 的作用是使用小核来替代大核,从而实现减少参数量的作用

③ 5*5 的作用是通过使用较大的卷积核,来达到使卷积核有更大的感受野的作用。也可以被用在图像金字塔中。

④ 7*7 的作用也是通过使用较大的卷积核,来达到使卷积核有更大的感受野的作用。也可以被用在图像金字塔中。

优点:

① 1*1 跟其他的卷积核可以实现深度可分离卷积来进一步减少参数量

② 5*5 跟 7*7 有更大的感受野


9、卷积核的参数量计算

假设卷积核的大小为 k,输入通道数为 in_n,输出通道数为 out_n,则卷积核的参数量为:

out_n*in_n*k*k + out_n

实例:

k = 3

in_n = 4

out_n = 5

conv2d = nn.Conv2d(in_n, out_n, k)

print(conv2d.weight.shape)

print(conv2d.bias.shape)

输出:

torch.Size([5, 4, 3, 3])

torch.Size([5])

故参数总量为:5*4*3*3 + 5


10、pytorch 中的 Conv2d 函数的作用和参数详解

参考资料:

PyTorch学习笔记(9)——nn.Conv2d和其中的padding策略

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

函数作用:对由多个平面组成的输入进行二维卷积。

输入:维度 [B, C_in, H, W]

输出:维度 [B, C_out, H_out, W_out]

参数详解

in_channels(int):输入通道数

out_channels(int):输出通道数

kernel_size([int, tuple(int, int)]):卷积核大小,当输入为 3 时,则卷积核的大小为 [3, 3],当输入为 (3, 4) 时,则卷积核的大小为 [3, 4] ,即第一个数值代表卷积核的高,第二个数值代表卷积核的宽。

如果考虑 dilation 参数,则实际的卷积核感受野大小为:(dilation - 1) * (kernel_size - 1) + kernel_size,即当 dilation=2 时,3*3 的卷积核的实际感受野为 5*5

stride([int, tuple], 可选)=1: 卷积核的移动步长

padding([int, tuple(int, int)], 可选)=0: 填充的长度,当输入为 0 时,则不进行填充。当输入为 1 时,则输入的每一条边都填充 1 层 0 值,即上下左右各填充 1 层 0 值。如果输入为 (1, 2) 时,则表示上下各填充 1 层 0 值,而左右则各填充 2 层 0 值。但是不能输入 (1, 2, 3, 4) 四个元素的 tuple

dilation(int)=1:卷积核元素之间的间距。当输入为 2 时,卷积核元素之间的空洞个数为 1。

groups=1:

bias=True:

例子:

你可能感兴趣的:([网络层]什么是卷积)