第7章 卷积神经网络
本章的主题是卷积神经网络( Convolutional Neural Network , CNN )。CNN 被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以 CNN 为基础。本章将详细介绍 CNN 的结构,并用Python 实现其处理内容。
7.1 整体结构
首先,来看一下 CNN 的网络结构,了解 CNN 的大致框架。 CNN 和之前介绍的神经网络一样,可以像乐高积木一样通过组装层来构建。不过,CNN 中新出现了卷积层( Convolution 层)和池化层( Pooling 层)。卷积层和池化层将在下一节详细介绍,这里我们先看一下如何组装层以构建 CNN 。之前介绍的神经网络中, 相邻层的所有神经元之间都有连接,这称为全连接(fully-connected) 。另外,我们用 Affine 层实现了全连接层。如果使用这个 Affine 层,一个 5 层的全连接的神经网络就可以通过图 7-1 所示的网络结构来实现。
如图 7-1 所示,全连接的神经网络中, Affine 层后面跟着激活函数 ReLU层(或者 Sigmoid 层)。这里堆叠了 4 层“ Affine-ReLU ”组合,然后第 5 层是Affine 层,最后由 Softmax 层输出最终结果(概率)。
那么, CNN 会是什么样的结构呢?图 7-2 是 CNN 的一个例子。
如 图 7-2 所 示, CNN 中新增了 Convolution 层 和 Pooling 层。 CNN 的层的连接顺序是“Convolution - ReLU -(Pooling)”(Pooling层有时会被省略) 。这可以理解为之前的“ Affi ne - ReLU ”连接被替换成了“ Convolution -ReLU - ( Pooling )”连接。
还需要注意的是,在图 7-2 的 CNN 中,靠近输出的层中使用了之前的“ Affine - ReLU ”组合。此外,最后的输出层中使用了之前的“ Affine -Softmax ”组合。这些都是一般的 CNN 中比较常见的结构。
7.2 卷积层
CNN 中出现了一些特有的术语,比如填充、步幅等。此外,各层中传递的数据是有形状的数据(比如, 3 维数据),这与之前的全连接网络不同,因此刚开始学习 CNN 时可能会感到难以理解。本节我们将花点时间,认真学习一下 CNN 中使用的卷积层的结构。
7.2.1 全连接层存在的问题
之前介绍的全连接的神经网络中使用了 全连接层(Affine层) 。在全连接层中,相邻层的神经元全部连接在一起,输出的数量可以任意决定。全连接层存在什么问题呢?那就是数据的形状被“忽视”了。
比如,输入数据是图像时,图像通常是高、长、通道方向上的 3 维形状。但是,向全连接层输入时,需要将 3 维数据拉平为 1 维数据。实际上,前面提到的使用了 MNIST 数据集的例子中,输入图像就是 1 通道、高 28 像素、长 28 像素的( 1 , 28 , 28 )形状,但却被排成 1 列,以 784 个数据的形式输入到最开始的Affine 层。
图像是 3 维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、 RBG 的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等, 3 维形状中可能隐藏有值得提取的本质模式。但是,因为全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。
而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以 3 维数据的形式接收输入数据,并同样以 3 维数据的形式输出至下一层。因此,在 CNN 中,可以(有可能)正确理解图像等具有形状的数据。
另外, CNN 中,有时将卷积层的输入输出数据称为特征图(featuremap) 。其中,卷积层的输入数据称为 输入特征图 ( input feature map ),输出数据称为 输出特征图 ( output feature map )。本书中将“输入输出数据”和“特征图”作为含义相同的词使用。
7.2.2 卷积运算
卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。在介绍卷积运算时,我们来看一个具体的例子(图 7-3 )。