Caffe的卷积原理

转载 2016年08月29日 18:11:43

original url:

http://www.cnblogs.com/yymn/articles/5330587.html


Caffe的卷积原理

Caffe中的卷积计算是将卷积核矩阵和输入图像矩阵变换为两个大的矩阵A与B,然后A与B进行矩阵相乘得到结果C(利用GPU进行矩阵相乘的高效性),三个矩阵的说明如下:

(1)在矩阵A中

        M为卷积核个数,K=k*k,等于卷积核大小,即第一个矩阵每行为一个卷积核向量(是将二维的卷积核转化为一维),总共有M行,表示有M个卷积核。

(2)在矩阵B中

        N=((image_h + 2*pad_h – kernel_h)/stride_h+ 1)*((image_w +2*pad_w – kernel_w)/stride_w + 1)

        image_h:输入图像的高度

        image_w:输入图像的宽度

        pad_h:在输入图像的高度方向两边各增加pad_h个单位长度(因为有两边,所以乘以2)

        pad_w:在输入图像的宽度方向两边各增加pad_w个单位长度(因为有两边,所以乘以2)

        kernel_h:卷积核的高度

        kernel_w:卷积核的宽度

        stride_h:高度方向的滑动步长;

        stride_w:宽度方向的滑动步长。

        因此,N为输出图像大小的长宽乘积,也是卷积核在输入图像上滑动可截取的最大特征数。

        K=k*k,表示利用卷积核大小的框在输入图像上滑动所截取的数据大小,与卷积核大小一样大。

(3)在矩阵C中

        矩阵C为矩阵A和矩阵B相乘的结果,得到一个M*N的矩阵,其中每行表示一个输出图像即feature map,共有M个输出图像(输出图像数目等于卷积核数目)

 

 (在Caffe中是使用src/caffe/util/im2col.cu中的im2col和col2im来完成矩阵的变形和还原操作)

 

 举个例子(方便理解):

     假设有两个卷积核为,因此M=2,kernel_h=2,kernel_w=2,K= kernel_h * kernel_w=4

     输入图像矩阵为,因此image_h=3,image_w=3,令边界扩展为0即pad_h=0,pad_w=0,滑动步长为1,即stride_h=1,stride_w=1

     故N=[(3+2*0-2)/1+1]*[ (3+2*0-2)/1+1]=2*2=4

 

    A矩阵(M*K)为,B矩阵(K*N)为

    C=A*B=*=

    C中的分别为两个输出特征图像即featuremap。

 

    在Caffe源码中,src/caffe/util/math_functions.cu(如果使用CPU则是src/util/math_functions.cpp)中的caffe_gpu_gemm()函数,其中有两个矩阵A(M*K)

    与矩阵    B(K*N),大家可以通过输出M、K、N的值即相应的矩阵内容来验证上述的原理,代码中的C矩阵与上述的C矩阵不一样,代码中的C矩阵存储的是偏置bias,

    是A  与B相乘后得到M*N大小的矩阵,然后再跟这个存储偏置的矩阵C相加完成卷积过程。如果是跑Mnist训练网络的话,可以看到第一个卷积层卷积过程中,

    M=20,K=25,N=24*24=576。

  (caffe中涉及卷积具体过程的文件主要有:src/caffe/layers/conv_layer.cu、src/caffe/layers/base_conv_layer.cpp、                 src/caffe/util/math_functions.cu、src/caffe/util/im2col.cu)

    另外大家也可以参考知乎上贾扬清大神的回答,帮助理解http://www.zhihu.com/question/28385679

  (对于他给出的ppt上的C表示图像通道个数,如果是RGB图像则通道数为3,对应于caffe代码中的变量为src/caffe/layers/base_conv_layer.cpp中

     函数forward_gpu_gemm中的group_)

 

注:如果本人理解有误,欢迎大家指出。

 

在 Caffe 中如何计算卷积?

圣行,漂来漂去的水货
图文并茂还是需要花点时间的。用文字简单描述一下,然后题主还是看代码来理解吧。
想象一副图像尺寸为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)。俩矩阵按列做点积即得结果。
粗略介绍,细节不包完全正确。

caffe中RGB图像三通道卷积过程学习推导

idea来源于自己的想法,之前在github看过大神贾杨清的推导slider,caffe中如果计算卷积,加上自己最近有个很小的疑惑,输入的image一般是RGB三通道的彩色图片,但是我们在定义卷积层时...
  • u014381600
  • u014381600
  • 2017年03月08日 22:13
  • 4327

caffe中卷积计算方法

http://zhangliliang.com/2015/02/11/about-caffe-code-convolutional-layer/    http://www.zhihu.com/que...
  • u014114990
  • u014114990
  • 2015年08月18日 17:22
  • 1494

caffe卷积层延伸:卷积核膨胀详细解析

在笔者的上一篇博客中,解析caffe的卷积层时,在conv_layer.cpp中有一个卷积核膨胀操作,在conv_layer.cpp的第17行有如下代码 const int kernel_exten...
  • jiongnima
  • jiongnima
  • 2017年04月06日 22:33
  • 5365

卷积的本质及物理意义(全面理解卷积)

卷积的本质及物理意义 提示:对卷积的理解分为三部分讲解1)信号的角度2)数学家的理解(外行)3)与多项式的关系 1 来源 卷积其实就是为冲击函数诞生的。“冲击函数”是狄拉克为了解决一些瞬间作用的...
  • tiandijun
  • tiandijun
  • 2014年10月14日 17:38
  • 43974

图像卷积及Caffe中的卷积实现

图像卷积及Caffe中的卷积实现   本文简单介绍了卷积、图像卷积以及Caffe中的卷积实现等相关知识,写作过程中参考了很多很赞的资料,有兴趣的读者可以从【参考资料】查看。...
  • u014421266
  • u014421266
  • 2016年02月03日 20:07
  • 3634

Caffe中卷积运算的原理与实现

Caffe中卷积运算的原理与实现
  • qianqing13579
  • qianqing13579
  • 2017年05月13日 17:07
  • 2975

【caffe】caffe之卷积层

BaseConvolutionLayer BaseConvolutionLayer::LayerSetUp 在调用layer->LayerSetUp时,其实是调用的BaseConvolutio...
  • q295684174
  • q295684174
  • 2016年11月15日 19:50
  • 630

Caffe卷积原理

原文链接http://blog.csdn.net/xiaoyezi_1834/article/details/50786363 Caffe中的卷积计算是将卷积核矩阵和输入图像矩阵变换...
  • zhangzhenyuancs
  • zhangzhenyuancs
  • 2016年08月19日 16:39
  • 1312

Caffe中卷积层的实现

作者:xg123321123出处:http://blog.csdn.net/xg123321123/article/details/53319080声明:版权所有,转载请联系作者并注明出处1 简述 使...
  • xg123321123
  • xg123321123
  • 2016年11月24日 12:52
  • 2453

caffe中卷积计算方法

http://zhangliliang.com/2015/02/11/about-caffe-code-convolutional-layer/    http://www.zhihu.com/que...
  • baobei0112
  • baobei0112
  • 2016年03月22日 13:53
  • 2082
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Caffe的卷积原理
举报原因:
原因补充:

(最多只允许输入30个字)