如何在Tensorflow中仅初始化优化器变量?

时间:2017-01-08 13:59:36

标签: python tensorflow

我想在Tensorflow中使用MomentumOptimizer。但是,由于此优化程序使用某个内部变量,因此尝试在不初始化此变量的情况下使用它会产生错误:

  

FailedPreconditionError(见上面的追溯):试图使用    未初始化的值Variable_2/Momentum

这可以通过初始化所有变量轻松解决,例如使用

tf.global_variables_initializer().run()

但是,我不想初始化所有变量 - 只有优化器的那些变量。有没有办法做到这一点?

6 个答案:

答案 0 :(得分:18)

当前的答案通过使用' Momentum'过滤变量名来进行工作。串。但这在两方面都非常脆弱:

  1. 它可以默默地(重新)初始化您实际上不想重置的其他变量!或者仅仅因为名称冲突,或者因为你有一个更复杂的图表并分别优化不同的部分,例如。
  2. 它只适用于一个特定的优化器,您如何知道其他人需要注意的名称?
  3. 奖励:对tensorflow的更新可能会默默地破坏您的代码。
  4. 幸运的是,tensorflow的抽象Optimizer类有一个机制,这些额外的优化器变量被称为"slots",您可以使用{{3获取优化器的所有插槽名称方法:

    opt = tf.train.MomentumOptimizer(...)
    print(opt.get_slot_names())
    # prints ['momentum']
    

    您可以使用get_slot_names()方法获取与特定(可训练)变量v的插槽相对应的变量:

    opt.get_slot(some_var, 'momentum')
    

    将所有这些组合在一起,您可以创建一个初始化优化程序状态的操作,如下所示:

    var_list = # list of vars to optimize, e.g. 
               # tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
    opt = tf.train.MomentumOptimizer(0.1, 0.95)
    step_op = opt.minimize(loss, var_list=var_list)
    reset_opt_op = tf.variables_initializer([opt.get_slot(var, name) for name in opt.get_slot_names() for var in var_list])
    

    这实际上只会重置正确的变量,并且在优化器之间保持稳健。

    除了一个get_slot(var, slot_name)AdamOptimizer。那个人也会对其被召唤的频率进行反击。这意味着你应该真正考虑到你在这里做了什么,但是为了完整性,'为此,您可以将其额外状态设为opt._get_beta_accumulators()。返回的列表应添加到上面reset_opt_op行的列表中。

答案 1 :(得分:12)

有一种更直接的方式:

file:///data/user/0/com.example.mypackagename/files/audio00001.mp3

答案 2 :(得分:10)

您可以按名称过滤变量,只进行初始化。 IE

momentum_initializers = [var.initializer for var in tf.global_variables() if 'Momentum' in var.name]
sess.run(momentum_initializers)

答案 3 :(得分:5)

根据LucasB关于AdamOptimizer的回答,此函数会使AdamOptimizer实例adam_opt创建Variables(其中一个称为: adam_opt.minimize(loss, var_list=var_list)adam_opt.apply_gradients(zip(grads, var_list))。函数创建一个Op,在调用时,重新初始化传递变量的优化程序变量,以及全局计数状态。 / p>

def adam_variables_initializer(adam_opt, var_list):
    adam_vars = [adam_opt.get_slot(var, name)
                 for name in adam_opt.get_slot_names()
                 for var in var_list if var is not None]
    adam_vars.extend(list(adam_opt._get_beta_accumulators()))
    return tf.variables_initializer(adam_vars)

e.g:

opt = tf.train.AdamOptimizer(learning_rate=1e-4)
fit_op = opt.minimize(loss, var_list=var_list)
reset_opt_vars = adam_variables_initializer(opt, var_list)

答案 4 :(得分:2)

tf.variables_initializer似乎是初始化一组特定变量的首选方法:

var_list = [var for var in tf.global_variables() if 'Momentum' in var.name]
var_list_init = tf.variables_initializer(var_list)
...
sess = tf.Session()
sess.run(var_list_init)

答案 5 :(得分:0)

要解决无问题,请执行以下操作:

  self.opt_vars = [opt.get_slot(var, name) for name in opt.get_slot_names() 
                   for var in self.vars_to_train
                   if opt.get_slot(var, name) is not None]