卷积运算
Dense层与卷积层的根本区别在于,Dense层从输入特征空间中学到的是全局模式(比如对于MNIST数字,全局模式就是涉及所有像素的模式),而卷积层学到的是局部模式(对于图像来说**,局部模式就是在输入图像的二维小窗口**中发现的模式),如图8-1所示。在上面的示例中,窗口尺寸都是3×3。
图8-1 图像可以被分解为局部模式,比如边缘、纹理等
这个重要特性使卷积神经网络具有以下两个有趣的性质。
卷积神经网络学到的模式具有平移不变性(translation invariant)(学到的特征和位置无关)。在图片右下角学到某个模式之后,卷积神经网络可以在任何位置(比如左上角)识别出这个模式。对于密集连接模型来说,如果模式出现在新的位置,它就需要重新学习这个模式。这使得卷积神经网络在处理图像时可以高效地利用数据(因为视觉世界本质上具有平移不变性),它只需要更少的训练样本就可以学到具有泛化能力的数据表示。卷积神经网络可以学到模式的空间层次结构(spatial hierarchies of patterns)。第一个卷积层学习较小的局部模式(比如边缘),第二个卷积层学习由第一层特征组成的更大的模式,以此类推,如图8-2所示。这使得卷积神经网络能够有效地学习越来越复杂、越来越抽象的视觉概念,因为视觉世界本质上具有空间层次结构。如果对于大脑视觉神经的工作原理有所了解的同学就知道大脑的工作原理正是如此。
图8-2 视觉世界形成了视觉模块的空间层次结构:基本的线条和纹理组合成简单对象,比如眼睛或耳朵。这些简单对象又组合成高级概念,比如“猫”
卷积运算作用于被称为特征图(feature map)的3阶张量,它有2个空间轴(高度和宽度)和1个深度轴(也叫通道轴)。对于RGB图像,深度轴的维度大小为3,因为图像有3个颜色通道:红色、绿色和蓝色。对于黑白图像(比如MNIST数字图像),深度为1(表示灰度值)。卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换,生成输出特征图。该输出特征图仍是一个3阶张量,它有宽度和高度,深度可以任意取值,因为输出深度是该层的参数。深度轴的不同通道不再像RGB那样代表某种颜色,而是代表**滤波器(filter)**。滤波器对输入数据的某一方面进行编码。比如,某个层级较高的滤波器可能编码这样一个概念:“输入中包含一张人脸。”
在MNIST示例中,第一个卷积层接收尺寸为(28, 28, 1)的特征图,并输出尺寸为(26,26, 32)的特征图,也就是说,它在输入上计算了32个滤波器。对于这32个输出通道,每个通道都包含一个26×26的数值网格,它是滤波器对输入的响应图(response map),表示这个滤波器模式在输入中不同位置的响应,如图8-3所示。
图8-3 响应图的概念:表示某个模式在输入中不同位置是否存在的二维图
这就是特征图这一术语的含义:深度轴上的每个维度都是一个特征(滤波器),而2阶张量output[:, :, n]是这个滤波器在输入上的响应的二维图。卷积由以下两个关键参数定义。从输入中提取的图块尺寸:这些图块尺寸通常是3×3或5×5。本例采用3×3,这是很常见的选择。输出特征图的深度:卷积所计算的滤波器的数量。本例第一层的深度为32,最后一层的深度为128。对于Keras的Conv2D层,这些参数就是向层传入的前几个参数:Conv2D(output_depth, (window_height, window_width))。
卷积的工作原理是这样的:在3维输入特征图上滑动(slide)这些3×3或5×5的窗口,在每个可能的位置停下来并提取周围特征的3维图块[形状为(window_height,window_width, input_depth)]。然后将每个这样的3维图块与学到的权重矩阵[叫作卷积核(convolution kernel),对所有图块都重复使用同一个卷积核]做张量积,使其转换成形状为(output_depth,)的1维向量。每个图块得到一个向量,然后对所有这些向量进行空间重组,将其转换成形状为(height, width, output_depth)的3维输出特征图。输出特征图中的每个空间位置都对应输入特征图中的相同位置(比如输出的右下角包含输入右下角的信息)。举个例子,利用3×3的窗口,向量output[i, j, :]来自于3维图块input[i-1:i+1, j-1:j+1, :]。整个过程详见图8-4。
输出的宽度和高度可能与输入的宽度和高度不同,原因有二:边界效应,这可以通过对输入特征图进行填充来消除;步幅,稍后会给出其定义。我们来深入了解一下这些概念。