http://zhangliliang.com/2015/02/11/about-caffe-code-convolutional-layer/ http://www.zhihu.com/question/28385679 参考地址
一,
先把贾扬清卷积的几张幻灯片贴上来,希望能有点用:
最后一页没画,但是基本上就是Filter Matrix乘以Feature Matrix的转置,得到输出矩阵Cout x (H x W),就可以解释为输出的三维Blob(Cout x H x W)。Caffe里用的是CHW的顺序,有些library也会用HWC的顺序(比如说CuDNN是两个都支持的),这个在数学上其实差别不是很大,还是一样的意思。
顺便广告一下我吐槽Caffe里面卷积算法的链接:Convolution in Caffe: a memo · Yangqing/caffe Wiki · GitHub
二、
使用im2col的方法将卷积转为矩阵相乘,图如下:
想象一副图像尺寸为MxM,卷积核mxm。在计算时,卷积核与图像中每个mxm大小的图像块做element-wise相乘,相当于把该mxm图像块提取出来,表示成一个长度为m^2的列,共有多少个这种图像块?在不考虑pad和stride的情况下,一共有(M-m+1)^2个,把这么些个图像块均表示为m^2的列,然后组合为一个大矩阵(m^2 x (M-m+1)^2)。这里的操作就是img2col中做的事,matlab中就有这种函数。然后把卷积核也表示为m^2向量,并按列复制为同尺寸矩阵(m^2 x (M-m+1)^2)。俩矩阵按列做点积即得结果。
待卷积图像经过IMG2COL后,就可以直接与网络权重矩阵相乘了(不需要卷积核在图像上滑动了)。这时利用普通的矩阵乘法就是卷积操作。
//修正,条目1中 I.H x I.W是输入的feature map的尺寸,原图笔误,谢谢 @晚晴也是晴 指正
所以 如果能够理解全连接层的实现,那么距离理解卷积层也就一步之遥了,差的是要理解里面的im2col和col2im的作用,经过这两个操作后,卷积层的操作跟全连接层的操作基本是一致的。