您的位置:首页 > Web前端

深度学习中的卷积计算及caffe的实现

2017-11-17 09:09 615 查看


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

  原创内容,转载请注明出处。 

  本文简单介绍了图像卷积相关的知识以及Caffe中的卷积实现方法,写作过程中参考了很多很赞的资料,有兴趣的读者可以从【参考资料】查看。 

  博文中的错误和不足之处还望各位读者指正。


什么是卷积?

  卷积原本是信号处理总的一个专有名词,按照信号的属性,常见的分为一维卷积和二维卷积,按照我的理解就是按照一定的规则将一定区域内的数据乘积后相加,这里引用一个例子给以直观的解释。

这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积

引自一个血腥的卷积解释

  对此,我的理解是,卷积就是一个信号作用在另一个信号的响应过程。卷积怎么计算,就是加权叠加。


图像卷积

  上面我们引用一个例子简单介绍了卷积,那对于一副图像,我们怎么计算它的卷积呢?对于一副图像,卷积有什么意义呢? 

   

  我们首先回答第二个问题,和刚才那个例子类似,图像卷积即是一个卷积核(图1)作用在图像上得到的响应。显然,卷积核不同,得到的响应自然不同,故我们可以更换不同的卷积核实现对于图像不同的操作。 


 

图1,一个卷积核,核说白了就是一个固定大小的数值数组。该数组带有一个 锚点 ,一般位于数组中央。图片来自OpenCV.

  接着,我们回答第一个问题。这里我引用OpenCV教程上的表达,并根据图2的动画效果加深理解。

计算图像的某个特定位置的卷积值: 

1. 将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合; 

2. 将核内各值与相应像素值相乘,并将乘积相加; 

3. 将所得结果放到与锚点对应的像素上; 

4. 对图像所有像素重复上述过程


 

图2,卷积的计算过程,以图中3*3的卷积核为例,经卷积操作后锚点的像素值变作卷积核(加权系数)乘以对应位置像素值的叠加。图片来自http://williamson-labs.com/convolution-2d.htm .


Caffe中的卷积

  Caffe是一个流行的深度学习框架。而我们用Caffe进行图像分类分类等众多操作时,是怎么计算卷积的呢? 

  各位可以参看Caffe的作者贾扬清在知乎上的回答,我这里贴出贾扬清的这张图(图3)。 


 

图3,Caffe中卷积的计算过程,其中C是通道数,Cout是输出的特征映射个数也就是卷积核(过滤器)个数 

   

  这里以32*32的RGB图像为例,6个5*5的卷积核为例,先将这副32*32(最外层做zero padding)的RGB图像在每个通道上按照5*5的大小转化为行向量(1行25列),最后成为(32*32)行(3*25)列的矩阵。同时,将6个卷积核按通道转化成6行(3*25)列的矩阵,再将两个矩阵点乘即卷积核矩阵点乘图像矩阵的转置,得到6(32*32)的矩阵,即6个特征映射,每个映射为(32*32),如果不做zero padding则是6*(28*28)。

在caffe里的实现就是用img2col函数,我们在转换矩阵时需要知道卷积核大小,并按照卷积核大小在原图中取数据,以此类推当多个卷积核时,只需要将矩阵N的列数增加,并在原图中取出不同卷积核对应的数据放在矩阵M的对应行中。 
借用一张图可以更清晰的看到是如何在原图中取数据组成矩阵M的: 



可以看到图中将卷积输入按卷积的格式展开成矩阵的的方式就是我上面描述的方式,通过这样的方式将卷积转换成矩阵相乘,加速和方便了卷积的运算。

还有这些卷积运算后的结果的大小和维度的算法参见http://cs231n.github.io/convolutional-networks/,这里的计算方法说的很详细,就不赘述了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: