卷积神经网络

  卷积神经网络(CNN)被用于图像识别,语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎是以CNN为基础

1.整体结构

  CNN可以像乐高积木一样,通过组装层来构建,CNN中出现了新的卷积层池化层,这里我们先看一下如何组装层以构建CNN。

  之前介绍的神经网络中,相邻层的所有神经元之间都有连接,这称为全连接(fully-connected)网络。另外,我们用Affine层实现了全连接层。如果使用这个Affine层,一个5层的全连接的神经网络就可以通过下图所示的网络结构来实现。

nsnet神经网络训练_深度学习

  如图7-1所示,全连接的神经网络中,Affine层后面跟着激活函数ReLU层(或者Sigmoid层)。这里堆叠了4层“Affine-ReLU”组合,然后第5层是Affine层,最后由Softmax层输出最终结果(概率)。   对于CNN而言,CNN中新增了Convolution层 和Pooling层.CNN的层连接顺序是

“Convolution - Relu - (Pooling)”(Pooling层有时会被省略),这可以理解为,之前的"Affine-Relu"连接被替换成了"Convolution-Relu-(Pooling)"连接,如下图

nsnet神经网络训练_神经网络_02

  还需要注意的是,在图7-2的CNN中,靠近输出的层中使用了之前的“Affine - ReLU”组合。此外,最后的输出层中使用了之前的“Affine - Softmax”组合。这些都是一般的CNN中比较常见的结构

1.卷积层

   CNN中出现了一些特有的术语,比如填充、步幅等。此外,各层中传
递的数据是有形状的数据
(比如,3维数据)

1. 1 全连接层存在的问题

  全连接的神经网络中使用了全连接层(Affine层)。
  在全连接层中,相邻层的神经元全部连接在一起,输出的数量可以任意决定。
  在全连接层中,数据的形状被"忽视了",比如,输入数据时图像时,图像通常是 (高,长,通道)的三维形状,但是,向全连接层输入时,需要将三维数据拉平为一维数据
  实际上,针对MNIST数据集来说,输入图像就是 通道为1 ,高28像素,长28像素的(1,28,28)形状,我们用全连接的时候将他们排成1列,以784个数据的形状输入到最开始的Affine层.
  图像是3维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、RBG的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等,3维形状中可能隐藏有值得提取的本质模式。但是,因为全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。
  而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以有可能正确理解图像等具有形状的数据。
  CNN 中,有时将卷积层的输入输出数据称为特征图(feature map)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)。

1.2 卷积运算

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”

如下例子:

nsnet神经网络训练_cnn_03


  卷积运算对 输入数据 应用滤波器。在这个例子中,输入数据是有高长方向的形状的数据,滤波器也一样,有高长方向上的维度。

  假设用(height, width)表示数据和滤波器的形状,则在本例中,输入大小是(4, 4),滤波器大小是(3, 3),输出大小是(2, 2)。另外,有的文献中也会用“核”

这个词来表示这里所说的“滤波器”。

图7-4中展示了卷积运算的计算顺序。

nsnet神经网络训练_数据_04


  对于输入数据,卷积运算以一定间隔滑动滤波器的窗口并应用。这里所说的窗口是指图7-4中灰色的3 × 3的部分

  如图7-4所示,将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。然后,将这个结果保存到输出的对应位置。将这个过程在所有位置都进行一遍,就可以得到卷积运算的输出

  在全连接的神经网络中,除了权重参数,还存在偏置,CNN中,滤波器的参数就对应之前的权重,并且,CNN中也存在偏置,向应用了滤波器的数据加上偏置,偏置通常只有1个(1x1) ,在我举的例子中,相对于应用了滤波器的4个数据,偏置只有一个,这个值会被加到应用了滤波器上的所有元素上

nsnet神经网络训练_神经网络_05

1.3 填充

  在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充(padding),是卷积运算中经常会用到的处理。

  在图7-6的例子中,对大小为(4, 4)的输入数据应用了幅度为1的填充。“幅度为1的填充”是指用幅度为1像素的0填充周围。

nsnet神经网络训练_数据_06


  如图7-6所示,通过填充,大小为(4, 4)的输入数据变成了(6, 6)的形状。然后,应用大小为(3, 3)的滤波器,生成了大小为(4, 4)的输出数据。这个例

子中将填充设成了1,不过填充的值也可以设置成2、3等任意的整数。在图7-5

的例子中,如果将填充设为2,则输入数据的大小变为(8, 8);如果将填充设

为3,则大小变为(10, 10)

那么为什么要进行填充呢?

  使用填充主要是为了调整输出的大小,比如,对大小为(4, 4)的输入

数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小比输入大小缩小了 2个元素。这在反复进行多次卷积运算的深度网络中会成为问题。因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。进而使得卷积运算就可以在保持空间大小不变的情况下将数据传给下一层

1.4步幅

  应用滤波器的位置间隔称为步幅(stride)。之前的例子中步幅都是1,如果将步幅设为2,则如图7-7所示,应用滤波器的窗口的间隔变为2个元素。

nsnet神经网络训练_深度学习_07

  对输入大小为(7, 7)的数据,以步幅2应用了滤波器。通过将步幅设为2,输出大小变为(3, 3)。像这样,步幅可以指定应用滤波器的间隔。综上,增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。

接下来,我们看一下对于填充和步幅,如何计算输出大小。这里,假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为(OH, OW),填充为P,步幅为S。此时,输出大小可通过式(7.1)进行计算。

nsnet神经网络训练_数据_08

在图:7-6的例子中,我们可以看到

输入大小: (4,4) ;填充 : 1;步幅:1,滤波器大小:(3,3)

则对应输出的(OH,OW)

OH=(4+21-3)/1+1 = 4
OW=(4+2
1-3)/1+1 = 4

图7-7的例子中:

输入大小为:(7,7);填充为:0;步幅:2;滤波器大小:(3,3)

OH=(7+20-3)/1+1 = 3
OW=(7+2
0-3)/1+1 = 3

再通过上述公式进行计算的时候,如果除不尽就得采取报错等对策,根据深度学习的框架不同,当值无法除尽的时候,有时会向最接近的四舍五入,不进行报错而运行

1.5 3维数据的卷积运算

  之前的卷积运算的例子都是以有高、长方向的2维形状为对象的。但是,图像是3维数据,除了高、长方向之外,还需要处理通道方向。这里,我们按

照与之前相同的顺序,看一下对加上了通道方向的3维数据进行卷积运算的例子

  这里以3通道的数据为例,展示了卷积运算的结果。和2维数据时(图7-3的例子)相比,可以发现纵深方向(通道方向)上特征图增加了。通道方向上有多个特征图时,会按通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出,,通道数只能设定为和输入数据的通道数相同的值

nsnet神经网络训练_nsnet神经网络训练_09


运算顺序

nsnet神经网络训练_nsnet神经网络训练_10

1.6结合方块思考

  将数据和滤波器结合长方体的方块来考虑,3维数据的卷积运算会很

容易理解。

方块是如图7-10所示的3维长方体。

把3维数据表示为多维数组时,书写顺序为(channel, height, width)

比如,通道数为C、高度为H、长度为W的数据的形状可以写成(C, H, W)。

滤波器也一样,要按(channel, height, width)的顺序书写。

比如,通道数为C、滤波器高度为FH(Filter Height)、长度为FW(Filter Width)时,可以写成(C, FH, FW)

nsnet神经网络训练_神经网络_11


数据输出是1张特征图。所谓1张特征图,换句话说,就是通道数为1的特征图。那么,如果要在通道方向上也拥有多个卷积运算的输出,就需要用到多个滤波器(权重)。

nsnet神经网络训练_数据_12


通过应用FN个滤波器,输出特征图也生成了FN个。如果将这FN个特征图汇集在一起,就得到了形状为(FN, OH, OW)的方块。将这个方块传给下一层,就是CNN的处理流。

关于卷积运算的滤波器,也必须考虑滤波器的数量。因此,作为4维数据,滤波器的权重数据要按(output_channel, input_channel, height, width)的顺序书写。比如,通道数为3、大小为5 × 5的滤波器有20个时,可以写成(20, 3, 5, 5)

卷积运算中(和全连接层一样)存在偏置。

nsnet神经网络训练_cnn_13

1.7