你可以在样本图像上尝试一下,并用 DIGITS 对图像分割进行可视化。你会得到类似图 12 的图像,在此你能看到网络在建立时任意的分类每件事。结果证明这种建立是 SYNTHIA 中最具代表的目标分类,该网络通过在建立时标记所有东西也慢慢地学到了 35% 的准确率。处理网络欠拟合训练集的方法都有哪些呢? 更长的训练:观察损失曲线,因为训练看起来已经达到了高点所以毫无办法。该网络已经进入了一个局部最小化,难以逃脱。 增加学习率并减小 batch 大小:这可能激励陷入局部最小化的网络探索周围环境外的东西,尽管这增加了网络偏离的风险。 增加模型的大小:这可能增加了模型的表达性。 我发现的另一个在计算机视觉上表现极好的方法是迁移学习。
图 12:在 SYNTHIA 数据集上使用随机权重初始化训练 FCN-Alexnet 时,DIGITS 中图像分割的样本可视化。该网络在建立的时候就分类了每件事。 你不必从随机初始化权重开始来训练模型。在很多情况下,它有助于重新使用网络在另一个数据集上训练时学习到的知识。这在使用 CNNs(卷积神经网络)的计算机视觉当中尤其如此,因为许多的低维特征(线、角、形状、纹理)直接适用于任何的数据集。因为图像分割是在像素的级别上进行分类,因此图像分类数据集中的迁移学习是有意义的,例如,ILSVRC2012。这在使用 Caffe 时显得相当简单—当然这会有一个或两个问题!记住,在 Alexnet 的 fc6 当中,权重的形状为 4096×9216。在 FCN-Alexnet 的 conv6 当中,权重的形状为 4096×256×6×6。这个数量与权重的数量完全相同,但是因为形状的不同,Caffe 无法自动携带权重给 FCN-Alexnet。该操作可以使用 net surgery 来进行,其示例可以在 Github 上的 DIGITS 存储库中找到。net surgery 的作用是将参数从完全连接层转移到它们对应的卷积层上。但是你可能会发现,直接从公共的 DIGITS 模型库上下载预训练模型会更加容易。图 13 显示了模型库的预览:单击「FCN-Alexnet」旁边的「导入」,DIGITS 将会下载预训练模型。
另一个相关的担心是如何初始化之前在文本上添加的上采样层,因为这一层并非是初始化的 Alexnet 模型:在 FCN 论文中,建议随机初始化相关权重并且使网络进行学习它们。论文的作者随后意识到,以这样的方式初始化这些权重也很简单,即通过进行双线性插值,该层仅充当放大镜。在 Caffe 中,这是通过向该层添加 weight_filler {type: "bilinear"} 指令来完成的。 使用预训练的 FCN-Alexnet 模型时,你会注意到精度会快速地超过 90%,并且当测试独立的图片的时候(如图 14 所示)结果将会是一个更令人信服的图像分割,拥有者 9 个不同的对象类的检测。然而,你可能会稍微有些失望地看到对象的轮廓都非常粗糙。阅读下一部分和最后一部分,了解如何进一步提升我们的分割模型的精度和准确度。
图 14:使用 ILSVRC2012 预训练的 Alexnet 在 SYNTHIA 数据集上训练 FCN-Alexnet 时 DIGITS 中图像分割的样本可视化。 精细分割 记住,添加到 FCN-Alexnet 的新的上采样层将 conv7 的输出放大了 32 倍。在实践当中,这意味着网络对每一个 32×32 的像素方块都会进行单独的预测,这解释了为什么对象的轮廓如此粗糙。FCN 论文中介绍了另一个解决这个限制的好方法:添加跳过链接,直接将 pool3 和 pool4 重定向到网络的输出。因为这些合并层在网络当中进一步回退,它们在低维特征上操作并且可以捕获到更加精细的细节。在被称为 FCN-8 的网络架构中,FCN 论文介绍了基于 VGG-16 的网络,其最终的输出是 pool3 上采样的总和的 8 倍,pool4 的上采样的 2 倍和 conv7 的 4 倍,如图 15 所示。这导致网络可以在更精细的颗粒上进行预测,下降到 8x8 的像素块。
图 15: FCN-8 跳过链接的图示—来源:FCN 论文 (责任编辑:本港台直播) |