卷积计算的底层实现(Caffe)
阅读原文时间:2021年04月26日阅读:1

卷积本身的执行过程是通过在特征图上滑动卷积核来完成的。但是在Caffe的底层实现是通过矩阵相乘的方式一步完成卷积的操作。

假设输入图像及卷积和大小如下图所示:

在Caffe的实现中,它分别将特征图和卷积转换为矩阵。具体的转换如下:

卷积核


对于2D卷积,本身是四维的卷积核,将其转换为二维由 C o u t × C × K × K C_{out}\times C \times K \times K Cout​×C×K×K变为 C o u t × M C_{out} \times M Cout​×M,其中 M = C × K × K M=C \times K \times K M=C×K×K
举个例子,例如卷积核的维度是 2 × 3 × 2 × 2 2 \times 3 \times 2 \times 2 2×3×2×2,分别为
f i l t e r # 1 [ 1 1 2 2 ] [ 1 1 1 1 ] [ 0 1 1 0 ] f i l t e r # 2 [ 1 0 0 1 ] [ 2 1 2 1 ] [ 1 2 2 0 ] filter \#1 \\ \left[ \begin{matrix} 1 & 1 \\ 2 & 2 \\ \end{matrix} \right] \left[ \begin{matrix} 1 & 1 \\ 1 & 1 \\ \end{matrix} \right] \left[ \begin{matrix} 0 & 1 \\ 1 & 0 \\ \end{matrix} \right] \\ filter \#2 \\ \left[ \begin{matrix} 1 & 0 \\ 0 & 1 \\ \end{matrix} \right] \left[ \begin{matrix} 2 & 1 \\ 2 & 1 \\ \end{matrix} \right] \left[ \begin{matrix} 1 & 2 \\ 2 & 0 \\ \end{matrix} \right] filter#1[12​12​][11​11​][01​10​]filter#2[10​01​][22​11​][12​20​]
最终转换为
[ 1 1 2 2 1 1 1 1 0 1 1 0 1 0 0 1 2 1 2 1 1 2 2 0 ] \left[ \begin{matrix} 1 & 1 & 2 & 2 & 1 & 1 & 1 & 1 & 0 & 1 & 1 & 0 \\ 1 & 0 & 0 & 1 & 2 & 1 & 2 & 1 & 1 & 2 & 2 & 0 \\ \end{matrix} \right] [11​10​20​21​12​11​12​11​01​12​12​00​]

特征图


对于输入为 C × H × W C \times H \times W C×H×W的特征图,将其转换为 ( H ′ × W ′ ) × ( C × K × K ) (H' \times W') \times (C\times K \times K) (H′×W′)×(C×K×K)的矩阵。其中 H ′ H' H′和 W ’ W’ W’为输出特征图的长和宽。和kernel的变换不同,feature map不是单纯将矩阵resize一下就行,而是要根据卷积核和特征图的作用过程从输入特征中选择相应的值。
例如,假设输入的特征图的大小为 3 × 3 × 3 3 \times 3 \times 3 3×3×3,特征图为
[ 1 2 0 1 1 3 0 2 2 ] [ 0 2 1 0 3 2 1 1 0 ] [ 1 2 1 0 1 3 3 3 2 ] \left[ \begin{matrix} 1 & 2 & 0 \\ 1 & 1 & 3 \\ 0 & 2 & 2 \\ \end{matrix} \right] \left[ \begin{matrix} 0 & 2 & 1 \\ 0 & 3 & 2 \\ 1 & 1 & 0 \\ \end{matrix} \right] \left[ \begin{matrix} 1 & 2 & 1 \\ 0 & 1 & 3 \\ 3 & 3 & 2 \\ \end{matrix} \right] ⎣⎡​110​212​032​⎦⎤​⎣⎡​001​231​120​⎦⎤​⎣⎡​103​213​132​⎦⎤​
采用 2 × 2 2 \times 2 2×2卷积核,stride为 1 1 1,padding为 0 0 0。
[ 1 2 1 1 0 2 0 3 1 2 0 1 2 0 1 3 2 1 3 2 2 1 1 3 1 1 0 2 0 3 1 1 0 1 3 3 1 3 2 2 3 2 1 0 1 3 3 2 ] \left[ \begin{matrix} 1 & 2 & 1 & 1 & 0 & 2 & 0 & 3 & 1 & 2 & 0 & 1 \\ 2 & 0 & 1 & 3 & 2 & 1 & 3 & 2 & 2 & 1 & 1 & 3 \\ 1 & 1 & 0 & 2 & 0 & 3 & 1 & 1 & 0 & 1 & 3 & 3 \\ 1 & 3 & 2 & 2 & 3 & 2 & 1 & 0 & 1 & 3 & 3 & 2 \\ \end{matrix} \right] ⎣⎢⎢⎡​1211​2013​1102​1322​0203​2132​0311​3210​1201​2113​0133​1332​⎦⎥⎥⎤​

这样,最终的计算结果就变成了 F × C T = ( ( H ′ × W ′ ) × ( C × K × K ) ) × ( C o u t × ( C × K × K ) ) T = ( H ′ × W ′ ) × C o u t F \times C^T = ((H' \times W') \times (C\times K \times K)) \times (C_{out} \times (C \times K \times K))^T=(H' \times W') \times C_{out} F×CT=((H′×W′)×(C×K×K))×(Cout​×(C×K×K))T=(H′×W′)×Cout​。

整体的流程可以简化为

举例具体的计算流程如下:

参考文献

[1] https://www.zhihu.com/question/28385679?sort=created
[2] https://blog.csdn.net/xiaoyezi_1834/article/details/50786363

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章