在caffe中如何计算卷积的?
caffe中, 卷积网络的前向传播过程需要计算类似
W∗x+B
这样的连接, forward_cpu_gemm()函数用weight矩阵和输入的bottom相乘, 然后对bias进行处理, bias程序会根据情况决定是否对bias进行scale(放大/缩小).
另外可以参考知乎问题:在 Caffe 中如何计算卷积?
我们知道, caffe中的卷积运算采用的是矩阵计算, 那么caffe是如何构造卷积矩阵的.
我们可以参考下图:
具体的论文参考:High Performance Convolutional Neural Networks for Document Processing
由图可知, 传统的卷积方式与矩阵计算方式的卷积运算的区别, 后者通过预先转换, 得到输入数据与卷积核的矩阵形式, 然后进行一次矩阵运算就能得到多个卷积核的特征图.
我们假设
输入数据input_features:
W∗H∗D
, 其中D是数据深度,
W∗H
是数据大小
卷积核conv_filter:
Kw∗KH∗D∗M
, 其中
K∗K
是核大小, D是核深度, M是核数量
卷积超参数:stride是卷积步长,
SW
表示宽度方向的步长,
SH
表示高度方向的步长.
卷积超参数:pad是卷积填充操作,
padW
代表宽度方向上的填充,长度
padH
代表高度方向上的填充长度.
第一步, 先将input_features按照配置的卷积方式来转换成矩阵, 也就是图中input_features->input_features(Matrix)的过程.那么新的input_features(Matrix):
input_features(Matrix)是一个二维矩阵, 其中ofs代表的是output_features_size, ofs由输入数据的大小 W∗H 和卷积核大小 KW∗KH 共同确定.
第二步, 将卷积核转换成矩阵形式, 由conv_filters KW∗KH∗∗D∗M 四维转换成conv_filters(Matrix) (KW∗KH∗D)∗M 二维格式.
第三步, 进行矩阵运算
最后将output_features(Matrix)转换成output_features