0.前言:
本章节主要会介绍一下卷积神经网络的基础结构,批量归一化的一些方法
1.卷积神经网络:
在上一章节中,我们在第一个例子中带大家看了一个相对简单的卷积神经网络的例子。这一章中我们会更加详细地介绍这个概念。这里我们先下一个定义:卷积神经网络的本质是通过模拟人类的视觉系统来处理信息。
在上一章中,我们了解了一下一个简单的神经网络的结构,一个卷积神经网络的基本结构一般包括致包括:卷积层、激活函数、池化层、全连接层、输出层等,卷积神经网络的大致结构一般如下图所示
1.1 从图像分类来看卷积神经网络结构:
任何的网络都会有输入,这里我们先来看看卷积神经网络的输入
图像在计算机中往往是通过特定数字的组合来表示的,比较常见的形式就是矩阵。这里我们给一个简单的例子
这是一个非常典型的灰度矩阵,数值从0-255,0是最白,255是最黑,中间的数值代表灰色
他所代表的图片就是下面的图片8
实际的图像往往是彩色的,那么应该怎么表示呢?
任何的图像,本质上都是红、绿、蓝三者的组合,我们可以将图像表示为这三个图像的重叠,这里就需要引入通道的概念了,三个通道的本质通道的本质是图片中的红、绿、蓝三种数据的张量表示
总结一下,神经网络的输入三个维度,分别是高,宽以及通道数,我们需要先对每个通道的数据其进行向量化表示,最终形成整体的输入,过程如下图所示
神经网络实际上是由默认的输入格式的,一般来说输入的尺寸为100x100像素,考虑通道就变成了100x100x3像素
那么此时我们就可以通过全连接神经网络来进行处理了。但是在实际的过程中为了避免过拟合,在做图像识别的时候,考虑到图像本身的特性,并不一定 需要全连接,即不需要每个神经元跟输入的每个维度都有一个权重。下面我们展示一个比较经典的全链接神经网络的结构
模型的输出就的本质是一个独热向量,独热向量里面,类别对应的值为 1,其余类别对应的值为 0。这里我们可以看看这个图片来探讨:
这是一只猫猫,我们可以看到y ′中,猫猫的一项为1,而其他项为0,值得留意的是,独热向量的长度也直接决定了模型能够识别的种类的数目
1.2 神经网络的优化
1.2.1 检测模式与感受野
各位可以思考一下我们平时是如何确定一个东西的?我们往往会抓住事物的独特特征,比如看到太阳我们就会想到白天,看到月亮就会想到夜晚。神经网络实际上也可以模拟我们的这种认识方式
下面是一个例,神经网络在识别一张鸟的图片的时候,如果有三个神经元分别看到鸟嘴、眼睛、鸟爪 3 个模式,这就代表类神经网络看到了一只鸟
南无这个时候我们就不需要看一整张图片,只需要看看图片的某一小个范围、检测特定的模式是否出现,就可以确认图片中是什么东西了
在这个基础上我们引入了感受野即:每个神经元都只关心自己的感受野里面发生的事情
这里蓝色神经元会将3x3x3的数值变成一个27维的向量,并给每个维度一个权重,加上偏置在给下一层的神经元当输入
图片会有多个区域,故此需要多个神经元来守备
在这里相信大家也发现了感受野涉及的重要性了,一般在做图像识别的时候,某些模式不只出现在某一个通道里面,所以会看全部的通道。
那么不同感受野的情况下要如何来涉及呢?我们往往会将把左上角的感受野往右移一个步幅,就制造出一个新的守备范围,即新的感受野。 移动的量称为步幅,下面就是一个步幅为2的感受野,分别为纵向和垂直
那如果感受野太大了,超出了图像范围,就需要来补零了,也就是俗称的0填充,当然也有其他的填充方式,比如均值填充
这里有个问题,感受野设计的时候为了避免神经元重复计算,是否要保证他们之间不重叠呢?
答案是否定的 因为假设感受野完全没有重叠,如果有一个模式正好出现在两个感受野的交界上面, 就没有任何神经元去检测它,这个模式可能会丢失,所以希望感受野彼此之间有高度的重叠
1.2.2 相同模式与共享参数
这里出现了个问题,图像中有n种模式,这个时候n种模式往往不会出现在固定的位置,南无这个时候怎么办呢?我们是否需要在每个感受野中都放置一个感受器呢?或者有没有更好的方法呢?
这个时候我们采用的方法叫做参数共享,也就是两个神经元的权重完全相同,途中我们可以看到上下两个神经元的守备野是不一样的,但是他们的参数是相同的,故此他们的输出也不会是永远一样的、因为输入和范围都不太一样
这里是一个比较常见的设置,每个 感受野都只有一组参数,就是上面感受野的第 1 个神经元会跟下面感受野的第 1 个神经元共用参数,上面感受野的第2个神经元跟下面感受野的第2个神经元共用参数,依次类推。每个感受野都只有一组参数,这些参数也被叫做滤波器
这里我们来一个小总结,感受野加上参数共享后就成为了卷积层,用到卷积层的网络就叫卷积神经网络。
1.2.3 下采样与汇聚
我们可以发现,在将一张比较大的图像做模式检测的时候,我们可以考虑把奇数行和偶数行都抽掉,这个时候不太会影响模式的的检测。
这里值得留意的是,汇聚本身没有阐述,他不是一个层次,他本质和Sigmoid和ReLU等激活函数类似,每个滤波器会产生一组数字把这些数字分组,可以 2 × 2 个 一组,3 × 3、4 × 4 也可以,这里我们以最大汇聚为例
这里要留意的是在实践中,汇聚和卷积是往往交替出现的。不过近年来越来越多的网络开始使用卷积来替代汇聚。汇聚的本质上还是为了将运算量降下来,但是近两年来算力的提升使得汇聚本身变得不是必要选项了
2 批量归一化
在处理误差的时候,我们有时候会发现误差的表面有时候非常崎岖,当误差表面崎岖或参数在不同方向上斜率差异大时,网络的训练会变得困难。特征值范围差异较大会导致误差表面在不同方向上斜率差异很大,影响训练的效率。
我们即便是采用adam这类的动态学习率方案,也无法很好的处理这个问题。
经网络中的每一层都会对数据进行处理,随着网络层数的增加,前一层的输出会成为后一层的输入,导致输入分布的变化。这种变化在批量归一化提出之前被称为内部协变偏移。当前一层的参数更新后,输出的分布会发生变化,进而影响下一层的梯度计算。这种情况下,下一层的参数更新可能基于旧的分布进行,从而使得更新方向出现偏差。
那么此时我们就需要使用特征归一化,
z值归一化
z值归一化的本质是我们把不同笔数据即不同特 征向量,同一个维度里面的数值,把它取出来,对于每个维度 i,计算其平均值(mean) mi 和标准差(standard deviation)σi。
在深度学习中,就会有更加有效的批量归一化,批量归一化的本质是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力