第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
)。