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 what dilation does.

Groups 分组

类似于 Multi Head Attention 中 Head 的概念,将 CNN 的参数额外分成若干组,独立地进行计算。

在 PyTorch 的实现中,对于 个通道(维度)、 个 group 的卷积核,每个 group 只处理 个通道的数据,因此也需要保证 能被 整除。

相关描述 [1]

groups controls the connections between inputs and outputs. in_channels and out_channels must both be divisible by groups. 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进行还原。

References

  1. torch.nn.Conv2d
  2. 卷积动画 (github: conv_arithmetic)
#算法工程师##CV算法##深度学习#
从0开始的算法工程师 文章被收录于专栏

从0开始的算法工程师,力求严谨、细节、全面。 除基础的模型和知识点外,会尽可能包含更多的应用方向,也是自己学习过程的记录。 抛瓦!(垃圾箱探头.jpg)

全部评论
学到了感谢分享啊
点赞 回复 分享
发布于 2022-10-02 20:32 山西

相关推荐

ResourceUtilization:算法很难了,现在都需要相关论文还有对应的实习,可以先试试中厂
点赞 评论 收藏
分享
评论
2
21
分享

创作者周榜

更多
牛客网
牛客企业服务