为啥我需要在迁移学习中预训练权重

Posted

技术标签:

【中文标题】为啥我需要在迁移学习中预训练权重【英文标题】:Why I need pre-trained weight in transfer learning为什么我需要在迁移学习中预训练权重 【发布时间】:2019-06-15 18:39:02 【问题描述】:

我正在学习使用一些预训练模型(vgg16、vgg19、...)的迁移学习,我想知道为什么我需要加载预训练的权重来训练我自己的数据集。

我可以理解我的数据集中的类是否包含在用于训练预训练模型的数据集中。比如VGG模型是在Imagenet数据集中用1000个类训练的,我的模型是对猫狗进行分类,猫狗也在Imagenet数据集中。但是这里我的数据集中的类不在这个数据集中。那么预训练的权重有什么帮助呢?

【问题讨论】:

【参考方案1】:

您不必使用预训练网络来为您的任务训练模型。但是,在实践中,使用预训练网络并将其重新训练到您的任务/数据集通常更快,并且通常您最终会得到更好的模型,从而产生更高的准确性。如果您没有大量训练数据,情况尤其如此。

为什么更快?

事实证明,(相对)独立于数据集和目标类,前几层收敛到相似的结果。这是由于低层通常充当边缘、角点和其他简单结构检测器的事实。 Check out this example 将不同层的过滤器“反应”到的结构可视化。已经训练了较低层,将较高层适应您的用例会快得多。

为什么更准确?

这个问题更难回答。恕我直言,这是因为您用作迁移学习基础的预训练模型是在大量数据集上训练的。这意味着获得的知识会流入您重新训练的网络,并将帮助您找到更好的损失函数的局部最小值。

如果您处于拥有大量训练数据的舒适环境中,您可能应该从头开始训练模型,因为预置模型可能“将您引向错误的方向”。 在this master thesis 你可以找到一堆任务(小数据集、中等数据集、小语义差距、大语义差距),其中比较了 3 种方法:微调、特征提取 + SVM,从头开始。微调在 Imagenet 上预训练的模型几乎总是更好的选择。

【讨论】:

以上是关于为啥我需要在迁移学习中预训练权重的主要内容,如果未能解决你的问题,请参考以下文章

当输入形状不同时,keras 中的迁移学习

第二十三节,迁移学习和数据扩充

风格迁移论文总结

图像分类迁移学习需要负样本吗?

YOLOv4 迁移学习/微调

TensorFlow从1到2迁移学习