深度学习(5)-卷积神经网络
我们将深入理解卷积神经网络的原理,以及它为什么在计算机视觉任务上如此成功。我们先来看一个简单的卷积神经网络示例,它用干对 MNIST数字进行分类。这个任务在第2章用密集连接网络做过,当时的测试精度约为 97.8%。虽然这个卷积神经网络很简单,但其精度会超过第2章的密集连接模型。
代码 8-1给出了一个简单的卷积神经网络。它是 conv2D层和 MaxPooling2D 层的堆叠,你很快就会知道这些层的作用。我们将使用第7章介绍过的函数式 API来构建模型。
代码8-1 实例化一个小型卷积神经网络
from tensorflow import keras
from tensorflow.keras import layers
inputs = keras.Input(shape=(28, 28, 1))
x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)
x = layers.Flatten()(x)
outputs = layers.Dense(10, activation="softmax")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
卷积神经网络接收的输入张量的形状为(image height,image width,image channels)(不包括批量维度)。本例中,我们设置卷积神经网络处理大小为(28,28,1)的输入,这正是 MNIST 图像的格式。
我们来看一下这个卷积神经网络的架构,如代码 8-2所示。
代码 8-2 显示模型的概述信息
model.summary()
可以看到,每个 conv2D层和 MaxPooling2D层的输出都是一个形状为(height,width,channels)的3阶张量。(张量的阶数相同,形状不同)宽度和高度这两个维度的尺寸通常会随着模型加深而减小。通道数对应传入Conv2D层的第一个参数(32、64或 128)。在最后一个 conv2D层之后,我们得到了形状为(3,3,128)的输出,即通道数为 128的3x3特征图。下一步是将这个输出传入密集连接分类器中,即 Dense 层的堆叠,你已经很熟悉了。这些分类器可以处理1阶的向量,而当前输出是3阶张量。为了让二者匹配,我们先用 Flatten 层将三维输出展平为一维,然后再添加 Dense 层。最后,我们进行十类别分类,所以最后一层使用带有 10个输出的 softmax 激活函数。下面我们在 MNIST数字上训练这个卷积神经网络。我们将重复使用的MNIST 示例中的很多代码。
由于我们要做的是带有 softmax 输出的十类别分类,因此要使用分类交叉熵损失,而且由于标签是整数,因此要使用稀疏分类交叉熵损失sparse categorical crossentropy,如代码 8-3 所示。注意此处代码执行需要网络才能执行。
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype("float32") / 255
model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
我们在测试数据上评估模型,如代码 8-4所示。
代码 8-4 评估卷积神经网络
密集连接模型的测试精度约为 97.8%,而这个简单的卷积神经网络的测试精度达到99.1%,错误率降低了约 60%(相对比例)。这相当不错!
但是,与密集连接模型相比,这个简单卷积神经网络的效果为什么这么好?要回答这个问题,我们来深入了解 Conv2D 层和 MaxPooling2D层的作用。
总结:在一定条件下,卷积神经网络在图像识别上精度优于密集链接模型。每个 conv2D层和 MaxPooling2D层的输出都是一个形状为(height,width,channels)的3阶张量。宽度和高度这两个维度的尺寸通常会随着模型加深而减小。而通道数会模型加深而增加。我的理解就是通过悬系,模型对于特征的理解越来越丰富。