卷积|深度学习:全卷积网络( 四 )



现在可以开始训练模型了 。 这里的损失函数和准确率计算与图像分类中的并没有本质上的不同 。 因为我们使用转置卷积层的通道来预测像素的类别 , 所以在SoftmaxCrossEntropyLoss里指定了axis=1(通道维)选项 。 此外 , 模型基于每个像素的预测类别是否正确来计算准确率 。
In [16]: ctx = d2l.try_all_gpus() loss = gloss.SoftmaxCrossEntropyLoss(axis=1) net.collect_params().reset_ctx(ctx) trainer = gluon.Trainer(net.collect_params(), "sgd", {"learning_rate": 0.1, "wd": 1e-3}) d2l.train(train_iter, test_iter, net, loss, trainer, ctx, num_epochs=5)training on [gpu(0), gpu(1), gpu(2), gpu(3)]epoch 1, loss 1.3306, train acc 0.726, test acc 0.811, time 17.5 secepoch 2, loss 0.6524, train acc 0.811, test acc 0.820, time 16.6 secepoch 3, loss 0.5364, train acc 0.838, test acc 0.812, time 16.3 secepoch 4, loss 0.4650, train acc 0.856, test acc 0.842, time 16.5 secepoch 5, loss 0.4017, train acc 0.872, test acc 0.851, time 16.3 sec9.10.6预测像素类别
在预测时 , 我们需要将输入图像在各个通道做标准化 , 并转成卷积神经网络所需要的四维输入格式 。
In [17]: def predict(img): X = test_iter._dataset.normalize_image(img) X = X.transpose((2, 0, 1)).expand_dims(axis=0) pred = nd.argmax(net(X.as_in_context(ctx[0])), axis=1) return pred.reshape((pred.shape[1], pred.shape[2]))

为了可视化每个像素的预测类别 , 我们将预测类别映射回它们在数据集中的标注颜色 。
In [18]: def label2image(pred): colormap = nd.array(d2l.VOC_COLORMAP, ctx=ctx[0], dtype="uint8") X = pred.astype("int32") return colormap[X, :]
测试数据集中的图像大小和形状各异 。 由于模型使用了步幅为32的转置卷积层 , 当输入图像的高或宽无法被32整除时 , 转置卷积层输出的高或宽会与输入图像的尺寸有偏差 。 为了解决这个问题 , 我们可以在图像中截取多块高和宽为32的整数倍的矩形区域 , 并分别对这些区域中的像素做前向计算 。 这些区域的并集需要完整覆盖输入图像 。 当一个像素被多个区域所覆盖时 , 它在不同区域前向计算中转置卷积层输出的平均值可以作为 softmax 运算的输入 , 从而预测类别 。
简单起见 , 我们只读取几张较大的测试图像 , 并从图像的左上角开始截取形状为 320 × 480的区域:只有该区域用于预测 。 对于输入图像 , 我们先打印截取的区域 , 再打印预测结果 , 最后打印标注的类别(另见彩插图20) 。

In [19]: test_images, test_labels = d2l.read_voc_images(is_train=False) n, imgs = 4, [] for i in range(n): crop_rect = (0, 0, 480, 320) X = image.f ixed_crop(test_images[i], *crop_rect) pred = label2image(predict(X)) imgs += [X, pred, image.f ixed_crop(test_labels[i], *crop_rect)] d2l.show_images(imgs[::3] + imgs[1::3] + imgs[2::3], 3, n)

卷积|深度学习:全卷积网络
本文插图
小结 可以通过矩阵乘法来实现卷积运算 。全卷积网络先使用卷积神经网络抽取图像特征 , 然后通过1 × 1卷积层将通道数变换为类别个数 , 最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸 , 从而输出每个像素的类别 。在全卷积网络中 , 可以将转置卷积层初始化为双线性插值的上采样 。

本书旨在向读者交付有关深度学习的交互式学习体验 。 书中不仅阐述深度学习的算法原理 , 还演示它们的实现和运行 。 与传统图书不同 , 本书的每一节都是一个可以下载并运行的 Jupyter记事本 , 它将文字、公式、图像、代码和运行结果结合在了一起 。 此外 , 读者还可以访问并参与书中内容的讨论 。 全书的内容分为3个部分:第一部分介绍深度学习的背景 , 提供预备知识 , 并包括深度学习基础的概念和技术;第二部分描述深度学习计算的重要组成部分 , 还解释近年来令深度学习在多个领域大获成功的卷积神经网络和循环神经网络;第三部分评价优化算法 , 检验影响深度学习计算性能的重要因素 , 并分别列举深度学习在计算机视觉和自然语言处理中的重要应用 。 本书同时覆盖深度学习的方法和实践 , 主要面向在校大学生、技术人员和研究人员 。 阅读本书需要读者了解基本的Python编程或附录中描述的线性代数、微分和概率基础 。


推荐阅读