什么是预训练模型
- 预训练模型就是已经用数据集训练好了的模型
- 现在我们常用的预训练模型,比如:VGG16/19,Resnet等模型,并且已经用大型数据集来做训练,如:Imagenet,得到训练好的模型参数
什么情况下使用微调
- 手头的数据集类型和预训练模型的数据集内容相似,因为不同数据集模型提取的特征不同,所以相应的参数训练后也是不同的
- 数据集内容相似,但是数据量太少
- 计算资源不够
- 自己创建的模型正确率较低
为什么要微调
- 用大型数据集训练后的模型,具备提取浅层基础特征和深层抽象特征的能力
- 浅层卷积层提取基础特征,比如:边缘,轮廓等基础特征
- 深层卷积层提取抽象特征,比如:整个脸型
- 全连接层根据特征组合进行评分分类
不做微调:
- 从头开始训练模型,需要大量的数据,计算时间和计算资源
- 存在模型不收敛,参数不够优化,准确率低,模型泛化能力低,容易过拟合等风险
做微调,可以一定程度上缓解上述存在的问题。
模型微调注意事项
- 通常是截断预训练好网络的最后一层(softmax层),用我们自己的softmax层进行替换。如:Imagenet上预训练好的网络输出是1000个类别,我们的实际项目输出类别是10项,则可以进行上述替换。然后,我们在网络上运行预先训练的权重,确保执行交叉验证。
- 使用较小学习率来训练网络。由于我们预计预先训练网络的权重相对于随机初始化的权重已经相当不错,我们不想过快的扭曲它们,通常做法是使初始学习率比从头开始训练的初始学习率小10倍
- 如果手头数据集数量过少,我们可以只训练最后一层,如果数据集数量中等,我们可以冻结预训练网络的前几层权重。因为网络的前几层提取的是基础特征,如:边缘,轮廓。我们希望保持这些权重不变,让我们的网络更专注于学习后续深层中特定于数据集的特征
不同数据集下使用微调
- 数据集少,但内容相似度高。这种情况下,我们修改最后几层或者softmax层的输出类别
- 数据集少,内容相似度低。这种情况下,我们冻结预训练网络的初始层(比如K层),然后训练剩余的N-K层。因为数据集内容相似度低,因此我们需要对较高层进行重新训练
- 数据集大,但内容相似度低。这种情况下,需要根据自己的数据从头开始训练神经网络
- 数据量大,内容相似度高。这种情况下,十分理想了,预训练模型也是最有效的。使用模型的最好方法是保留模型的结构和初始权重,然后,我们可以使用预先训练的模型中的权重来重新训练该模型。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。