caffe中卷积计算方法
2015-08-18 17:22
274 查看
http://zhangliliang.com/2015/02/11/about-caffe-code-convolutional-layer/ http://www.zhihu.com/question/28385679 参考地址
一,
先把贾扬清卷积的几张幻灯片贴上来,希望能有点用:
![](http://pic3.zhimg.com/b3f73d3aeee1ccc3e3deb230ec873b6e_b.jpg)
![](http://pic2.zhimg.com/a54fea5b7e70bd25d3096126a6713d19_b.jpg)
![](http://pic3.zhimg.com/314fb9af7d379ba2ea1f67ea982a60b2_b.jpg)
![](http://pic3.zhimg.com/69e44f61e8ede5ba84534ca3b764d302_b.jpg)
![](http://pic3.zhimg.com/6b1dde11bf30688b4f526ea77d54a196_b.jpg)
最后一页没画,但是基本上就是Filter
Matrix乘以Feature Matrix的转置,得到输出矩阵Cout x (H x W),就可以解释为输出的三维Blob(Cout x H x W)。
Caffe里用的是CHW的顺序,有些library也会用HWC的顺序(比如说CuDNN是两个都支持的),这个在数学上其实差别不是很大,还是一样的意思。
顺便广告一下我吐槽Caffe里面卷积算法的链接:Convolution
in Caffe: a memo · Yangqing/caffe Wiki · GitHub
二、
使用im2col的方法将卷积转为矩阵相乘,图如下:
![](http://pic4.zhimg.com/a6421bae22236c0509623b8b7f7bbb03_b.jpg)
想象一副图像尺寸为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)。俩矩阵按列做点积即得结果。
待卷积图像经过IMG2COL后,就可以直接与网络权重矩阵相乘了(不需要卷积核在图像上滑动了)。这时利用普通的矩阵乘法就是卷积操作。
//修正,条目1中
I.H x I.W是输入的feature map的尺寸,原图笔误,谢谢 @晚晴也是晴 指正
![](http://pic2.zhimg.com/8e59c8469aa34c33ce3c58c62fd3fe35_b.jpg)
![](http://pic4.zhimg.com/3d74b12b09ea4a9da377bce8d2bab527_b.jpg)
![](http://pic1.zhimg.com/9bf2b7c788808c24de7f230126f2c344_b.jpg)
![](http://pic3.zhimg.com/79ef81e84caa0be47709df46a451c4a2_b.jpg)
![](http://pic2.zhimg.com/18f90f022002ccdb44158349bf802aa9_b.jpg)
![](http://pic1.zhimg.com/7c7271015365189053863df2bc25c810_b.jpg)
![](http://pic1.zhimg.com/89d66131c5913aaaa8dfa35c66971c24_b.jpg)
所以 如果能够理解全连接层的实现,那么距离理解卷积层也就一步之遥了,差的是要理解里面的im2col和col2im的作用,经过这两个操作后,卷积层的操作跟全连接层的操作基本是一致的。
一,
先把贾扬清卷积的几张幻灯片贴上来,希望能有点用:
![](http://pic3.zhimg.com/b3f73d3aeee1ccc3e3deb230ec873b6e_b.jpg)
![](http://pic2.zhimg.com/a54fea5b7e70bd25d3096126a6713d19_b.jpg)
![](http://pic3.zhimg.com/314fb9af7d379ba2ea1f67ea982a60b2_b.jpg)
![](http://pic3.zhimg.com/69e44f61e8ede5ba84534ca3b764d302_b.jpg)
![](http://pic3.zhimg.com/6b1dde11bf30688b4f526ea77d54a196_b.jpg)
最后一页没画,但是基本上就是Filter
Matrix乘以Feature Matrix的转置,得到输出矩阵Cout x (H x W),就可以解释为输出的三维Blob(Cout x H x W)。
Caffe里用的是CHW的顺序,有些library也会用HWC的顺序(比如说CuDNN是两个都支持的),这个在数学上其实差别不是很大,还是一样的意思。
顺便广告一下我吐槽Caffe里面卷积算法的链接:Convolution
in Caffe: a memo · Yangqing/caffe Wiki · GitHub
二、
使用im2col的方法将卷积转为矩阵相乘,图如下:
![](http://pic4.zhimg.com/a6421bae22236c0509623b8b7f7bbb03_b.jpg)
想象一副图像尺寸为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)。俩矩阵按列做点积即得结果。
待卷积图像经过IMG2COL后,就可以直接与网络权重矩阵相乘了(不需要卷积核在图像上滑动了)。这时利用普通的矩阵乘法就是卷积操作。
//修正,条目1中
I.H x I.W是输入的feature map的尺寸,原图笔误,谢谢 @晚晴也是晴 指正
![](http://pic2.zhimg.com/8e59c8469aa34c33ce3c58c62fd3fe35_b.jpg)
![](http://pic4.zhimg.com/3d74b12b09ea4a9da377bce8d2bab527_b.jpg)
![](http://pic1.zhimg.com/9bf2b7c788808c24de7f230126f2c344_b.jpg)
![](http://pic3.zhimg.com/79ef81e84caa0be47709df46a451c4a2_b.jpg)
![](http://pic2.zhimg.com/18f90f022002ccdb44158349bf802aa9_b.jpg)
![](http://pic1.zhimg.com/7c7271015365189053863df2bc25c810_b.jpg)
![](http://pic1.zhimg.com/89d66131c5913aaaa8dfa35c66971c24_b.jpg)
所以 如果能够理解全连接层的实现,那么距离理解卷积层也就一步之遥了,差的是要理解里面的im2col和col2im的作用,经过这两个操作后,卷积层的操作跟全连接层的操作基本是一致的。
相关文章推荐
- js ajax请求
- jsp页面之间传参用el表达式获取
- JSTL中的fmt
- js笔试题
- 前端------一个模糊不清的岗位
- iOS 扫描上的层及其样式(三)
- css 基础知识
- BootStrap基本样式
- 圆周运动js
- css
- JS图片的放大与缩小
- JavaScript 对象
- 滚动条滚动事件 js
- 警告 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead
- iOS 扫描上的层及其样式(二)
- css 基础知识
- 关于JS堆栈与拷贝
- 学习zepto.js(对象方法)[3]
- 省市区三级联动JS
- iOS 扫描上的层及其样式(一)