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