zoukankan      html  css  js  c++  java
  • 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)

    参考链接:
    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较少,那么感觉读写消耗的时间可能就已经很多了,不划算,加速效果也不明显。

  • 相关阅读:
    将自己的工作环境全面移植到C++最后一道工序:能用MFC制作简单的图形界面
    Finally, the working environment has been moved to C++
    统计方面的书籍【zz】
    zz sql 通配符以及转义字符用法
    转载学习并实现DES加密解密算法(三)
    【资源分享】2009版大陆汉语常用字.txt下载
    自己实现的C++Trim()
    nmake命令(windows下的makefile)
    c++对象内存模型【内存布局】
    UML类图关系(VPUML工具绘图)
  • 原文地址:https://www.cnblogs.com/codehome/p/10621010.html
Copyright © 2011-2022 走看看