卷积神经网络CNN

作者: 18587a1108f1 | 来源:发表于2018-12-14 16:15 被阅读2次

    阅读需求

    需要了解一点点基础的深度学习概念知识(一点点就好),方便看懂本文的CNN内容。
    // 为了尽量说明原理,本文结合了许多栗子以方便读者阅读,欢迎提议:)


    目录

    • 要说啥啊
    • CNN能干点啥啊
    • 卷积又是啥啊
    • 卷积咋弄成CNN的啊
    • CNN咋整出来的啊
    • CNN结构说明白儿呗
    • CNN有啥好啊
    • 你从哪学的这些玩意儿啊

    简介

    卷积神经网络(Convolutional Neural Network, CNN) 是一种神经网络结构,与普通神经网络相似,由具有可学习的权重(weights)和偏置常量(biases)的神经元 组成。每个神经元接收一部分输入,进行点积运算,输出每个分类的权重。


    CNN的应用举栗

    1.目标检测

    图像识别中,目标检测的任务,是对输入图像样本准确进行分类的基础上,检测其中包含的某些目标,并对它们准确定位并标识。


    2.神经风格迁移

    神经风格迁移(Neural Style Tranfer)是将参考风格图像的风格转换到另一个输入图像中,如下图所示。


    3.特征提取

    CNN可以提取输入信息中的特征,来进行数据的降维压缩处理,减少复杂网络中的参数和计算量。(所以注意!CNN不止是用于图像相关的!)


    什么是卷积

    卷积简单来说,就是一种 数学运算,跟减加乘除没有本质的区别。虽然这种运算本身很复杂,但它非常有助于简化更复杂的表达式。

    剑桥大学给出了卷积的数学公式:


    卷积是通过两个函数 f(p) 和 g(t-p) 生成第三个函数 y(t) 的一种数学算子,表征函数 f 与 g 经过翻转和平移的重叠部分的面积。

    来来来我们举个栗子,来理解这个公式:
    你的老板雇你写代码,但你上班时间约会去了。
    他很生气,扇了你一巴掌(这是输入信号),于是你的脸上鼓起来一个包(这是输出信号),你的脸就是一个信号系统,而鼓起来的包就是你的脸对巴掌的响应。
    下面我们需要一些假设来保证论证的严谨:假定你的脸是线性时不变系统,也就是说,无论什么时候老板打你一巴掌,打在你脸的同一位置,你的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。


    如果你每天都去约会,那么老板每天都要扇你一巴掌,不过当老板打你一巴掌后,你5分钟就消肿了,所以时间长了,你甚至就适应这种生活了……直到有一天,老板忍无可忍,以0.5秒的间隔开始不间断的扇你的过程,这样问题就来了,第一次扇你鼓起来的包还没消肿,第二个巴掌就来了,你脸上的包就可能鼓起来两倍高,老板不断扇你,脉冲不断作用在你脸上,效果不断叠加了,这样这些效果就可以求和了。如果老板再狠一点,频率越来越高,以至于你都辨别不清时间间隔了,那么,求和就变成积分了。
    可以这样理解,在这个过程中的某一固定的时刻,你的脸上的包的鼓起程度和什么有关呢?和之前每次打你都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小。所以这就是说,某一时刻的输出(即包的高度)是之前很多次输入乘以各自的衰减系数之后的叠加而成。
    再把不同时刻的输出点放在一起,形成一个函数(脸上的包的大小随时间变化的函数),这就是 卷积

    对应到公式中:
    系统:你的脸
    输入:巴掌
    输出:包的高度
    f(p) :为第 p 个巴掌
    g(t-p)t 时刻,第 p 个巴掌的作用效果
    y(t)t 时刻,脸上包的高度

    其物理意义可以理解为:
    系统某一时刻的输出是由多个输入共同作用(叠加)的结果。


    从卷积计算到CNN

    上面给出的公式为一维连续域上的两个连续函数的卷积:

    推广到二维离散域(即图像)上,公式为:


    转化成卷积神经网络中的概念,公式为:

    以图像为例对公式说明一下:
    input:输入的原始图像(source pixel) ,假定为 5x5 像素大小
    kernel:卷积核(Convolution kernel),假定为 3x3 大小
    f(u,v): 卷积核在其(u,v)坐标位置的值
    g(x-u,y-v): 原始图像(x,y)位置的值在卷积核(u,v)位置的值作用下的效果
    fature map:对原始图像和卷积核,每对相同位置的元素执行乘法后求和(这里是两个相同大小的矩阵的“点乘”)。乘积的和就生成了feature map中的一个像素。

    上述的计算过程可用下面的动图表示:


    卷积核大小为 3x3,扫描到图像的第一个卷积核大小的 3x3 区域时,原图像在卷积核下的作用效果(即输出像素值)=1x1+1x0+1x1+0x0+1x1+1x0+0x1+0x0+1x1 = 4,填入 feature map 中(即粉框中的第一个值),以此类推。
    通过这样的卷积计算,我们可以提取图像中的某些指定特征(features);
    并且不同的卷积核,可以提取不同的特征。

    为什么要使用卷积神经网络

    知道了卷积是什么以及初步了解了CNN中是如何应用卷积公式计算的之后,
    我们通过一个简单的例子来说明在NN中为什么要使用卷积

    我们现在有一张手写体的数字 '7',(像素32x32,RGB 3通道),正常情况下,我们人眼看到这张图,会立马识别出这是数字 '7'。
    ( 为什么这里选择的是数字7不是1,2,3?别问,问就是一手7777777 )
    如果使用神经网络,机器会如何识别这是数字'7'呢?如果我们使用最简单的神经网络结构(如下图示例所示,仅包含输入层、隐藏层和输出层),将所有pixels作为输入放到网络中,来暴力解决这个问题。


    我们使用两层隐藏层,每层分别选择1024个神经元,512个神经元,最后输出10个数字的softmax预测结果。

    那我们抛开准确率不说,先来计算一下这样的全连接网络 需要多少参数:
    3x32x32x1024+1024x512+512x10+1024(bias)+512(bias) = 3676672 个参数
    这对于一个仅仅32x32的图像来说,运算量非常爆炸了
    同时,由于参数过多,也很容易产生训练结果好,测试结果差的 过拟合(overfitting)现象。

    这条暴力之路行不通之后,我们再思考思考,我们人眼是怎么看这个图像的。
    仔细看这个图会发现,我们肉眼其实也是有选择性的,我们并不太关心上图中'7'外部的白色空白区域,也不关心以及数字’7‘内部的黑色填充区域,我们更关心'7'与白色区域相交的边缘部分,这才是我们判断的主要依据。
    那我们也可以在计算机里也这么做,主要提取边缘特征,对于白色和黑色这种冗余或者不重要的的区域特征,我们尽量丢弃或者少保留,那么这样可能会减少参数或者减少提参数的过程。


    这样思考之后,我们可以在之前的全连接层前面,对输入图像进行一个预处理
    添加一个采集模块(称为采样层或池化层),将输入中没用的部分统统扔掉,只保留那些我们想要的,比较重要的pixels。

    我们再看一个问题:
    如果我们将7进行切分,如下图所示:



    我们的大脑仍能识别出这是一个数字'7',也就是说:
    如果我们只知道局部的图片,以及局部的相对位置,只要我们能将它正确组合起来,我们也可以对物体进行识别
    同时局部与局部之间关联性不大,也就是局部的变化,很少影响到另外一个局部

    所以,我们可以在网络结构中加入卷积(通过卷积核,局部感知输入图片每一部分):
    实现对输入的图片进行特征提取,同时将原始输入进行降维来减少参数
    网络结构进化为如下图所示:

    但一张图片中,特征非常多,一个卷积层提取的特征数量有限的,可能只能提取其中的一些局部特征,我怎么知道最后采样层选出来的特征是不是重要的呢?

    所以我们需要级联分类器(cascade of classifiers)。级联分类器的大致思想就是,通过串联几个弱分类器,进过数据层层筛选,最后得到我们想要的数据。
    在神经网络中,可以级联一个卷积层和采样层,让不同的卷积采样层,去级联筛选提取特征。在CNN中,卷积的层数越高,提取到的特征就会越全局化。


    最终,我们得到了一个最简单的卷积神经网络结构,如上图所示。
    来计算一下这样的CNN结构 需要多少参数:
    (5x5+1(bias))x64+(2x2+1(bias))x64+(5x5+1(bias))x64+(2x2+1(bias))x64+(5x5x64+1(bias))x1024+(1024+1(bias))x512+512x10= 2172800 个参数
    比之前的 3676672 少了 40% 的参数数量,同时实验证明,CNN比简单的全连接网络的效果好得多。

    著名的LeNet的网络结构就与我们上述构建的结构相似
    LeNet:The first successful applications of Convolutional Networks were developed by Yann LeCun in 1990’s. Of these, the best known is the LeNet architecture that was used to read zip codes, digits, etc.

    对上述的CNN过程总结一下:

    • 通过第一个卷积层提取最初特征,输出特征图(feature map)
    • 通过第一个采样层对最初的特征图(feature map )进行特征选择,去除多余特征,重构新的特征图
    • 第二个卷积层是对上一层的采样层的输出特征图(feature map)进行二次特征提取
    • 第二个采样层也对上层输出进行二次特征选择
    • 全连接层就是根据得到的特征进行分类

    举个栗子来理解这个过程:

    • A,B,C三个人去买枕头,枕头就是输入值
    • A拿起枕头看了看,得出结论,枕头是方的,软的,香的。(提取低级特征)
    • A就告诉B,枕头是,方的,软的。(特征选取)
    • B拿过A看完的枕头,根据A的描述,得出结论,枕头和毛绒玩具差不多软,形状为- 一个长:宽:高=4:2:1的立方体(二次特征提取)
    • 然后B告诉C,枕头和毛绒玩具差不多软,形状为一个立方体(二次特征选取)
    • C就是个决策者,他听了A,B的描述,明白了枕头大概是什么样的(全连接)
    • 如果有人拿个东西问他是不是枕头,C结合之前确定的特征,如果非常接近,那他就可以认真这个大概率是枕头了(输出)

    CNN的组成结构

    上面我们已经由实例得到了一个简单的CNN网络模型,知道CNN主要由 卷积层、池化层、全连接层 组成。下面主要详细说明一下每个部分的组成:

    1.卷积层(Convolution Layer)

    卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更高层的网络能从低级特征中迭代提取更复杂的特征。

    我们先定义几个符号,然后依次解释:

    • W : 输入单元的大小(宽或高)
    • F : 感受野(receptive field)
    • P : 补零(zero-padding)的数量
    • S : 步幅(stride)
    • K : 深度,输出单元的深度

    F : 感受野(receptive field):
    我们已经知道,卷积层主要是对输入单元进行卷积计算。但卷积核的大小不同,提取到的特征也就不同。一般使用 F 表示卷积核的尺寸大小。
    如下图中的卷积计算, F = 3


    额外说明一下,在卷积操作中,过滤器(或叫卷积核)的尺寸大小通常为奇数,如3x3,5x5(即F为奇数)。
    这样的好处有点:这里先说一点,奇数的卷积核可以保证锚点刚好在中间,方便以 central pixel 为标准进行滑动卷积,避免了位置信息发生偏移 。

    P:Padding:
    还是上面那张图,我们发现输入单元为5x5,但在卷积计算结束后,输出单元为3x3。
    这时候我们可以发现两个问题:
    A. 图像越来越小;
    B.图像边界信息丢失,即有些图像角落和边界的信息发挥作用较少;
    如果我们在输入单元外层加一圈0,即 P = 2。此时输入单元变为7x7,输出单元变为5x5,图像尺寸不会变小。
    我们推广到更一般的情况下:
    输入 n x n ,过滤器大小 f x f , padding长度为 p,则:
    重新构造的输入大小为:( n + 2 p ) x ( n + 2p )
    卷积后输出大小为:( n + 2 p - f + 1 ) x ( n + 2p - f + 1 )
    要想使得卷积操作不缩减数据维度,则 p = ( f -1 ) / 2
    所以!卷积核使用奇数的另一个好处是:保证填充(Padding)在图像之间添加额外的零层相等,图像的两边相对称,以使输出图像的大小与输入相同。

    S:步幅(Stride):
    卷积中的步长大小为s,指过滤器在输入数据上,水平/竖直方向上每次移动的步长。

    卷积计算举栗
    如下图所示,这里的蓝色矩阵就是输入的图像,粉色矩阵就是卷积层的神经元,这里表示了有两个神经元(w0,w1)。绿色矩阵就是经过卷积运算后的输出矩阵,这里的步长设置为 2
    蓝色的矩阵(输入图像)对粉色的矩阵(filter)进行矩阵内积计算并将三个内积运算的结果与偏置值b相加(比如图中的计算:2+(-2+1-2)+(1-2-2)+1= 2-3-3+1=-3),计算后的值就是绿框矩阵的一个元素。

    卷积层总结:
    接收三维输入:W∗W∗D
    给出4个参数(hyperparameters):
    卷积核的数量 K ,卷积核的尺寸F(F∗F∗D),Stride S,Padding P
    输出一个三维单元

    2.池化层(Pooling Layer)

    池化(pool)即下采样(down samples),目的是为了减少特征图,简化网络计算复杂度,同时进行特征压缩,以提取主要特征。池化操作对每个深度切片独立,规模一般为 2*2,相对于卷积层进行卷积运算。

    池化层进行的运算一般有以下几种:

    • 最大池化(Max Pooling)。取4个点的最大值。这是最常用的池化方法。
    • 均值池化(Mean Pooling)。取4个点的均值。
    • 高斯池化。借鉴高斯模糊的方法。不常用。
    • 可训练池化。训练函数 ff ,接受4个点为输入,出入1个点。不常用。

    最常见的池化层是规模为 2x2, 步幅为 2,对输入的每个深度切片进行下采样(因而池化操作将保存深度大小不变)。每个MAX操作对四个数进行,如下图所示:

    3.全连接层(Fully-connected layer)

    全连接层主要连接所有的特征,将输出值送给分类器。
    如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。


    CNN的优点

    其实不止是在图像方面,在深度神经网络中,会经常使用CNN结构。
    总结起来,它的优点有以下几个方面:

    1.局部感知(Local Connection)

    人对外界的认知是从局部到全局的(如之前的拆分数字'7'的例子),图像的空间联系也是局部的像素联系较为紧密,距离较远的像素相关性较弱(非常好理解,如下图 ”金光穿孔“,天空与天空相近,水面与水面相近,桥洞与桥洞相近;但天空与桥洞像素离得远,相关性也较弱)


    因此,每个神经元不需要对全局图像进行感知,只需要对局部进行感知,然后在更高层的网络中将局部信息综合起来就可以得到全局信息。
    2.权值共享(Weight Sharing)

    定义:A feature detector (such as a vertical edge detector) that's useful in one part of the image is probably useful in another part of the image.

    权值共享也叫参数共享(Parameter Sharing)。图像的局部统计特征在整幅图像上具有重复性(即位置无关性)。即如果图像中存在某个基本图形,该基本图形可能出现在任意位置,那么不同位置共享相同权值可实现在数据的不同位置检测相同的模式。
    比如我们在第一个窗口卷积后得到的特征是边缘,那么这个卷积核对应的就是边缘特征的提取方式,那么我们就可以用这个卷积核去提取其它区域的边缘特征。

    因此,权值共享就是从一个局部区域学习到的信息,可以应用到图像的其它地方去。即用一个相同的卷积核去卷积整幅图像时,相当于对图像做一个全图滤波。一个卷积核对应的特征比如是边缘,那么用该卷积核去对图像做全图滤波,就是将图像各个位置的边缘都滤出来。而一副图像中的不同的特征,靠多个不同的卷积核实现

    拿下图做个非常形象的举栗!你的卷积核在图像左边检测到了鸣人的特征,对于图像右边的影分身鸣人是同样适用的!你提取的这个特征是和鸣人的位置无关的!


    通过局部感知和权值共享,可以有效的进行特征提取和减少需要学习的参数的个数。并减轻了过拟合。同时权值共享还赋予了卷积网络对平移的容忍性。

    3.稀疏连接(Sparsity of Connections)

    定义:In each layer, each output value depends only on a small number of inputs.

    直观的理解就是,卷积输出的每一个数值(像素),只与卷积核大小的像素值有关,与卷积核范围之外的其它像素无关。


    如上图的卷积计算示例所示,右边绿色的这个 0 是通过 3×3 的卷积计算得到的,它只依赖于这个 3×3 的输入的单元格,右边这个输出单元(元素 0)仅与 36 个输入特征中 9 个相连接。而且其它像素值都不会对输出产生任影响。
    4.平移不变(Translation Invariance)

    即使把图片移动几个像素,这张图片依然具有非常相似的特征。这个非常好理解,就好像你自拍的时候稍微动了一下,对机器来说,那应该还是你呀!


    CNN是怎么实现这个特性的呢?卷积神经网络中一般还包含有池化层(Pooling)。池化层的降采样,能很好的聚合特征、降维来减少运算量,赋予了模型对轻度形变的容忍性,提高了模型的泛化能力。例如,平移后,MaxPooling的输出,在一定范围内还是相同的(不变)。

    总结一下,CNN主要有以下几个优点:

    • 局部感知
    • 权值共享
    • 稀疏连接
    • 平移不变

    参考资料

    详解CNN卷积神经网络
    蒋竺波-CNN入门讲解专栏(知乎)
    CSDN-七月在线实验室-卷积为什么如此强大?
    CNN初步认识(局部感知、权值共享)
    《吴恩达深度学习公开课》第四讲-卷积神经网络
    卷积神经网络——卷积层、池化层意义
    卷积神经网络CNN中的各种意义
    One by One [ 1 x 1 ] Convolution

    相关文章

      网友评论

        本文标题:卷积神经网络CNN

        本文链接:https://www.haomeiwen.com/subject/cxkdhqtx.html