码迷,mamicode.com
首页 > 其他好文 > 详细

tensorflow冻结层的方法

时间:2019-03-29 14:56:31      阅读:505      评论:0      收藏:0      [点我收藏+]

标签:spec   ret   style   collect   out   关于   core   layer   没有   

其实常说的fine tune就是冻结网络前面的层,然后训练最后一层。那么在tensorflow里如何实现finetune功能呢?或者说是如何实现冻结部分层,只训练某几个层呢?可以通过只选择优化特定层的参数来实现该功能。

 

示例代码如下:

 

#定义优化算子
optimizer = tf.train.AdamOptimizer(1e-3)
#选择待优化的参数
output_vars = tf.get_collection(tf.GraphKyes.TRAINABLE_VARIABLES, scope=outpt)
train_step = optimizer.minimize(loss_score,var_list = output_vars)

#但是在这里,我却碰到了一个问题,关于adam的问题,如下:

Failed precondition: Attempting to use uninitialized value beta1_power

#查了一下,这个参数应该是Adam优化算子里的参数。问题出在定义优化算子的时间,晚于参数初始化的时间,导致beta1_power没有初始化,修改一下代码(调整代码顺序即可)


#即如下的顺序:
sess.run(init)
train_step = optimizer.minimize(loss_score,var_list=output_vars)

#改变成如下顺序即可
train_step = optimizer.minimize(loss_score,var_list=output_vars)
sess.run(init)

 

参考链接:
https://stackoverflow.com/questions/38749120/fine-tuning-a-deep-neural-network-in-tensorflow
https://stackoverflow.com/questions/45093499/how-to-fine-tune-weights-in-specific-layers-in-tensorflow


        另外一个问题是,在用finetune的时候,发现速度并没有比retrain的速度快太多。分析原因在于finetune的时候,冻结了其它层,那么反向传播不会进入到这些层中,但是前向计算是会有的。如果想进一步加速finetune的速度,可以考虑先把所有数据执行一次前向操作,保存最后一层的中间的结果,然后以此中间结果为输入,训练整个网络。可以节省前向计算的一些时间。但如果finetune的epoch较少,那么感觉读写消耗的时间可能就已经很多了,不划算,加速效果也不明显。

tensorflow冻结层的方法

标签:spec   ret   style   collect   out   关于   core   layer   没有   

原文地址:https://www.cnblogs.com/codehome/p/10621010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!