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

1. 全连接层

1.1 全连接层网络结构

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

带全连接层的卷积神经网络结构 全连接层 卷积层_数据


Affine 层后面跟着激活函数 ReLU 层(或者 Sigmoid 层)。这里堆叠了4 层Affine-ReLU 组合,然后第 5 层是 Affine 层,最后由 Softmax 层输出最终结果(概率)。

全连接层的主要作用是将输入图像在经过卷积和池化操作后提取的特征进行压缩,并且根据压缩的特征完成模型的分类功能。如图4-6所示是一个全连接层的简化流程。

带全连接层的卷积神经网络结构 全连接层 卷积层_卷积_02


其实全连接层的计算比卷积层和池化层更简单,如图 4-6 所示的输入就是我们通过卷积层和池化层提取的输入图像的核心特征,与全连接层中定义的权重参数相乘,最后被压缩成仅有的10个输出参数,这10个输出参数其实已经是一个分类的结果,再经过激活函数的进一步处理,就能让我们的分类预测结果更明显。将 10个参数输入到 Softmax 激活函数中,激活函数的输出结果就是模型预测的输入图像对应各个类别的可能性值。

1.2 全连接层缺陷

在全连接层中,相邻层的神经元全部连接在一起,输出的数量可以任意决定。

全连接层存在什么问题呢?那就是数据的形状被“忽视”了。比如,输入数据是图像时,图像通常是高、长、通道方向上的 3 维形状。但是,向全连接层输入时,需要将 3 维数据拉平为 1 维数据。实际上,前面提到的使用了 MNIST 数据集的例子中,输入图像就是 1 通道、高 28 像素、长 28 像素的(1, 28, 28)形状,但却被排成1 列,以 784 个数据的形式输入到最开始的 Affine 层。

图像是3 维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、RBG 的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等,3 维形状中可能隐藏有值得提取的本质模式。

但是,因为全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。

2. 卷积神经网络

卷积层(Convolution Layer)的主要作用是对输入的数据进行特征提取,而完成该功能的是卷积层中的卷积核(Filter)。

我们可以将卷积核看作一个指定窗口大小的扫描器,扫描器通过一次又一次地扫描输入的数据,来提取数据中的特征。如果我们输入的是图像数据,那么在通过卷积核的处理后,就可以识别出图像中的重要特征了。

那么,在卷积层中是如何定义这个卷积核的呢?卷积层又是怎样工作的呢?下面通过一个实例进行说明。

假设有一张 32×32×3 的输入图像,其中 32×32 指图像的高度×宽度,3 指图像具有 RGB 三个色彩通道,即红色(Red)、绿色(Green)和蓝色(Blue),我们定义一个窗口大小为 5×5×3 的卷积核,其中 5×5 指卷积核的高度×宽度,3 指卷积核的深度,对应之前输入图像的 RGB 三个色彩通道,这样做的目的是当卷积核窗口在输入图像上滑动时,能够一次在其三个色彩通道上同时进行卷积操作。

注意,如果我们的原始输入数据都是图像,那么我们定义的卷积核窗口的宽度和高度要比输入图像的宽度和高度小,较常用的卷积核窗口的宽度和高度大小是 3×3 和 5×5。

在定义卷积核的深度时,只要保证与输入图像的色彩通道一致就可以了,如果输入图像是3个色彩通道的,那么卷积核的深度就是3;如果输入图像是单色彩通道的,那么卷积核的深度就是1,以此类推。如图4-1所示为单色彩通道的输入图像的卷积过程。

带全连接层的卷积神经网络结构 全连接层 卷积层_数据_03

如图 7-2 所示,CNN 中新增了 Convolution (卷积层) 层和 Pooling (池化层) 层。CNN 的层的连接顺序是 Convolution - ReLU -(Pooling)Pooling 层有时会被省略)。这可以理解为之前的 Affi ne - ReLU 连接被替换成了 Convolution -ReLU -(Pooling) 连接。

带全连接层的卷积神经网络结构 全连接层 卷积层_全连接_04


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

2.1 卷积比全连接层的优势

卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3 维数据的形式接收输入数据,并同样以 3 维数据的形式输出至下一层。

因此,在 CNN 中,可以(有可能)正确理解图像等具有形状的数据。

2.2 卷积运算

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

带全连接层的卷积神经网络结构 全连接层 卷积层_数据_05


滤波器在有的文献中也称作为 “卷积核”。

计算过程如下:

1 * 2 + 2 * 0 + 3 * 1 + 0 * 0 + 1 * 1 + 2 * 2 + 3 * 1 + 0 * 0 + 1 * 2 = 15
2 * 2 + 3 * 0 + 0 * 1 + 1 * 0 + 2 * 1 + 3 * 2 + 0 * 1 + 1 * 0 + 2 * 2 = 16

图 7-4 中展示了卷积运算的计算顺序。对于输入数据,卷积运算以一定间隔滑动滤波器的窗口并应用。这里所说的窗口是指图7-4 中灰色的3 × 3 的部分。如图7-4 所示,将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。然后,将这个结果保存到输出的对应位置。将这个过程在所有位置都进行一遍,就可以得到卷积运算的输出。

带全连接层的卷积神经网络结构 全连接层 卷积层_数据_06


CNN 中,滤波器的参数就对应之前的权重。并且,CNN 中也存在偏置。包含偏置的卷积运算的处理流如图7-5 所示。

如图7-5 所示,向应用了滤波器的数据加上了偏置。偏置通常只有1 个(1 × 1)(本例中,相对于应用了滤波器的4 个数据,偏置只有1 个),这个值会被加到应用了滤波器的所有元素上。

带全连接层的卷积神经网络结构 全连接层 卷积层_全连接_07

2.3 填充

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

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

带全连接层的卷积神经网络结构 全连接层 卷积层_带全连接层的卷积神经网络结构_08


如图 7-6 所示,通过填充,大小为 (4, 4) 的输入数据变成了 (6, 6) 的形状。然后,应用大小为 (3, 3) 的滤波器,生成了大小为 (4, 4) 的输出数据。这个例子中将填充设成了 1,不过填充的值也可以设置成 2、3 等任意的整数。

使用填充主要是为了调整输出的大小。比如,对大小为 (4, 4) 的输入数据应用 (3, 3) 的滤波器时,输出大小变为 (2, 2),相当于输出大小比输入大小缩小了 2 个元素。这在反复进行多次卷积运算的深度网络中会成为问题。

为什么呢?因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。

在刚才的例子中,将填充的幅度设为 1,那么相对于输入大小 (4, 4),输出大小也保持为原来的 (4, 4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。

2.4 步幅

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

带全连接层的卷积神经网络结构 全连接层 卷积层_全连接_09


在图 7-7 的例子中,对输入大小为 (7, 7) 的数据,以步幅 2 应用了滤波器。通过将步幅设为 2,输出大小变为 (3, 3)。像这样,步幅可以指定应用滤波器的间隔。

综上,增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。

如果将这样的关系写成算式,会如何呢?接下来,我们看一下对于填充和步幅,如何计算输出大小。

这里,假设输入大小为 (H,W) ,滤波器大小为 (FH, FW) ,输出大小为 (OH,OW) ,填充为 P ,步幅为 S 。此时,输出大小可通过式 (7.1) 进行计算。

带全连接层的卷积神经网络结构 全连接层 卷积层_带全连接层的卷积神经网络结构_10


计算示例如下:

带全连接层的卷积神经网络结构 全连接层 卷积层_卷积_11


如果式 7.1 中当输出大小无法除尽时(结果是小数时),需要采取报错等对策。顺便说一下,根据深度学习的框架的不同,当值无法除尽时,有时会向最接近的整数四舍五入,不进行报错而继续运行。

2.5 三维数据的卷积运算

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

带全连接层的卷积神经网络结构 全连接层 卷积层_卷积_12


带全连接层的卷积神经网络结构 全连接层 卷积层_全连接_13


需要注意的是,在 3 维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。在这个例子中,输入数据和滤波器的通道数一致,均为 3。

滤波器大小可以设定为任意值(不过,每个通道的滤波器大小要全部相同)。这个例子中滤波器大小为 (3, 3),但也可以设定为 (2, 2)、(1, 1)、(5, 5) 等任意值。

再强调一下,通道数只能设定为和输入数据的通道数相同的值(本例中为3)。

2.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)

带全连接层的卷积神经网络结构 全连接层 卷积层_带全连接层的卷积神经网络结构_14


如果要在通道方向上也拥有多个卷积运算的输出,就需要用到多个滤波器(权重)。用图表示的话,如图7-11 所示。

带全连接层的卷积神经网络结构 全连接层 卷积层_全连接_15


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

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

卷积运算中(和全连接层一样)存在偏置。在图7-11 的例子中,如果进一步追加偏置的加法运算处理,则结果如下面的图7-12 所示。

带全连接层的卷积神经网络结构 全连接层 卷积层_数据_16


图 7-12 中,每个通道只有一个偏置。这里,偏置的形状是 (FN, 1, 1) ,滤波器的输出结果的形状是 (FN, OH,OW) 。这两个方块相加时,要对滤波器的输出结果 (FN, OH,OW) 按通道加上相同的偏置值。另外,不同形状的方块相加时,可以基于 NumPy 的广播功能轻松实现。

2.7 批处理

通过批处理,能够实现处理的高效化和学习时对 mini-batch 的对应。

我们希望卷积运算也同样对应批处理。为此,需要将在各层间传递的数据保存为 4 维数据。具体地讲,就是按 (batch_num, channel, height, width) 的顺序保存数据。比如,将图 7-12 中的处理改成对 N 个数据进行批处理时,数据的形状如图7-13 所示。

带全连接层的卷积神经网络结构 全连接层 卷积层_卷积_17


图7-13 的批处理版的数据流中,在各个数据的开头添加了批用的维度。像这样,数据作为 4 维的形状在各层间传递。这里需要注意的是,网络间传递的是 4 维数据,对这 N 个数据进行了卷积运算。也就是说,批处理将 N 次的处理汇总成了 1 次进行。