Caffe 使用结构化文本文件(structured text files)来定义网络架构,其所使用的文本文件是基于谷歌的 Protocol Buffer。你可以阅读 Caffe 采用的方案:https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto。其中大部分内容在这一部分的神经网络训练的时候都不会用到,但是了解这些构架对于使用者还是很有用的,因为在后面的步骤里我们将会对它们进行调整。AlexNet 的 prototxt 文件是这样的,一个实例: https://github.com/BVLC/caffe/blob/master/models/bvlc_alexnet/train_val.prototxt。 我们将会对这个神经网络进行 30 次 epochs,这意味着网络将会进行学习(运用我们的训练图片)并自行测试(运用我们的测试图片),然后根据训练的结果调整网络中各项参数的权重值,如此重复 30 次。每一次 epoch 都会输出一个分类准确值(Accuracy,介于 0% 到 100% 之间,当然值越大越好)和一个损失度(Loss,所有错误分类的比率,值越小越好)。理想的情况是我们希望所训练的网络能够有较高的准确率(Accuracy)和较小的损失度(Loss)。 初始训练的时候,所训练网络的准确率低于 50%。这是情理之中的,因为第一次 epoch,atv,网络只是在随意猜测图片的类别然后任意设置权重值。经过多次 epochs 之后,最后能够有 87.5% 的准确率,和 0.37 的损失度。完成 30 次的 epochs 只需不到 6 分钟的时间。
我们可以上传一张图片或者用一个 URL 地址的图片来测试训练完的网络。我们来测试一些出现在我们训练和测试数据集中的图片:
网络的分类结果非常完美,当我们测试一些不属于我们训练和测试数据集的其他图片时:
分类的准确率直接掉下来了,误把 seahorse 分类为 dolphin,更糟糕的是网络对这样的错误分类有很高的置信度。 事实是我们的数据集太小了,根本无法用来训练一个足够好的神经网络。我们需要数万乃至数百万张图片才能训练一个有用的神经网络,用这么多的图片也意味着需要很强劲的计算能力来完成所有的计算过程。 训练尝试 2:微调 AlexNet 怎么微调网络 从头设计一个神经网络,收集足量的用以训练这个网络的数据(如,海量的图片),并在 GPU 上运行数周来完成网络的训练,这些条件远非我们大多数人可以拥有。能够以更加实际——用较小一些的数据集来进行训练,我们运用一个称为迁移学习(Transfer Learning)或者说微调(Fine Tuning)的技术。Fine tuning 借助深度学习网络的输出,运用已训练好的神经网络来完成最初的目标识别。 试想使用神经网络的过程就好比使用一个双目望远镜看远处的景物。那么当你第一次把双目望远镜放到眼前的时候,你看到的是一片模糊。当你开始调焦的时候,你慢慢可以看出颜色、线、形状,然后最终你可以分辨出鸟的外形,在此之上你进一步调试从而可以识别出鸟的种类。 在一个多层网络中,最开始的几层是用于特征提取的(如,边线),之后的网络层通过这些提取的特征来识别外形「shape」(如,一个轮子,一只眼睛),然后这些输出将会输入到最后的分类层,分类层将会根据之前所有层的特征积累来确定待分类目标的种类(如,判断为猫还是狗)。一个神经网络从像素、线形、眼睛、两只眼睛的确定位置,这样的步骤来一步步确立分类目标的种类(这里是猫)。 我们在这里所做的就是给新的分类图片指定一个已训练好的网络用于初始化网络的权重值,而不是用新构建网络自己的初始权重。因为已训练好的网络已经具备「看」图片特征的功能的,我们所需要的是这个已训练的网络能「看」我们所建图片数据集——这一具体任务中特定类型的图片。我们不需要从头开始训练大部分的网络层——我们只需要将已训练网络中已经学习的层转接到我们新建的分类任务上来。不同于我们的上一次的实验,在上次实验中网络的初始权重值是随机赋予的,这次实验中我们直接使用已经训练网络的最终权重值作为我们新建网络的初始权重值。但是,必须去除已经训练好的网络的最后分类层并用我们自己的图片数据集再次训练这个网络,即在我们自己的图片类上微调已训练的网络。 (责任编辑:本港台直播) |