caffe中三通道图像的卷积过程

卷积是卷积神经网络的重要组成部分,消耗整个网络中大量计算资源,理解卷积计算过程,对优化网络结构和简化网络模型非常重要。

       正常卷积的实现如下图所示:


        非常重要的是:卷积核其实和特征图一样,是一个三维矩阵,这点需要注意。

       上图是一个典型的卷积过程。第一列是一个7*7*3的特征图;第二列是第一个卷积核,大小为3*3*3;第三列是第二个卷积核,大小为3*3*3;第四列得到了两个输出特征图,第一个是原特征图和第一个卷积核卷积得到的,第二个是原特征图和第二个卷积核卷积得到的。

        计算:第二列的卷积核的第一个3*3模板在第一个特征图上进行加权迭代,得到值为-3;第二个3*3模块在第二个特征图对应位置,进行同样的操作,得到4;第三个得到0;最后,加上偏置1,即:-3+4+0+1=2。按这样的计算规则,卷积核在原特征图上进行滑动遍历,最终得到了第四列,第一个输出特征图。第三列的卷积核计算同上,得到了第四列,第二个输出特征图。

        乘法次数:即进行了几次乘法,第一个卷积核进行了(3*3)*3次乘法,两个卷积核共2*(3*3)*3次。

        参数个数:即权值个数,第一个卷积核有(3*3)*3个参数,加上一个偏置,共(3*3)*3+1=28个参数。所以,两个卷积核共28*2=56个参数。


        那么,卷积过程,在caffe代码中是怎么实现的呢?如下图所示:


        上图类似上面的卷积过程,输入特征图大小为:in_channels*in_height_*in_width,卷积核大小为:in_channels*k_height_*k_width(注意:卷积核channels和输入特征图的channels相同),输出特征图大小为:out_channels*out_height_*out_width。

         caffe实现时,先将输入特征图和卷积核都转化为矩阵,计算好了再还原,如下图:


       将输入特征图中,卷积部分的那个区域中数据(原特征图中),转变为一列,如果channels为1,则列长为k_height_*k_width,否则为in_channels*k_height_*k_width。当卷积核移动一次,对应的区域数据又形成了新的一列,卷积核一用移动out_height_*out_width次,这样输入特征图矩阵的宽度就为out_height_*out_width。所以,就形成了一个(in_channels*k_height_*k_width)*(out_height_*out_width)的矩阵。同上,得到一个(out_channles)*(in_channels*k_height_*k_width)的卷积核矩阵。
       用卷积核矩阵*输入特征图矩阵,得到(out_channles)*(out_height_*out_width)大小的输出特征图矩阵,还原后得到out_channles个out_height_*out_width大小的特征图。
       以上,即为卷积计算的详细步骤。
       本博客中提到了乘法次数,当然也有加分次数,这些都是实际开发中,需要考虑的。开发中需要根据算法的浮点运算次数,来权衡选择何种处理芯片。

猜你喜欢

转载自blog.csdn.net/liuxiangxxl/article/details/79387347