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

  • 相关阅读:
    LINQ 详解
    oracle下查询的sql已经超出IIS响应时间
    IOC应用之 Ninject
    JSONP ---------跨域
    国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)
    IO多路复用,以socket为例
    socket机制下实现的多用户与服务器交互
    在一个进程中定义多个线程
    基于tcp的socketserver,即tcp的多线程
    基于upd的socketserver,即udp的多线程
  • 原文地址:https://www.cnblogs.com/codehome/p/10621010.html
Copyright © 2011-2022 走看看