本文参考自如下文章https://blog.csdn.net/u014381600/article/details/71511794
https://blog.csdn.net/qq_28659831/article/details/78985797
仅方便自己学习使用 如有侵权 请联系删除
文章参考翻译自cs231n
其实我们常用的直接finetune pre-trained model就属于迁移学习(Transfer Learning)的一种。因为我们很少在训练一个新任务时从零开始训练,一个是由于训练时间限制,另一个时训练样本过大存储空间也不一定允许,如ImageNet数据经济120万张图片,1000个类别,是很麻烦的从头开始训练(train from scratch)。因此我们的迁移学习通常有三种情况:下面根据你本身数据库的特点有几种情况可参考:
1:新的数据库较小,并且和pre-trained model所使用的训练数据库相似度较高:
由于数据库较小,在进行finetune存在overfit的风险,又由于数据库和原始数据库相似度较高,因此二者不论是local feature还是global feature都比较相近,所以此时最佳的方法是把CNN网络当做特征提取器然后训练一个分类器进行分类
2:新的数据库较大,并且和pre-trained model所使用的训练数据库相似度较高:
很明显,此时我们不用担心overfit,因此对全部网络结构进行finetune是较好的。
3:新的数据库较小,并且和pre-trained model所使用的训练数据库差异很大:
由于数据库较小,不适合进行finetune,由于数据库差异大,应该在单独训练网络结构中较高的层,前面几层local的就不用训练了,直接固定权值。在实际中,这种问题下较好的解决方案一般是从网络的某层开始取出特征,然后训练SVM分类器。
3:新的数据库较大,并且和pre-trained model所使用的训练数据库差异很大:
本来由于数据库较大,可以从头开始训练的,但是在实际中更偏向于训练整个pre-trained model的网络。
其他建议:
1:不要随意移除原始结构中的层或者更改其参数,因为网络结构传导是一层接着一层的,你改了某层的参数,在往后传导的过程中就可能得不到预想的结果。
2:Learning rates学习率:不应该设置的太大,因为我们finetune的前提就是这个模型的权重很多是有意义的,但是你学习率过大的话就会存在更新过快,破坏了原来好的权重信息,一般在finetune时学习率一般设置在1e-5,从头开始训练的话可以设置的大一点:1e-3.
翻译完成,接下来讲一下在tensorflow和caffe中如何实现只更新网络中的某些层的权重,而保持某些层参数固定:
A:caffe中:一个较好的参考
不更新权重的意思就是改层的学习率始终为0,因此在网络中将对应的参数设置为0:
在layer里面加上param { lr_mult: 0 }就可以了,比如全连接层里面:
layer {
type: "InnerProduct"
param { # 对应第1个参数blob的配置,也就是全连接层的参数矩阵W的配置
lr_mult: 0 # 学习率为0,其他参数可以看caffe.proto里面的ParamSpec这个类型
}
param { # 对应第2个参数blob的配置,也就是全连接层的偏置项b的配置
lr_mult: 0 # 学习率为0
}
}
train_params =network.all_params
new_train_params=[]
for ij in train_params:
print ij
new_train_params=train_params[3:]
for kk in new_train_params:
print kk
# exit()
optimizer = tf.train.AdamOptimizer(learning_rate=model_config['learning_rate']).minimize(cost,var_list=new_train_params)
在写优化函数时,var_list的含义就是需要BP更新权重的层,格式是list,可以根据网络结构自己指定,
new_train_params=train_params[3:]#指定只前三层不更新,只更新后面的层
2.2:数据增强不只是有faster rcnn一种截取方式,还有(FCIS) https://github.com/msracver/FCIS (CAM) http://cnnlocalization.csail.mit.edu/
会上解答:这不是过拟合的问题,这是域迁移(domain bias)问题。比如在动物图片的分类上做的很好的网络并不一定会在家具的分类上表现很好。
解决方案:这是迁移学习(transfer learning)领域研究的问题。对于域偏移问题目前主要的解决方法有以下几个:
(1)fine tune。直接用原来的网络中的相关参数,作为新的初始参数,用小的学习率重新训练。这种方法相当于重新训练,代价大。
(2)one-shot learning,zero-shot learning,few-shot learning。不需要、或利用新的数据集中很少的样本利用已有模型完成迁移学习。
(3)segment everything。(学习中)