深度学习用于计算机视觉
卷积神经网络
下列代码将会展示一个简单的卷积神经网络。它是 Conv2D 层和 MaxPooling2D 层的堆叠。
用model.summary()查看神经网络的结构
再添加分类器,展平用Flatten(),全连接层和一个激活函数为不变函数的输出层
最终的训练结果相比之前的密集连接网络精度更高了。
密集连接层和卷积层的根本区别在于,Dense 层从输入特征空间中学到的是全局模式(比如对于 MNIST 数字,全局模式就是涉及所有像素的模式),而卷积层学到的是局部模式(对于图像来说,学到的就是在输入图像的二维小窗口中发现的模式)
卷积的特性:
卷积神经网络学到的模式具有平移不变性(translation invariant)。卷积神经网络在图像 右下角学到某个模式之后,它可以在任何地方识别这个模式,比如左上角。对于密集连 接网络来说,如果模式出现在新的位置,它只能重新学习这个模式。这使得卷积神经网 络在处理图像时可以高效利用数据(因为视觉世界从根本上具有平移不变性),它只需 要更少的训练样本就可以学到具有泛化能力的数据表示。
卷积神经网络可以学到模式的空间层次结构(spatial hierarchies of patterns),见图5-2。 第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推。这使得卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(因为视觉世界从根本上具有空间层次结构)。
在 MNIST 示例中,第一个卷积层接收一个大小为 (28, 28, 1) 的特征图,并输出一个大 小为 (26, 26, 32) 的特征图,即它在输入上计算 32 个过滤器。对于这 32 个输出通道,每个通道都包含一个 26×26 的数值网格,它是过滤器对输入的响应图(response map),表示这个过滤器模式在输入中不同位置的响应(见图5-3)。这也是特征图这一术语的含义:深度轴的每个维度都是一个特征(或过滤器),而2D 张量 output[:, :, n] 是这个过滤器在输入上的响应的二维空间图(map)。
卷积的工作原理:在 3D 输入特征图上滑动(slide)这些 3×3 或 5×5 的窗口,在每个可能的位置停止并提取周围特征的 3D 图块[形状为 (window_height, window_width, input_ depth)]。然后每个3D 图块与学到的同一个权重矩阵[叫作卷积核(convolution kernel)]做张量积,转换成形状为 (output_depth,) 的 1D 向量。然后对所有这些向量进行空间重组, 使其转换为形状为 (height, width, output_depth) 的 3D 输出特征图。输出特征图中的每个空间位置都对应于输入特征图中的相同位置(比如输出的右下角包含了输入右下角的信息)。举个例子,利用3×3 的窗口,向量 output[i, j, :] 来自3D 图块 input[i-1:i+1, j-1:j+1, :]。
对于 Conv2D 层,可以通过 padding 参数来设置填充,这个参数有两个取值:"valid" 表 示不使用填充(只使用有效的窗口位置);"same" 表示“填充后输出的宽度和高度与输入相同”。 padding 参数的默认值为 "valid"。