多通道(比方RGB三通道)卷积过程
今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比方10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定不是的, 输出的个数依旧是 卷积核的个数。 能够查看经常使用模型。比方lenet 手写体,Alex imagenet 模型, 每一层输出feature map 个数 就是该层卷积核的个数。
1、 一通道单个卷积核卷积过程
2、 一通道 多个卷积核卷积过程
一个卷积核得到的特征提取是不充分的。我们能够加入多个卷积核,比方32个卷积核,能够学习32种特征。
在有多个卷积核时,例如以下图所看到的:输出就为32个feature map
3、 多通道的多个卷积核
下图展示了在四个通道上的卷积操作。有两个卷积核,生成两个通道。当中须要注意的是,四个通道上每一个通道相应一个卷积核,先将w2忽略,仅仅看w1,那么在w1的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加然后再取激活函数值得到的。
所以最后得到两个feature map。 即输出层的卷积核核个数为 feature map 的个数。
所以。在上图由4个通道卷积得到2个通道的过程中,參数的数目为4×2×2×2个。当中4表示4个通道。第一个2表示生成2个通道。最后的2×2表示卷积核大小。
以下是常见模型, 理解一下 每层feature map 个数。为上一层卷积核的个数
下图即为Alex的CNN结构图。须要注意的是。该模型採用了2-GPU并行结构,即第1、2、4、5卷积层都是将模型參数分为2部分进行训练的。
在这里。更进一步,并行结构分为数据并行与模型并行。
数据并行是指在不同的GPU上,模型结构同样,但将训练数据进行切分。分别训练得到不同的模型,然后再将模型进行融合。
而模型并行则是,将若干层的模型參数进行切分,不同的GPU上使用同样的数据进行训练,得到的结果直接连接作为下一层的输入。
上图模型的基本參数为:
输入:224×224大小的图片,3通道
第一层卷积:5×5大小的卷积核96个,每一个GPU上48个。
第一层max-pooling:2×2的核。
第二层卷积:3×3卷积核256个,每一个GPU上128个。
第二层max-pooling:2×2的核。
第三层卷积:与上一层是全连接,3*3的卷积核384个。分到两个GPU上个192个。
第四层卷积:3×3的卷积核384个,两个GPU各192个。该层与上一层连接没有经过pooling层。
第五层卷积:3×3的卷积核256个,两个GPU上个128个。
第五层max-pooling:2×2的核。
第一层全连接:4096维,将第五层max-pooling的输出连接成为一个一维向量,作为该层的输入。
第二层全连接:4096维
Softmax层:输出为1000,输出的每一维都是图片属于该类别的概率。
4 DeepID网络结构
DeepID网络结构是香港中文大学的Sun Yi开发出来用来学习人脸特征的卷积神经网络。每张输入的人脸被表示为160维的向量。学习到的向量经过其它模型进行分类,在人脸验证试验上得到了97.45%的正确率,更进一步的,原作者改进了CNN,又得到了99.15%的正确率。
例如以下图所看到的,该结构与ImageNet的详细參数类似,所以仅仅解释一下不同的部分吧。
上图中的结构。在最后仅仅有一层全连接层,然后就是softmax层了。论文中就是以该全连接层作为图像的表示。
在全连接层,以第四层卷积和第三层max-pooling的输出作为全连接层的输入,这样能够学习到局部的和全局的特征。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下讲一下,caffe中的实现。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">
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)为
(B矩阵的每一列为一个卷积核要卷积的大小)
A 矩阵的由来:::
B矩阵的由来:(caffe 有 imtocol.cpp代码,专门用于实现)
C=A*B=
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">*=
C中的与
分别为两个输出特征图像即feature
map。验证了 有几个卷积核就有几个feature map
在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_)
贾扬清的PPT例如以下:
以下看这个就简单多了, im2col.cpp 的代码也好理解了
多通道(比方RGB三通道)卷积过程的更多相关文章
- C++ 彩色图像(RGB)三通道直方图计算和绘制,图像逆时针旋转90° 实现代码
#include "iostream" #include "opencv2/opencv.hpp" #include "vector" us ...
- OpenCV——RGB三通道分离
opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的. matlab 的排列顺序是R,G,B: 而在opencv中,排列顺序是B,G,R. 下面通过一个小程序看看opencv中 ...
- OpenCV绘制图像中RGB三个通道的直方图
一开始是看<OpenCV计算机视觉编程攻略(第2版)>这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...
- 【CNN】--- 卷积过程中RGB与灰度的区别
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/hacker_Dem_br/article/ ...
- SSE图像算法优化系列十八:三次卷积插值的进一步SSE优化。
本文是在学习https://blog.csdn.net/housisong/article/details/1452249一文的基础上对算法的理解和重新整理,再次非常感谢原文作者的深入分析以及分享. ...
- STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
Ⅰ.概述 上一篇文章讲述的内容是:三通道逐次转换(单次.单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值. 本文讲述三通道DMA连续转换(3通道.软件单次触发) ...
- STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三 ...
- Halcon学习之三:有关图像通道的函数(R是三通道,B是1通道,G二通道),排列顺序BGR
黑白摄像机会返回每个像素所对应的能量采用结果,这些结果组成了一幅单通道灰度值图像,而对于RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像.下面这些是与图像通道有关的函数: ...
- Halcon一日一练:创建三通道图像
首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...
随机推荐
- 九、 Java程序初始化的顺序(二)
之前的一篇博客里我写了关于在一个类中的程序初始化顺序,但是在Java的面向对象里,类之间还存在着继承的关系.所以关于程序的初始化顺序,我们可以再细划分为:父类静态变量,父类的静态代码块,父类构造器,父 ...
- 阻止关闭窗口,FormCloseQuery
procedure TfrmTopJdsMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin ) = mrNo then ...
- CString 转换为 char*
CString str="这是一个测试"; char* str_0=str.GetBuffer(0);
- .NET Core微服务 权限系统+工作流(一)权限系统
一.前言 实际上权限系统老早之前我就在一直开发,大概在刚毕业没多久就想一个人写一个系统,断断续续一直坚持到现在,毕竟自己亲动手自写的系统才有收获,本篇仅介绍权限. 小小系统上不了台面,望各位大神勿喷. ...
- 如何在CentOS 7上安装Nginx
第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二步 - 安装Nginx现在Nginx存储 ...
- vue.js移动端app实战1
本系列将会用vue.js2制作一个移动端的webapp单页面,页面不多,大概在7,8个左右,不过麻雀虽小,五脏俱全,常用的效果如轮播图,下拉刷新,上拉加载,图片懒加载都会用到.css方面也会有一些描述 ...
- centos7安装hadoop2.6.1,详细教程
1.我搭建的是三台centos7的环境 首先准备三个centos7(文中出现的所有的链接都是我自己的) centos7下载地址(也可以上官网自行下载):https://pan.baidu.com/s/ ...
- SecureCRT分屏显示
[Tab右键]或者[Session Manager右键]->[Send to New Tab Group]
- django常用第三方app大全
djangoapp 资源大全 最近经常在这个版面看到Django相关扩展的介绍,而其一个扩展写一个帖子,觉得没太必要吧. 以前整理的django资源列表,从我的wiki上转过来的. 要找django资 ...
- jmeter3.x的jtx文件解析
jtl保存测试结果 打开jtl文件,内容为下: timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,suc ...