9

图解卷积运算的 im2col 算法

 2 years ago
source link: https://seanwangjs.github.io/2022/04/24/im2col.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

图解卷积运算的 im2col 算法

卷积运算是一种提取图像特征的重要算法,它通过把给定的卷积核应用到图像上,从而缩减图像尺寸,达到提取特征的目的。卷积核在图像上每移动一次就对其覆盖的区域进行一次运算,具体的算法其实就是对应元素相乘然后求和,如果把参与运算的两个小矩阵 flatten 成一维的向量,那么这就是一次点积运算,正是因为这样的性质,使得卷积运算可以转换成矩阵乘法,从而利用现成的高性能矩阵乘法库实现对卷积的加速。下图展示了典型的卷积运算过程

如果我们把图像按卷积运算顺序分解成独立的小矩阵块

然后把每个小矩阵块 flatten 成行向量,再叠在一起,得到如下图所示的大矩阵

这就是所谓 im2col 过程,或者说 image to column。若假设图像尺寸为 h×wh×w,卷积核尺寸为 kh×kwkh×kw,那么卷积核在图像上的每次停留,都会在大矩阵上添加一个 kwkhkwkh 的向量,不难发现,卷积核总共停留了 (h−kh+1)(w−kw+1)(h−kh+1)(w−kw+1) 次,所以图像转换成矩阵的尺寸为 ((h−kh+1)(w−kw+1))×kwkh((h−kh+1)(w−kw+1))×kwkh。

若此时我们再将卷积核 flatten 成列向量,那么令上述大矩阵与列向量相乘,就能得到同卷积一样的结果,只不过这时还是一维向量,将得到的列向量 reshape 成输出特征图大小即可。

以上,考虑的是单个卷积核作用于单个图像上的情况,而在卷积神经网络的卷积层中,两者都是多对多的关系。这里我们假设图像通道为 c,卷积核数量为 n,则卷积层的具体算法为:对于每一个卷积核,计算它与 c 个图像的卷积,得到 c 个输出矩阵,然后对这 c 个输出矩阵求和,这样 n 个卷积核将得到 n 个通道的输出矩阵。

现在,利用同样的方法,将每个通道的图像展开成矩阵,然后在列方向上拼接,如下图所示

对于卷积核来说,也展开成一维向量,不过此时它的长度为 K×KK×K,因此还需要重复 c 次才能与上述矩阵相乘。由于此时有多个卷积核,所以需要将它们在列方向上拼接成矩阵

如此,我们就实现了多通道图像的 im2col 转换过程

最后将结果 reshape 成输出张量的形状即可。

接下来,我们再考虑有 padding 和 stride 的情况,padding 是对图像进行扩充,stride 是卷积核在图像上移动的步长,它们共同决定了输出特征图的空间维度。令 padding 分别等于 ph,pwph,pw, stride 分别等于 sh,swsh,sw,我们来计算单通道图像转换成矩阵的尺寸,首先,padding 之后的图像大小变成了 (h+ph)×(w+pw)(h+ph)×(w+pw),而由于卷积核在竖直和水平方向上的移动步长为 sh,swsh,sw,那么卷积核在图像上停留的次数为 h+ph−kh+1sh×w+pw−k+1swh+ph−kh+1sh×w+pw−k+1sw,当然这是建立在 s 可以被整除的情况下,否则需要向下取整。

本文遵守 CC-BY-NC-4.0 许可协议。

欢迎转载,转载需注明出处,且禁止用于商业目的。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK