CNN中卷积运算转化成矩阵乘法的实现——img2col+GEMM大矩阵乘法

img2col:将特征图image(3D)根据卷积核的尺寸按原图对应位置展开成行col(2D)。

当卷积步长小于核边长时,img2col会造成特征图像素的重叠复制增加内存,但是依然是更有效率的。

 

核矩阵:将每个卷积核展成一列,即核矩阵的高为k*k*C_{k}C_{k}为每个卷积核的通道数),宽为Num_{kernl}

特征图矩阵:image2col的关键就是根据卷积步长卷积核的尺寸将featuremap(3D)按原图的位置依次转化成 由多个宽为k*k*C_{k}的行向量(col),这些col拼成了特征图矩阵。

 

以下为乱写了。。。。。。

假设原图为H1*W1*C,卷积核为k*k*C*Fn(Fn为卷积核数目)

H*W个行向量(行向量维度为k*k*C),image矩阵维度为(H*W)*(k*k*C),然后将每个卷积核也展开成k*k*C的列向量,因此核矩阵的维度为(k*k*C)*Fn

矩阵乘法后即为(H*W)*Fn,H*W为卷积后输出特征图的尺寸,Fn就是特征图的输出通道数。

  •  
  • 无论是pytorch还是tensorflow其都是接收一个batch的数据进行处理,因此其卷积运算的矩阵乘法实现也是一个batch一次运算的。而把输入图片input转换成矩阵的过程就是img2col。
  • 首先将filter展开为(filter_h * filter_w * in_channnel, out_channel)大小的2D矩阵
  • 如果按数学上的运算,则卷积读取内存是不连续的,会增加时间成本。因此才有了img2col,矩阵在内存中是一个连续的内存块。在matlab中img2col是将img每次卷积运算对应的patch展开成列向量。而在caffe中是将每个patch转换成行,本质上没区别。以下为tensorflow中的过程,类似matlab。

posted @   Parallax  阅读(4508)  评论(2编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示