CNN:PyTorch中的卷积基础知识点整理
CNN
主要概念与操作
卷积
操作:卷积核按照既定的方式在输入矩阵上“移动”,每次移动后将卷积核与矩阵中对应位置的值相乘并求和作为输出,本质上相当于按照卷积核进行加权求和。一般在加权求和后会再进行一次非线性的激活。例如使用 ReLU 作为激活函数时:
作用:使用卷积核所表示的特定“特征提取规则”进行特征提取。
细节:卷积核一般作为可学习的参数。
池化
作用:通过预定的方法,减少输入矩阵的规模。
细节:相比于卷积操作,池化操作则是无参数的。
翻转
操作
将卷积核翻转沿次对角线翻转,如:
作用:使得矩阵操作满足结合律 ,在数字信号处理领域中使用较多,在深度学习中则一般不进行翻转操作。
Strided 步长
步长描述了卷积核每次水平或竖直方向移动的距离,最普通的情况下为 1 。
操作
对于步长 s,每次卷积核移动 s 的距离。如果某一次移动后有一部分卷积核落在矩阵外部,则放弃这次卷积操作进入下一行或者终止本次卷积。
Dilation 扩张
效果可参考 [2] 中的动画,在卷积核之间插入空白点,使得实际卷积的范围更大也更系数。
为了控制卷积后的矩阵大小,一般需要配合 padding 使用(如在NLP的场景中使用 1D CNN时,需要使用 padding 以保证操作前后句子的长度不变)。
相关描述 [1]
dilation
controls the spacing between the kernel points; also known as the à trous algorithm. It is harder to describe, but this link has a nice visualization of whatdilation
does.
Groups 分组
类似于 Multi Head Attention 中 Head 的概念,将 CNN 的参数额外分成若干组,独立地进行计算。
在 PyTorch 的实现中,对于 个通道(维度)、
个 group 的卷积核,每个 group 只处理
个通道的数据,因此也需要保证
能被
整除。
相关描述 [1]
groups
controls the connections between inputs and outputs.in_channels
andout_channels
must both be divisible bygroups
. For example,
- At groups=1, all inputs are convolved to all outputs.
- At groups=2, the operation becomes equivalent to having two conv layers side by side, each seeing half the input channels and producing half the output channels, and both subsequently concatenated.
- At groups=
in_channels
, each input channel is convolved with its own set of filters (of size).
Padding 填充
操作
对像素矩阵上下左右各填充 行/列向量,对于一个
的矩阵填充后的形状为
。
- valid convolution:不填充直接卷积
- same convolution:填充至卷积后与卷积前有着相同的矩阵大小
作用
- 避免每次卷积后,矩阵越来越小;
- 提高对边界像素的利用率。
感受野
当前位置/层输出的单个值与多少原输入的值相关。
如 输入[5,5] -> 卷积核[3,3] -> 池化[2,2] -> 输出[2,2]
,输出的矩阵中每一个元素都相关于输入中[4,4]
大小的元素,即感受野为[4,4]
。
在卷积以外的模型中,其计算思路也是类似的。
1X1 卷积
操作:对于 的矩阵,使用
的卷积核进行卷积,最终得到
(可当做
的二维矩阵) 的输出,相当于将每一个位置 C 个通道的特征输入到全连接层中。
意义:聚合每一个位置 C 个通道的特征。通过 个 1X1 卷积核的叠加,就能得到
的输出矩阵。通过改变通道数量,起到控制计算量的作用。
1D、2D、3D
1D CNN的卷积核为 的情况,一般用于处理
(Batch Size为
、长度为
、通道/特征数为
)的序列数据。
2D 的卷积核为 的情况,类似的用于处理
的数据。
3D同理。
对于不同维度的输入,除了 Batch Size 和通道数外,可将每个数据项的尺寸压缩至一个维度,如:
- 1D:
- 2D:
- 3D:
如此,则可以获得更加通用的 3 维卷积核写法:,对于不同维度尺寸的输入数据,可先将其压缩至1个维度中再进行卷积计算。为了进一步提取 Size,可将通道放置第2个维度得到
,这也类似 PyTorch 中卷积核参数的处理思路(Fold、Unfold)。
总结
CNN 中的卷积核为共享参数,一个数据样本中不同位置的数据可能会被相同的参数所处理,类似的还有 RNN ;
CNN 主要处理的对象是规则的特征向量,可以用于 CV、NLP(1维矩阵)等领域。
理拓扑结构的图数据是 CNN 无法处理的,因此基于卷积的思想针对图这一数据结构设计出了 GCN。在 PyTorch 中,卷积操作实际上是借助 Fold 和 UnFold 两个操作进行的:
nn.Unfold:Extracts sliding local blocks from a batched input tensor.
按照输入的通道数
以及卷积核的 kernel_size、dilation 等参数,将
的输入“展开”成为
的矩阵,其作用是让第二个维度与卷积核形状相等,便于与卷积核直接进行矩阵的乘法计算,避免窗口滑动操作。
其中,N 为 Batch Size,
为展开后的长度(卷积后向量中的元素数),
为和每一个位置的卷积核对应的数据区间(如 [2] 中的阴影部分,即卷积核窗口)。
nn.Fold:Combines an array of sliding local blocks into a large containing tensor.
Unfold 的逆操作,将
的向量“折叠”为
,即按照输出向量每个维度的size进行还原。
#算法工程师##CV算法##深度学习#References
从0开始的算法工程师,力求严谨、细节、全面。 除基础的模型和知识点外,会尽可能包含更多的应用方向,也是自己学习过程的记录。 抛瓦!(垃圾箱探头.jpg)