可以看出,除非指数级地增加训练时长,MLP模型无法提供给我更好的结果。因此,我转而采用CNN(卷积神经网络),看看他们在这个数据集上的表现,以及是否能够提高训练的准确度。 CNN的结构如下: 我使用了3个卷积的模块,每个模块由以下部分组成: 32个5*5的filter 线性整流函数(ReLU)作为激活函数 4*4的最大值池化层 最后一个卷积模块输出的结果经过平整化后会被传递到一个拥有64的神经元的隐藏层上,随后通过一个drop out rate = 0.5处理后传递到输出层。 最终训练的结果记录如下: 准确率15.75%,尽管与MLP模型相比有所提升,但每个周期的运行时间也增加了。 而更重要的是,数据集中最大类别所含图片数量约占总数17.6%左右。 只要把所有的图片都归到最大的类别,我们就能够得到比MLP、CNN训练出来的模型更好的结果(ノへ ̄、)。 此外,增加更多的卷积模块也会大大增加训练时长。 于是,我转而去采用预训练模型,这样我不需要重新训练我的整个结构,只需要针对其中的几层进行训练即可。 因此,我采用了在ImageNet数据集上预先训练好的VGG16模型,这个模型可以在Keras库中找到。 模型的结构如下所示: 在VGG16结构的基础上,我只将softmax层的1000个输出改为16个,从而适应我们这个问题的情景,随后重新训练了dense layer。 跟MLP和CNN相比,这个结构的准确率能够达到70%。同时,使用VGG16最大的好处是大大减少了训练时间,只需要针对dense layer进行训练,所需时间基本可以忽略。 4.怎样使用预训练模型? 当在训练经网络的时候我们的目标是什么?我们希望网络能够在多次正向反向迭代的过程中,找到合适的权重。 通过使用之前在大数据集上经过训练的预训练模型,我们可以直接使用相应的结构和权重,将它们应用到我们正在面对的问题上。这被称作是“迁移学习”,即将预训练的模型“迁移”到我们正在应对的特定问题中。 在选择预训练模型的时候你需要非常仔细,如果你的问题与预训练模型训练情景下有很大的出入,那么模型所得到的预测结果将会非常不准确。 举例来说,如果把一个原本用于语音识别的模型用来做用户识别,那结果肯定是不理想的。 幸运的是,Keras库中有许多这类预训练的结构。 ImageNet数据集已经被广泛用作训练集,因为它规模足够大(包括120万张图片),有助于训练普适模型。ImageNet的训练目标,是将所有的图片正确地划分到1000个分类条目下。这1000个分类基本上都来源于我们的日常生活,比如说猫猫狗狗的种类,各种家庭用品,日常通勤工具等等。 在迁移学习中,这些预训练的网络对于ImageNet数据集外的图片也表现出了很好的泛化性能。 既然预训练模型已经训练得很好,我们就不会在短时间内去修改过多的权重,在迁移学习中用到它的时候,往往只是进行微调(fine tune)。 在修改模型的过程中,atv,我们通过会采用比一般训练模型更低的学习速率。 5. 微调模型的方法 特征提取 我们可以将预训练模型当做特征提取装置来使用。具体的做法是,将输出层去掉,然后将剩下的整个网络当做一个固定的特征提取机,从而应用到新的数据集中。 采用预训练模型的结构 我们还可以采用预训练模型的结构,但先将所有的权重随机化,然后依据自己的数据集进行训练。 训练特定层,冻结其他层 另一种使用预训练模型的方法是对它进行部分的训练。具体的做法是,将模型起始的一些层的权重保持不变,重新训练后面的层,得到新的权重。在这个过程中,我们可以多次进行尝试,从而能够依据结果找到frozen layers和retrain layers之间的最佳搭配。 如何使用与训练模型,是由数据集大小和新旧数据集(预训练的数据集和我们要解决的数据集)之间数据的相似度来决定的。 下图表展示了在各种情况下应该如何使用预训练模型: 场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言) (责任编辑:本港台直播) |