https://www.zhihu.com/question/28385679
https://github.com/Yangqing/caffe/wiki/Convolution-in-Caffe:-a-memo
作者贾扬清亲自解释了这个问题。Caffe框架是他在研究生毕业毕业前两个月的时间写的,自然有一些缺点(占用内存方面)。其实卷积是很难优化的,因为我们一般是在单通道的图像和单个滤波器之间进行卷积,但是深度学习中是多核多通道卷积。
对通道为C,高和宽分别为H、W的图像,在每一个位置上,划分一个KxK大小的patch,算上通道数,那就是CxKxK大小的patch,一共有HxW个patch:
这样就完成了由图像到矩阵的转化,这种操作在matlab中叫做im2col。需要注意的是,因为每一个像素点都对应一个patch,可以看成patch区域在图像上滑动,滑动的过程是有重叠的,转化所得的矩阵大小大于原图像。
与此同时,我们也要将滤波器转化成矩阵形式。
这样,卷积就可以转化为矩阵乘法(Gemm in BLAS)问题,调用GEMM(GEneralized Matrix Multiplication)对两矩阵内积。BLAS有许多性能优良的库,而且由分销商Intel和Nvidia针对所有平台进行优化。
以上,就是作者上学期间采用的一种讨巧的方法,将问题转换成更加简单的,已经可以解决的问题。在当时取得了很好的效果,直到Alex Krizhevsky基于对GPU的深刻理解,在cuda-convert中又取得了巨幅的提升,这种方法被碾压,这就是另外一个故事了。https://code.google.com/p/cuda-convnet2/