卷积层 1 的 stride s 是 4,因此换算系数是 1/4。在所有层上重复此过程,我测定该模型的所有换算系数是 1/32,就像表 2 总结的那样。因此,解卷积层所需的 stride 大小是 32。
为了完备性,我必须要说的是卷积层的 stride 产生的输出在所有空间维度上都是输入大小的数倍这一说法并不完全正确。在实际中,向输入中增加 padding 将增加激活函数的数量。相反,使用核函数将打掉输入中的激活函数。如果你向该层提供无线长的输入,输入/输出比例将确实存在于所有(空间)维度。事实上,每个卷积(池化)层的输出都被移动了。表 2 是对这些计算的总结:
表 2 展示了网络的输出移动了 18 个像素。在此分割模型中我要用的最后一个技巧是一个层 crop 该网络的输出,并在每个边界移除 18 个额外像素。在带有 Crop 层的 Caffe 上很容易做到这一点,在下面列表中有所定义。
你可能注意到此版本的 Alexnet 要比卷积层 1 中的 padding 更多。有两个原因:一个原因是为了生成更大的初始迁移,以便于连续层招致的 offset 不被消化进图像。然而另一个主要原因是让该网络处理输入图像边界的方式是它们能够近似的碰触到网络的感受野。 终于,我有了复制 FCN-Alexnet 模型的所有东西。接下来,让我们看一下来自 SYNTHIA 数据集的新鲜图片。 SYNTHIA 数据集 SYNTHIA 数据集首次公开在论文《The SYNTHIA Dataset: A Large Collection of Synthetic Images for Semantic Segmentation of Urban Scenes》中。 图 9 展示了来自 SYNTHIA 数据集的图像样本。这些图像综合地展示了生成的带有各种目标分类的城市场景,比如建筑、道路、汽车和行人,该数据集也包括白天、黑夜不同场景下的情景。有趣的是,这些图像看起来很真实,足以迷惑人类:呃,第一张图中有人站在马路中间读报纸看起来很怪异,他肯定不怀好意!
图 8:来自 SYNTHIA 数据集的样本。左:要分割的图像;右:ground truth 在 DIGITS 5.0 中,创造一个图像分割数据集简单到点到输入和 groud-truth 图像 folders 并点击「创造」按钮。DIGITS 支持各种标记形式,比如 palette 图像(标记图像中的像素值是调色板指针)和 RGB 图像(每种颜色指代一种类别)。 在 DIGITS 中创造自己的数据集之后,你可以可视化的探索里面的内容,就像图 10 一样。
图 10:DIGITS 中的数据集探索。Top:输入图像,Bottom:标记。 训练模型 在 DIGITS 中开始训练模型所需要的只是对数据集和网络的描述。如果你认为卷积的 Alexnet 的流程有些复杂或者太耗时间:DIGITS 5.0 加上了一个模型库(model store),FCN-Alexnet 可从库中取回。 然而,如果你选择较难的方式,并创造自己的模型描述,你可能就想用到像 Kaiming(MSRA)方法这样合适的权重初始化 scheme,它如今是 Rectified Liner Units 的顶尖方法。通过在 Caffe 中向参数层加入一个 weight_filler { type: "msra" } 可轻松做到这一点。如果你在 DIGITS 中以这种方式训练模型,你可能会得到类似于图 11 的曲线。你可以看到表现有些不尽人意。验证准确率高峰在 35%(意味着验证集中只有 35% 的像素被准确标记了。)训练损失与验证损失一致,表明该网络在训练集上欠拟合。
图 11:在 Synthia 上使用 DIGITS 中的权重初始化训练 FCN-Alexnet 时的训练/验证损失和验证准确率。 (责任编辑:本港台直播) |