《白话深度学习与Tensorflow》读书笔记--第6章 卷积神经网络

6.1与全连接网络的对比

①全连接方式:每一个神经元节点的输入都来自于上一层的每一个神经元的输出。

    全连接网络:整个网络的每一层都是以全连接方式完成的。

②全连接网络的优点:每个输入纬度的信息都 会传播到其后的任何一个节点中去,会最大程度利用这个维度所贡献的因素

    全连接网络的缺点:由于都是全连接方式,使得训练过程中所要更新的权重非常多,因此训练速度很慢。更不适合图片识别这种大规模输入的分类处理

③卷积神经网络(convolutional neural network, CNN):是一种前馈神经网络,它的神经元可以响应一部分覆盖范围内的周围单元,对于大规模的模式识别有着非常好的性能表现。

CNN的两个比较大的特点

    1.卷积网络有至少一个卷积层,用来提取特征。

    2.卷积网络的卷积层通过权值共享的方式进行工作,大大减少权值w的数量,提高了速度。

 

6.2 卷积是什么

①定义:在泛函分析中,卷积是一种函数的定义。它是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g(经过翻转和平移)的重叠部分面积

②例如h(x)=f(x)*g(x)= 积分符号f(t)g(x-t)dt。

先不管x,那么f和g函数就是以t为变量的固定函数,然后加上x,就是对g进行翻转移动,那么x就是帮助图像移动的。

在随着x变化的移动过程中,由于g(x-t)移动产生的h(x)的对应变化就是整个卷积公式的意义---一个移动中用x进行取样的过程,或者说是特征提取。

③如果实在理解不了也没关系,卷积的含义和推导很少接触到,只要形成一个印象:一个移动过程中做乘积。

6.3 卷积核

卷积核的表达式: f(x) = wx+b

想象这里有一张图片:

             

图片一共有5*5=25个像素点,每一个像素点只有1和0的两种取值。

假定卷积核的w = [1,1,1,1,1,1,1,1,1],b = [0],

w由9个1构成,在图中,先指定前三行和前三列的3*3的小方框,从左到右、从上往下的这9个点作为x向量,挨个与w相乘完成内积操作,并与b相加。过程为:

f(x) = 1*1+1*1+1*1+1*0+1*1+1*1+1*0+1*0+1*1+0=6

那么右边3*3的小方框的左上角的格子会输出一个6,我们把6单独存在一个存储空间里,这个存储空间叫做这个卷积层的Feature Map。这个操作把9个点的信息压缩成1一个点,是有损压缩,而且无法还原,不过这确实是一个信息抽象的过程,也就是特征的提取。

我们把这个操作继续从左往右、从上往下每次移动一个方格,就相当于前面说的f(t)和g(x-t)两个函数通过x变化来滑动一样做这样一个卷积操作。得到以下的3*3的方框

需要注意的是,这里我们的w和b是随意设定的,而在实际工作中,w和b在适当初始化后,是通过一轮一轮的训练,在降低损失函数的目的下不断学习而学习到的,而不是指定出来的

在卷积核的f(x) = wx+b输出后,还可能会跟着一个激励函数,这个激励函数一般是ReLU。

 

6.4 卷积层其他参数

在卷积核对前面输入的这一层数据向量进行扫描时,还需要注意两个参数:①Padding(填充)②Striding(步幅)

1.Padding=x: 指用x个像素单位来填充输入图像(向量)的边界。

如上图,在图像周围设置了两个单位宽度的Padding,通常是填充0

用途:

①保持边界信息:如果不加Padding的话,最边缘的像素点信息其实只被卷积核扫描了一次,而图像中间的像素点信息则会被扫描很多次,在一定程度上降低了边界上信息的参考度加上Padding,实际上就是把边缘往中央移动了

②如果输入的图片的尺寸有差异,可以通过Padding来进行补齐,使得输入的尺寸一致,以免频繁调整卷积核和其它层的工作模式。

2.Stride = x:指步幅,在卷积层工作的时候,Stride可以理解为每次滑动的单位。

①Stride设置较小:细密程度好,效果好,速度慢。

②Stride设置较大:速度快,效果不好。

所以在实际工作时,要经过测试,取合适的Stride值。

 

6.5 池化层

池化层的作用实际上对Feature Map所做的数据处理又进行了一次所谓的池化处理。

常见的池化处理有:

①Max Pooling——最大化

②Mean Pooing(也叫Average Pooling)——平均化

以Stride=2的2*2的Filler(滤波器,类似于卷积的特征处理)为例

                  

做了Max Pooling后,将得到右边的结果,就是临近的2*2的方块中取最大值

而同理,Meaning Pooling就是取平均值,结果如下:

池化层的作用:

① 又进行一次的特征提取,可以减小下一层数据的处理量

② 又一次的特征提取,有更大的可能获取更为抽象的信息,防止过拟合,或者说提高一定的泛化性。

③ 由于池化后更加抽象,所以能够对输入的微小变化产生更大的容忍,也就是保持不变性。这里的容忍包括图形的少量平移、旋转以及缩放等变化。

另外,注意:池化层在CNN网络中不是一个必需的组件,一些新的CNN网络也没有池化层

 

6.6 典型CNN网络

将前面讲到的的零件:卷积、卷积核、池化层,以及卷积网络中使用的激励函数。拼接起来,就可以组成CNN网络。

如今,有很多网络出现了“杂交”的特点——网络有很多层,而这些层的设计各异,使得整个网络不再体现出典型的纯粹的全连接网络、卷积网络或者其他网络的独有特点。

下面介绍一个相对比较典型的卷积网络:VGG-16(是由Visual Geometry Group组织发布)。其中16是指其中有16个带有参数的网络层。VGG-16是一个带有完整的卷积层、池化层、全连接层的神经网络。

如上图所示,这就是一个VGG-16的结构示意图,一张图从左向右逐层通过卷积层池化层最终产生分类输出的流程概要。

一张图片从左侧输入进去经过64个不同的3*3的卷积核,每次Stride=1的挪移步长,生成了64个小尺寸的”图片"(或者称为Feature Map更合适),把这64个小尺寸的图片”拼接“在一起,又通过64个3*3的卷积核生成了后一层的Feature Map。然后经过一个Max Pooling层来做池化。然后这个Max Pooling中的信息又被当做一个”图片“向后输入,通过128个3*3的卷积核进一步提取特征......这样一层一层输入到最后。

在这个过程中,可以看到卷积核数量实在逐步增多的,64个、128个、256个、512个,而每个卷积核提取过后的信息所占用的空间越来越小,这个过程就是一个特征提取的过程。

在最后有一个1000个节点的SOFTMAX层来做分类使用。训练的过程中同样是把一种损失函数Loss(w)描述成各个卷积核中权重w的函数,然后进行凸优化来找到极值点,这个过程与BP网络大同小异。

近年来,越来越多的网络模型放入了多个卷积层,能够在网络深度增加的过程中加快收敛速度并且可以让网络有更好的泛化特性。

GoogleNet网络是2014年发表的一个著名网络,它的深度已经达到了22层。它引入一种全新的结构(见上图的左下角),结构的名称叫Inception(没错,与电影《盗梦空间》同名。。。)

在这个结构中,前面输入过来的向量会在这一层上展开成为多个不同卷积核处理的并列结构,这样可以在一定程度上加大下一层输入的信息量。其中3*3和5*5的卷积核会大大提升分类识别的抽象能力(内卷积核越大,这个特点相对越明显)。

Inception结构的引入大大增加了网络的宽度和深度,使得网络的信息容纳能力变强,而使使用Inception结构的网络比没有使用该结构的网络的性能要提高2~3倍。

 

6.7 图片识别

 

图片、音频、视频、大段的文字描述等这些模式识别相关的应用场景用以往传统的机器学习应用技术进行处理效果都不甚理想。但是卷积神经网络处理这类问题却很好。原因是什么呢?

先说人类对事物的认知,不会因为物体一些细小的改变,而改变人类对它的认知,比如你不会因为你女朋友今天戴了眼镜,就不认识她了。即一旦一个事物被我们认识后,只要它发生变化的程度不足以改变我们对它认知的判断,那么我们就仍然可以对它做“保持原判”的认知。换句话说,这是一种对细微变化的免疫作用,或者说是对细微变化的不敏感性

 

在卷积网络中,卷积核滑动的过程中我们发现一个特性,那就是个别向量值的变化对于刺激的结果的影响是极为有限的,这是一种用科学方法、通过量化的手段去表示敏感程度的过程,而这个量化的过程是通过训练得到的。

当一幅图被卷积核扫描后产生一张Feature Map A,如果我们改变这张图的少量像素,无论是颜色改变还是改变线条,甚至是微小的角度旋转,重新经过卷积核扫描产生的Feature Map B中,这些向量值改变的很少。而经过多层卷积核扫描后,这种差异在网络较深的层面已经非常不敏感了

综上,我们可以得到两个观点:

① 少量的噪声、讹误对深度卷积神经网络的分类影响是非常有限的,它具有更强的容错能力。

② 由于卷积网络这样一种特性,也使得其泛化性更好,因为即使分类对象跟训练样本库的特征有一定差异,这种“模糊化”处理的结果会使得它们在较深的网络中有类似的刺激结果

 

所以从原理分析上看,神经网络的工作原理更像是“记忆"一个大概的”印象“,而不像是”思考“或者"推理”。你在训练样本中告诉它样例,它会很好地记下来,并且能够让它有一定的泛化性,但是复杂的、带有一定分析和判断的能力,神经网络自身是不会有的

 

6.8  输出层激励函数——SOFTMAX

6.8.1 SOFTMAX

    

 

从样子上看,这种方式跟普通的全连接层没什么不同,但是激励函数的形式却大大不同。

首先后面一层作为预测分类的输出节点,每一个节点就代表一个分类,那么7个节点就最多能够表示7个分类的模型。任何一个节点的激励函数都是

{\displaystyle \sigma (\mathbf {z} )_{j}={\frac {e^{z_{j}}}{\sum _{k=1}^{K}e^{z_{k}}}}}   for j = 1, …, K.,其中i就是节点的下标次序,而zi = wi*x + bi, 也就是说这是一个线性分类模型的输出作为自然常数e的指数。

另外,这一层有这样一个特性,就是{\displaystyle \sigma (\mathbf {z} )_{j}={\frac {e^{z_{j}}}{\sum _{k=1}^{K}e^{z_{k}}}}}的和为1。

从物理意义上理解,一个样本通过网络进行分类的时候在每一个节点上输出的值都是小于等于1的,是它从属于这个分类的概率。

训练:

训练的过程就是一个训练样本,然后给分类标签一个下标序号(不同的序号代表不同的类别)。对应的节点给1,其他给0。

举个栗子,有7张不同的图片,分别代表飞机、汽车、轮船、猫、狗、鸟、太阳,那么按照顺序,这些图片分别应该被标记为:

飞机 = [1,0,0,0,0,0,0]   汽车 = [0,1,0,0,0,0,0]     轮船 = [0,0,1,0,0,0,0]  ......  鸟 = [0,0,0,0,0,1,0]     太阳 = [0,0,0,0,0,0,0,1]

训练的时候依次把图片和其对应的向量标签放入网络训练就可以了。

检测:

一张待分类的图片输出时,其实会产生类似于这样的一种形式:

[0.005, 0.005, 0.030, 0.620, 0.101, 0.020, 0.219]

每个维度就是这个样本对应类别的概率解释,届时可以选择输出值最大的那个就可以了,意为该图片属于这种分类的可能性最大。

 

这种激励函数通常用在神经网络的最后一层作为分类器的输出,有7个节点就可以做7个不同样本类别的判断,有1000个节点就可以做1000个不同样本类别的判断。

6.8.2 交叉熵

   SOFTMAX这种激励函数使用的损失函数比较特殊,叫做交叉熵损失函数。

在介绍交叉熵损失函数之前,先介绍“信息熵”。信息熵简单说,就是信息的杂乱程度或者意外程度的量化描述。

公式为:\mathrm{H} (X)=\sum _{​{i}}{​{\mathrm  {P}}(x_{i})\,{\mathrm  {I}}(x_{i})}=-\sum _{​{i}}{​{\mathrm  {P}}(x_{i})\log _{b}{\mathrm  {P}}(x_{i})},

在这里b对数所使用的,通常是2,自然常数e,或是10,不过在一次应用中的所有信息熵都必须采用同一个底,不能把不同底的对数求出的熵再做加或者比较,这样完全没有意义,例如3米+2英尺同样没有意义。

有这样一个现象:对于某个消息,它产生的种类(结果)越多,每个种类(结果)概率越均等,则信息熵就越大;反之,消息产生的种类越单一,概率产生越偏向其中的一个消息,那么熵值越小。最极端的情况就是,只有一种消息,而概率100%的情况,这种情况熵为0。

而交叉熵损失函数的公式为:

交叉熵损失函数,对于每一种分类都是伯努利分布,要么“是”,要么“不是”。

对于最后一层SOFTMAX的每一个输出节点来说,都是上面这个样子,有多少个x输入的向量,有节点上的w矩阵跟它做内积,加上偏置b,再把结果通过Sigmoid函数输出到一个0~1之间的概率值。

Sigmoid函数公式:

 

训练过程:

把样本向量和标签向量同时放入模型的。在放入的时候自然样本没有特殊理由的情况下都是会将期望的分类维度设置为1,其余的维度设置为0,用这样的形式来标记分类标签向量。

   也就是说,上面的yi,在拟合的过程中会有这样的一个事实。

① yi = 0, 损失函数变为(1-yi)ln(1-a)=ln(1-a),这个很好理解,本来不该分成这一类的,但是1-a却成为了分作这一类的概率,ln(1-a)为负数。从y=ln(1-a)的图像上也可以看出来,a越接近1产生的负值的绝对值就越大,也可以解释为拟合所产生的分类概率与实际应该产生的分类概率分歧越大。反之,a越接近0则产生比较小损失值越小。

② yi = 1, 损失函数变为yi lna,此时产生很类似的情况,a越接近1,则损失值越小,a越接近0,则损失值越大。

 

在整个训练过程中,实际在每个样本进行拟合时都会产生这样一个效果,那就是诸如这样一对一对的目标分类向量值和拟合分类向量值之间的差值:

                     

所以,交叉熵就是一种当前拟合出来的模型分类所产生的信息熵和这种“客观上”的信息熵的差距。

根据这种针对“客观世界”的统计产生的分类的“信息熵”就是分类目标的熵,而在拟合过程中产生的熵实际上跟这个熵值是有差距的,这个差距就是在使用交叉熵损失函数的情况下所定义的熵的差距,那么优化的方向就是向着调整待定系数减小“熵差”的方向运动。而且通过观察,可以发现这个差值越大,导数越大,学习的效率越高,这当然是一个很好的性质。通过训练不断调整众多卷积核中w的大小,来决定一个合适的特征值提取的量化值,这就是卷积网络训练的基本原理了。 

 

5. 独热编码

独热编码就是一种用一个向量的每一个维度来标识一种性质有无的方式

实际上,在之前的6.8.1已结提及过了。

具体来说,性别这个属性,可以直接做成伯努利分布的解释,用1标识男性,0来标识女性。作为向量输入的时候可以输入:

           [1] 和 [0]

但是用独热编码的方式就会表示为:

         [1,0]  和  [0,1]

再举一个典型的例子:假如在一个模型建立中需要输入几个不同的汽车类别,例如汽车、SUV、MPV、皮卡、大巴、货车、其他这几个类别。

在这里用独热编码比较合适点,可以设定为:

轿车:[1,0,0,0,0,0,0]

SUV:[0,1,0,0,0,0,0]

MPV:[0,0,1,0,0,0,0]

皮卡:[0,0,0,1,0,0,0]

大巴:[0,0,0,0,1,0,0]

货车:[0,0,0,0,0,1,0]

其他:[0,0,0,0,0,0,1]

这种情况下再使用0、1、2、3......这些数字标注它们就不合适了。因为这些数字在一个维度上有着大小关系的,在这样设定表示对象的过程中这种关系被强加给了这些对象,而这样一种关系在被证明之前是不应该这样直接赋值给对象的,这样会干扰模型对数据认知的过程。而较好的方法是,把它们做成独热编码的形式,使它们成为正交的维度

这种独热编码在深度学习汇总应用很广泛。

 

6.10 小结

        卷积神经网络的核心部分就是卷积核。在很多复杂的应用中,对于同一个输入的向量由于不同尺寸的卷积核扫描,产生不同的特征描述Feature Map输入到后端,也可能在不同的层用不同尺寸的卷积核去提取特征。

        卷积神网络的特征就是有卷积层,进而带来的好处就是收敛速度比较快并且泛化能力更好

        卷积神经网络可能会由于模型的需要仅仅出现在一个网络中的某几层的位置,也可能会在一个模型的多层中出现,运用是很灵活的。

       需要注意的是,不是用了卷积核的网络就是卷积神经网络。当一个网络应用了许多其他的结构而使得网络体现出很多更为独特的特性的时候,命名时更倾向使用标新立异的方式,后面的深度残差网络就是很典型的例子。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值