tensorflow冻结部分层,只训练某一层

其实常说的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)

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

猜你喜欢

转载自blog.csdn.net/chanbo8205/article/details/86231124
今日推荐