卷积神经网络特别适用于图像识别。特点如下:</br>
A. 对于卷积神经网络来说,并不是所有上下层神经元都能直接相连,而是通过“卷积核”作为中介。同一个卷积核在所有图像是共享的,图像通过卷积操作后仍然保留原先的位置关系。</br>
B. 若没有卷积操作,图像学习的参数量是灾难级的。</br>
C. 利用语音语谱结构中的局部信息,卷积神经网络照样能应用在语音识别中。
4.6.1 卷积神经网络基本模型及基本概念
以MNIST数字图像分类输入28×28像素为例,基本模型如下:输入层有28×28个输入神经元,这些神经元用于对 MNIST 图像的像素强度进行编码;卷积层采用一个5×5局部感受野和 20 个特征映射,其结果是一个20×24×24隐藏特征神经元层;池化层采用2×2最大值池化,遍及20个特征映射,结果是一个20×12×12隐藏特征神经元层;全连接隐藏层连接最大值池化层的每一个神经元;输出层也是一个全连接层。
局部感受野:
将输入像素连接到一个隐藏神经元层,不是把每个输入像素连接到每个隐藏神经元,而是把输入图像进行小的局部区域的连接。
将第一个隐藏层中的每个神经元连接到一个输入神经元的一个小区域。如\(5×5\)的区域(25像素)。这个输入图像的区域被称为隐藏神经元的局部感受野。每个连接学习一个权重,隐藏神经元同时也学习一个总的偏置。
然后在整个输入图像上交叉移动局部感受野。对于每个局部感受野,在第一个隐藏层中有一个不同的隐藏神经元。从左上⻆开始一个局部感受野,然后往右一个像素移动局部感受野,连接到第二个隐藏神经元。
- 如此重复构建起第一个隐藏层。若有一个\(28×28\)的输入图像,\(5×5\)的局部感受野,那么隐藏层中就会有\(24×24\)个神经元。
- 局部感受野每次移动可以使用不同的跨距:可以往右(或下)移动 2 个像素的局部感受野,这种情况下使用了 2 个跨距,在这里大部分时候会固定使用 1 的跨距。
共享权重和偏置:
- 对\(24×24\)隐藏神经元中的每一个使用相同的权重和偏置,对第 \( j\),\(k\) 个隐藏神经元,输出为:
\(σ \)是神经元的激活函数可以是 S 型函数,\(b \)是偏置的共享值,\(w{l,m}\)是一个共享权重的5×5数组,\(a{x,y}\)来表示位置为\( x,y\)的输入激活值。 - 第一个隐藏层的所有神经元检测完全相同的特征,只是在输入图像的不同位置。在图像中应用相同的特征检测器是非常有用的,能很好地适应图像的平移不变性。
- 把从输入层到隐藏层的映射称为一个特征映射,把定义特征映射的权重称为共享权重,把以这种方式定义特征映射的偏置称为共享偏置。共享权重和偏置经常被称为一个卷积核或者滤波器。
- 为了完成图像识别需要超过一个的特征映射,一个完整的卷积层由几个不同的特征映射组成,假设有 3 个特征映射, 每个特征映射定义为一个\(5×5\)共享权重和单个共享偏置的集合。其结果是网络能够检测 3 种不同的特征,每个特征都在整个图像中可检测。 在实践中卷积网络可能使用很多的特征映射。
- 共享权重和偏置的优点:它大大减少了参与的卷积网络的参数。
- 对于每个特征映射需要\(5×5\)个共享权重,加上一个共享偏置,每个特征映射需要 26 个参数。
- 若有 20 个特征映射,那么总共有\(20×26\)个参数来定义卷积层。作为对比,假设有一个全连接的第一层,具有\(28×28\)个输入神经元,和一个相对适中的 30 个隐藏神经元,总共有\(784×30\)个权重,加上额外30 个偏置,共有 23550 个参数。
池化层:
- 池化层通常紧接着在卷积层之后使用,从卷积层输出的每一个特征映射,并且为它们准备一个凝缩的特征映射,用来是简化从卷积层输出的信息。
- 常用的池化程序:最大值混合(取阵列中激活值的最大值)、L2 混合(取阵列中激活值的平方和的平方根)。在实践中,两种技术都被广泛应用。
- 池化层的每个单元可能概括了前一层的一个\(2×2\)的区域,在最大值混合中,一个混合单元简单地输出其\(2×2\)输入区域的最大激活值,卷积层有\(24×24\)个神经元输出,混合后得到\(12×12\)个神经元。
4.6.2 卷积神经网络基本参数
图像输入参数input:
需要做卷积的输入图像,是一张量shape为[batch, in_height, in_width, in_channels],具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一。
图像边界填充参数padding:
- 相同填充:为了保证卷积前后图像的像素不变,在卷积过后,超出图像边框的部分使用补零操作,使得输入输出的图像尺寸相同。在TensorFlow的padding参数为“SAME”。
- 有效填充:采用缩小像素值的办法,在TensorFlow的padding参数值为“VALID”。
卷积核参数filter:
相当于CNN中的卷积核,是一张量shape为[filter_height, filter_width, in_channels, out_channels],具体含义是[卷积核高度,卷积核宽度,图像输入通道数,图像输出通道数],要求类型与参数input相同,filter的通道数要求与input的in_channels一致,有一个地方需要注意,第三维in_channels,就是参数input的第四维。
步长参数strides:卷积时在图像每一维的步长,是一维向量长度大于等于4
- 第一个元素值一般为1:表示在输入batch维度上的移动步长,表示不跳过任何一个样本。
- 最后一个元素一般为 1:表示在输入通道维度上的移动步长,表示不跳过任何一个输入的通道。
- 中间元素表示在真实图像维度上的移动步长,若为二维图像则分别是纵轴和横轴步长。
GPU加速参数use_cudnn_on_gpu:
bool类型,是否使用cudnn加速,默认为true。
池化核参数:
- ksize:池化的核大小。可以用kernel_h和kernel_w分别设定。
- padding: 和卷积层的pad的一样,设定图像边界处理方式。
- stride: 池化的步长,可以用stride_h和stride_w来设置。