我正在使用一些预先训练的模型(vgg16,vgg19等)来学习迁移学习,我想知道为什么我需要加载预先训练的权重来训练自己的数据集。
我可以理解我的数据集中的类是否包含在使用预训练模型训练的数据集中。例如,对VGG模型进行了Imagenet数据集中的1000个类的训练,而我的模型是对也在catnetnet数据集中的cat-dog进行分类。但是这里我的数据集中的类不在此数据集中。那么预训练的体重有什么帮助呢?
答案 0 :(得分:3)
您不必使用预先训练的网络即可为您的任务训练模型。但是,在实践中,使用预训练的网络并将其重新训练到任务/数据集通常会更快,并且通常最终会得到更好的模型,从而产生更高的准确性。如果您没有很多训练数据,则尤其如此。
为什么更快?
事实证明,(相对)独立于数据集和目标类别,前几层收敛为相似的结果。这是由于以下事实:低层通常充当边缘,拐角和其他简单结构的检测器。 Check out this example可视化过滤器“反应”到的不同层的结构。已经培训了较低的层,使较高层适应您的用例会更快。
为什么更准确?
这个问题很难回答。恕我直言,这是由于您在大量数据集上训练了用作传输学习基础的预训练模型。这意味着获得的知识会流入您的训练有素的网络,并且将帮助您找到更好的损失函数的局部最小值。
如果您遇到的情况很麻烦,那么您有大量的训练数据,您可能应该从头开始训练模型,因为保留的模型可能会“指向错误的方向”。 在this master thesis中,您可以找到一堆任务(小型数据集,中等数据集,较小的语义鸿沟,较大的语义鸿沟),其中比较了3种方法:微调,特征提取+ SVM,从头开始。在Imagenet上微调经过预训练的模型几乎总是一个更好的选择。