在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量。需要人工设计特征,然后将用这些特征计算的值组成特征向量。在过去几十年的经验来看,人工找的特征并不总是好用。有时多了,有时少了,有时选的特征根本就不起作用(真正起作用的特征在浩瀚的未知里)。这就是为啥过去几十年神经网络一直被SVM等完虐的原因。
  如果有人说,任何特征都是从图像中提取的。那如果把整幅图像作为特征来训练神经网络不就行了嘛,那肯定不会有任何的信息丢失!额,先不说一幅图像有多少冗余信息,单说这数据量就,吓死了!
  假如有一幅1000*1000的图像,如果把整幅图像作为向量,则向量的长度为1000000(10^6)。在假如隐含层神经元的个数和输入一样,也是1000000;那么,输入层到隐含层的参数数据量有10^12,妈呀,什么样的机器能训练这样的网络呢。所以,我们还得降低维数,同时得以整幅图像为输入(人类实在找不到好的特征了)。于是,牛逼的卷积来了。接下来看看卷积都干了些啥。

局部感知:

  卷积神经网络有两种神器可以降低参数数目,第一种神器叫做局部感知野。一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。如下图所示:左图为全连接,右图为局部连接。

  在上右图中,假如每个神经元只和10×10个像素值相连,那么权值数据为1000000×100个参数,减少为原来的千分之一。而那10×10个像素值对应的10×10个参数,其实就相当于卷积操作。

权值共享:

  但其实这样的话参数仍然过多,那么就启动第二级神器,即权值共享。在上面的局部连接中,每个神经元都对应100个参数,一共1000000个神经元,如果这1000000个神经元的100个参数都是相等的,那么参数数目就变为100了。
怎么理解权值共享呢?
  我们可以这100个参数(也就是卷积操作)看成是提取特征的方式,该方式与位置无关。这其中隐含的原理则是:图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。
  更直观一些,当从一个大尺寸图像中随机选取一小块,比如说 8×8 作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个 8×8 样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。特别是,我们可以用从 8×8 样本中所学习到的特征跟原本的大尺寸图像作卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。
  如下图所示,展示了一个3*3的卷积核在5*5的图像上做卷积的过程。每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。

多卷积核:

  上面所述只有100个参数时,表明只有1个100*100的卷积核,显然,特征提取是不充分的,我们可以添加多个卷积核,比如32个卷积核,可以学习32种特征。在有多个卷积核时,如下图所示:

  上图右,不同颜色表明不同的卷积核。每个卷积核都会将图像生成为另一幅图像。比如两个卷积核就可以将生成两幅图像,这两幅图像可以看做是一张图像的不同的通道。如下图所示:

池化(down-samplin):

  在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) × (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例 (example) 都会得到一个 7921 × 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。
  为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。

多卷积层:

  在实际应用中,往往使用多层卷积,然后再使用全连接层进行训练,多层卷积的目的是一层卷积学到的特征往往是局部的,层数越高,学到的特征就越全局化。

到此,基本上就把CNN中的卷积说全了!

CNN中卷积的意义的更多相关文章

  1. 由浅入深:CNN中卷积层与转置卷积层的关系

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由forrestlin发表于云+社区专栏 导语:转置卷积层(Transpose Convolution Layer)又称反卷积层或分数卷 ...

  2. CNN中卷积层 池化层反向传播

    参考:https://blog.csdn.net/kyang624823/article/details/78633897 卷积层 池化层反向传播: 1,CNN的前向传播 a)对于卷积层,卷积核与输入 ...

  3. CNN中卷积层的计算细节

    原文链接: https://zhuanlan.zhihu.com/p/29119239 卷积层尺寸的计算原理 输入矩阵格式:四个维度,依次为:样本数.图像高度.图像宽度.图像通道数 输出矩阵格式:与输 ...

  4. Python3 CNN中卷积和池化的实现--限制为二维输入

    # -*- coding: utf-8 -*- """ Created on Wed Jan 31 14:10:03 2018 @author: markli " ...

  5. CNN中卷积过程中padding的使用

    1.podding='SAME'时,全0填充.     2.padding=“VALID”,不使用全0填充      

  6. CNN中的卷积核及TensorFlow中卷积的各种实现

    声明: 1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论. 2. 我不确定的地方用了"应该"二字 首先,通俗说一下,CNN ...

  7. (原)CNN中的卷积、1x1卷积及在pytorch中的验证

    转载请注明处处: http://www.cnblogs.com/darkknightzh/p/9017854.html 参考网址: https://pytorch.org/docs/stable/nn ...

  8. 从多维卷积说起,比较CNN中的全连接和全卷积

    一幅图像里包含三个通道,分别是RGB通道.三通道在卷积时是通过累加三个卷积结果得到的. CNN中全连接层的卷积核大小是feature map的大小.比如feature是3*3的,那么该全连接层的卷积核 ...

  9. CNN中减少网络的参数的三个思想

    CNN中减少网络的参数的三个思想: 1) 局部连接(Local Connectivity) 2) 权值共享(Shared Weights) 3) 池化(Pooling) 局部连接 局部连接是相对于全连 ...

随机推荐

  1. Tomcat在处理GET和POST请求时产生的乱码问题

    最近一直在做关于Servlet的事情,常常出现乱码,很是烦人,处理乱码的方法有时候有效,有时候没有效果,今天抽个时间小结一下,以防以后再出现这种问题. 一般的处理乱码的方式都是用: request.s ...

  2. [转]LazyLoad.js及scrollLoading.js

    本文转自:http://blog.csdn.net/ning109314/article/details/7042829 目前图片延迟加载主要分两大块,一是触发加载(根据滚动条位置加载图片):二是自动 ...

  3. Murano Weekly Meeting 2015.07.28

    Meeting time: 2015.July.28th 1:00~2:00 Chairperson: Kirill Zaitsev, core from Mirantis Meeting summa ...

  4. JS arguments转array

    JS arguments转array? Array.prototype.slice.call(arguments)

  5. [Java][Liferay] 模拟用户

    以admin的帐号登陆 Navigation to Users and Organizations -> All Users 找到你要查看的user,点击Actions->Imperson ...

  6. Linux下svn环境搭建

    不久前买了一个阿里云服务器,想着在上面搭建一个svn服务方便自己的代码管理.顺便记录下自己的搭建过程 首先,安装服务 通过yum -stall subversion 安装snv,可能install之前 ...

  7. intellijidea课程 intellijidea神器使用技巧 3-4 alter+enter

    alter enter ==> 创建函数 fi() ==> alter enter

  8. vue2 数据交互 vue-resource

    1.安装vue-resource到项目中,找到当前项目 输入:npm install vue-resource --save 2.安装完毕后,在main.js中导入,如下所示: import  Vue ...

  9. android studio gradle统一管理版本

    创建config.gradle ext { android = [ compileSdkVersion : 26, buildToolsVersion : "26.0.2", mi ...

  10. Struts2_HelloWorld_2

    设置 tomcat 的位置 (jre:并不是jdk) 打开 struts2目录:apps 示例程序docs 文档lib 类库src 源码 打开 apps 目录下的 struts2-blank.war ...