我想在Tensorflow中使用MomentumOptimizer
。但是,由于此优化程序使用某个内部变量,因此尝试在不初始化此变量的情况下使用它会产生错误:
FailedPreconditionError
(见上面的追溯):试图使用 未初始化的值Variable_2/Momentum
这可以通过初始化所有变量轻松解决,例如使用
tf.global_variables_initializer().run()
但是,我不想初始化所有变量 - 只有优化器的那些变量。有没有办法做到这一点?
答案 0 :(得分:18)
当前的答案通过使用' Momentum'过滤变量名来进行工作。串。但这在两方面都非常脆弱:
幸运的是,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]