大家好,我是极智视界,本文来谈谈 多通道img2col的实现。
邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq
我在21年的时候写过一篇文章《【模型推理】一文看懂Img2Col卷积加速算法》,其中用手绘图 (画得比较丑陋) 详细解释了 直接卷积 和 img2col卷积加速算法的实现原理 (ps: 主要是数学原理,有兴趣的同学可以先去看看),其中主要说的输入图是灰度图,也就是单通道图,也就是c为1的图。写这篇主要是做一些延伸,详细解释一下多通道输入图的img2col加速的数学原理。
老生常谈,还是先说一下 img2col卷积加速是什么,img2col卷积加速算法是一种用于加速深度学习中卷积操作的技术,它通过将输入图像转换为一个2D矩阵,其中矩阵的每一列对应于卷积操作的一个感受野。这种转换允许卷积操作作为矩阵乘法来执行,可以使用优化的线性代数库进行高效计算。
下面开始。
首先需要抛个例子,输入图为 [1, 3, 4, 4],以 pytorch nchw 的 layout 来说,也即 n=1, c=3, h=4, w=4,c维也即通道维,为bgr,如下图:
img2col的卷积加速可以看成两个部分,首先是展平,然后是矩阵乘。对于矩阵乘来说,和灰度图的过程一致,反正最后给你展平成什么样了,你就直接乘就行。多通道img2col和单通道img2col的区别就在于怎么展平,对于单通道来说,因为c恒为1,如果不考虑n的话,其实是一个二维到二维的展平过程。而对于多通道来说,c不为1,如果不考虑n的话,其实是一个三维到二维的过程。那么三维到二维该怎么展呢。这其实又会涉及到数据排布,也就是layout,咱们这里默认是在pytorch里操作,所以数据排布按nchw来。那么展平后用图像的示意就是下面这样的。
对于nchw或者nhwc做展平操作的过程,可能很多同学会比较凌乱,其实抓住一个要点就是,比如对于nchw展平,先铺hw再铺c再铺n就行,同理适用于nhwc,就是从右往左看
还是拿n=1来说,其实展平后的特征图长这样:
然后回到img2col的卷积加速实现,就是拿卷积核去滑窗,先拿卷积核 [3, 3, 3, 1],步长为1,填充为0举例,它其实就是这么滑:
这里其实需要注意一点的是所谓的卷积核的维度的含义为 [核宽,核高,in_维度,out_维度],所以很明显就可以看出这里输入的 in_维度 为3 (跟输入的特征图对应),输出的 out_维度 为1,也就是咱们这个特征图经卷积后的c为1
下图很好的诠释了整个推理过程,得到最终的输出为 [1, 1, 2, 2]。
继续举个例子,如果卷积核为 [3, 3, 3, 3] 呢,那将会是这样的,最终输出为 [1, 3, 2, 2],通道为3,如下图展示。
好了,以上分享了 谈谈多通道img2col的实现。希望我的分享能对你的学习有一点帮助。