卷积本身的执行过程是通过在特征图上滑动卷积核来完成的。但是在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[1212][1111][0110]filter#2[1001][2211][1220]
最终转换为
[ 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] [111020211211121101121200]
对于输入为 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] ⎣⎡110212032⎦⎤⎣⎡001231120⎦⎤⎣⎡103213132⎦⎤
采用 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] ⎣⎢⎢⎡121120131102132202032132031132101201211301331332⎦⎥⎥⎤
这样,最终的计算结果就变成了 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
手机扫一扫
移动阅读更方便
你可能感兴趣的文章