【tensorflow】在不同层上设置不同的学习率,fine-tuning

最近一直在研究tensorflow的fine-tuning,TF关于fine-tuning这块的资料真的没有Caffe多。经过这几天的琢磨,差不多也明白了。感谢网上为数不多的开源资料。

主要方法有如下两种:

一、从graph处入手

这个方案的灵感来自于:https://www.cnblogs.com/sikyadjy/p/6861692.html

这里我重新概括下原作者的三步走:

1) 先输出层的参数变量

variables_names = [v.name for v in tf.trainable_variables()]
values = sess.run(variables_names)
for k, v in zip(variables_names, values):
    print "Variable: ", k
    print "Shape: ", v.shape
    print v

2)设置前后层的学习率
比如要对前20层的参数使用较低的学习率微调(20层大概有40种参数,20个weight,20个bia)

var1 = tf.trainable_variables()[0:40]
var2 = tf.trainable_variables()[40:]
train_op1 = GradientDescentOptimizer(0.00001).minimize(loss, var_list=var1) 
train_op2 = GradientDescentOptimizer(0.0001).minimize(loss, var_list=var2)
train_op = tf.group(train_op1, train_op2)

3)加载预训练的model进行fine-tuning

注意:(Note:)
在我的实验中,按照原作者的方法,我把预训练的ckpt加载的时侯,总是出错。
总结了一下,原因可能出现在graph中,在fine-tuning中,设置了两个train_op1, train_op2,然而我预训练好的model中只有一个train_op,在这里可能无法对应,导致加载权重的时候出错。
**更改如下:**在预训练的时候也设置成两个train_op,不过将学习率调整成一致。重新训练model,然后便可以加载了。
总结:这种方法明显会有限制,导致之前的pretrained的model的graph必须按照fine-tuning来调节

二、从反向梯度入手
这个灵感来自于:http://blog.csdn.net/liyuan123zhouhui/article/details/69569493

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值