卷积本身的执行过程是通过在特征图上滑动卷积核来完成的。但是在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]fi