关于对pre-trained模型的使用和理解
2018-01-05 10:01
183 查看
现在有很多在Imagenet等数据集上训练的很好的模型,当我们使用相同的网络结构时可以直接拿来调用,而不必花很多时间你去从头造轮子,毕竟这些训练好的模型已经是各个数据集的老死机了。
下面我将我自己对与训练模型的使用场景做一个简单的理解:
1. 当数据集小的时候:
A、相似度高:如果训练数据和pretrained model所用的数据相似度较高的时候,我们不需要从头造轮子,只需要修改最后的输出的softmax即可,采用已经训练好的结构来提取特征。
B、相似度低:如果训练数据和pretrained model所用的数据相似度较低,假设网络一共有n层,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,并修改最后一层的分类器的输出类即可。因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。(相似度不高的时候重新训练是很有必要的,而冻结前K层的原因是为了弥补训练数据量不充足,当然了数据量不足可以采取数据增强方法,比如:对称,旋转,随机切,扭曲等等)
2.当数据集大的时候:
A、相似度高:这个是非常好也非常难得的情况,此时只要采用pretrained模型不需要改变任何参数即可,即保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。
B、相似度低:因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。
下面我将我自己对与训练模型的使用场景做一个简单的理解:
1. 当数据集小的时候:
A、相似度高:如果训练数据和pretrained model所用的数据相似度较高的时候,我们不需要从头造轮子,只需要修改最后的输出的softmax即可,采用已经训练好的结构来提取特征。
B、相似度低:如果训练数据和pretrained model所用的数据相似度较低,假设网络一共有n层,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,并修改最后一层的分类器的输出类即可。因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。(相似度不高的时候重新训练是很有必要的,而冻结前K层的原因是为了弥补训练数据量不充足,当然了数据量不足可以采取数据增强方法,比如:对称,旋转,随机切,扭曲等等)
2.当数据集大的时候:
A、相似度高:这个是非常好也非常难得的情况,此时只要采用pretrained模型不需要改变任何参数即可,即保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。
B、相似度低:因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。
相关文章推荐
- 使用mxnet的预训练模型(pretrained model)分类与特征提取
- ubuntu下使用pre-trained模型测试caffe,找不到caffe 和 protobuf的错误
- 关于统计语言模型N-gram的理解及sirlm的使用
- 关于引用对象的使用的一点小理解
- ExcelVBA编程系列之对象模型(2):初步理解和使用Excel对象模型
- 使用包含编译模型编译模板类时出现无法理解的错误
- 关于在VS2008以下版本的MFC程序使用VS 2008 FeaturePack出现内存泄露的理解
- __atribute__使用:关于_attribute__ ((used,__section__(".xxxx")))的理解
- 自己关于指针在函数中使用的理解和总结
- 关于ios sdk5 arc(Automatic Reference Counting)的使用与理解
- 关于驱动模型的理解
- 关于flex域的理解,使用应用程序域
- 关于Java的内存模型,使用的是尚学堂的图
- 最简单的方式使用Discriminatively Trained Deformable Part Models训练自己的模型
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于strdup的使用与理解
- 关于OpenGL中模型视图投影视口变换的理解
- 关于.NET 使用堆栈来维护值类型变量的思考和理解
- 关于oracle中使用nvl函数时,对空字符串的理解
- 关于Xcode4.2中的release“不能”使用的理解