CNN中卷积运算转化成矩阵乘法的实现——img2col+GEMM大矩阵乘法
img2col:将特征图image(3D)根据卷积核的尺寸按原图对应位置展开成行col(2D)。
当卷积步长小于核边长时,img2col会造成特征图像素的重叠复制增加内存,但是依然是更有效率的。
核矩阵:将每个卷积核展成一列,即核矩阵的高为k*k*(
为每个卷积核的通道数),宽为
特征图矩阵:image2col的关键就是根据卷积步长和卷积核的尺寸将featuremap(3D)按原图的位置依次转化成 由多个宽为k*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。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步