我们今天来训练一个模型识别 102 种花的种类,给定一个花的照片,可以识别出花名。
数据集包含 7370 幅花的图片,下面是一些示例:
我们把数据集分为下列三部分:
这里对 Training 的数据,采用了四种增广方式,比例分别为:
这里的网络我们采用一个预训练网络 ResNet-152 模型,但是我们只保留卷积层的权重,最后的分类器要替换成一个输出 102 类的全连接网络,这里的全连接网络我们有三层,输入层 2048,隐藏层 1000,输出层 102。网络示意图如下:
这里经过多次尝试后,我们决定最后选取 Adagrad 优化器,来保证训练效果最好。
这一阶段集中训练分类器,就是最后的全连接层。
因为前面的卷积层都是预训练的,可以很好地提取图像特征,因此我们先冻结卷积层的权重,只对最后一部分全连接层进行训练。
现在我们可以说全连接层的分类器已经训练好了,那接下来我们微调卷积层的权重。
这时候,取消冻结前面卷积层的权重,对整个网络全部进行训练,20 个 epoch 后,validation 得到 96.58% 的准确率:
虽然这时候网络性能已经非常好了,但我们还想继续提高一下。
这次我们将 learning rate 设置为 0.000001,只是为了对网络的权重做极其微小的调整。在训练了 10 个 epoch 之后,我们在 validation 上得到了 97.07% 的准确率:
充分证明我们的三个阶段的训练是有效的。
下面是训练曲线和学习率曲线:
我们最后在 Testing 上做测试,我们的网络竟然得到了 99.27% 的准确率,已经非常不错了!