深度学习之卷积操作中的img2col-理论篇

卷积运算

众所周知,在深度学习(这里主要指计算机视觉)中,卷积操作是一个重要的操作,卷积操作的对象通常是一个3D Matrix,形如[height, width, channels],卷积操作中对应的单个卷积核形状为[k, k, channels],如下图所示:
深度学习之卷积操作中的img2col-理论篇
该卷积核在输入数据上,从左到右,从上到下,以一定的步长(stride)进行滑动,每滑动到一个位置便计算对应的输出值,卷积运算的可视化过程如下所示:
深度学习之卷积操作中的img2col-理论篇
上图中,蓝色部分表示输入数据,淡红色的区域表示卷积核所处的区域,绿色部分是卷积运算后的输出数据。

img2col

img2col理论上就是将一个3D Matrix的输入数据变成2D Matrix,即[height, width, in_channels] --> [height * width, k * k * in_channels], 如下图所示。(这里假设了输入输出height和width相同,如果不相同,则输出应变为out_height和out_width)
深度学习之卷积操作中的img2col-理论篇
从上图可以看到,img2col的输出上,行数是卷积核在输入数据上的移动次数,也就是out_heigth * out_width,列数就是一个卷积核的元素个数。经过上述变换,相当于把原始的输入数据展开成了2D Matrix。
另外需要注意: 该操作并不是reshape!!! 当卷积核移动步长较小时,每个卷积核的区域是有重叠的。因此通常情况下输出的2D Matrix的元素个数要大于输入的3D Matrix。

再对输入输入进行img2col后,我们下一步对卷积核进行变换。将一个维度为[k, k, in_channels]的卷积核变为[1, k * k * in_channels],即将卷积核拉成1D Matrix(或者说是一维向量,统一用Matrix表示了)

上述两步操作完后,卷积操作就变成了如下如所示的矩阵乘法:
深度学习之卷积操作中的img2col-理论篇
上面就是整个卷积流程。
另外刚才说过,对输入数据进行变换后,通常得到的2D Matrix元素要比原数据更多,那这么做的好处是什么?
简而言之就是:矩阵乘法有加速方法和内存访问方式,上述两点带来的收益要大于消耗的存储量。

参考:

https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/