[网络层]啥是卷积

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[网络层]啥是卷积相关的知识,希望对你有一定的参考价值。

参考技术A 参考资料:

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:

例子:

卷积神经网络简介

相比于MLP(多层感知器)的神经网络,CNN(卷积神经网络)有卷积层和池化层。

 

在构建MNIST字符集的识别训练过程中,卷积神经网络采用了:

输入层 卷积层1 池化层1 卷积层2 池化层2 平坦层 隐层层 输出层

输入层输入二维的图像,28X28的一个矩阵。

在卷积层1,将输入层的一个矩阵图像,采用16个filter weight产生的随机5X5的零一矩阵和输入层的28X28的矩阵相乘加,变成16个28X28的矩阵图像。类似滤镜,用于提取输入图像的特征,如边缘,线条和角。

在层化层1,将卷积层1输出的16个矩阵图像,进行Max-Pool缩减采样,每4个单元选出最大值进行缩减,变成14X14的矩阵图像,共16个。缩减采样可以减少所需处理的数据点,让图像位置差异变小,参数的数量和计算量下降。

在卷积层2,将池化层1输入的16个14X14矩阵图像采用36个filger weight5X5,进行乘加,产生36个14X14的图像。

在池化层2,将卷积层2产生的36个矩阵图像,进行Max-Pool缩减采样,每4个单元选出最大值进行缩减,变成7X7的矩阵图像,共36个。

在平坦层,作为神经网络的输入部分,36X7X7=1764个神经元。

隐层128个神经元,输出层10个。其他类似MPL网络。

 

以上是关于[网络层]啥是卷积的主要内容,如果未能解决你的问题,请参考以下文章

卷积层在神经网络中如何运算?

无线传感器网络原理及方法 啥是分层设计,啥是跨层设计

卷积神经网络的卷积层如何提取特征?

卷积神经网络 LeNet-5各层参数详解

卷积神经网络二维卷积层(conv-layer)

卷积神经网络的 卷积层、激活层、池化层、全连接层