Kao*_*Kao 23 python tensorflow
我想MomentumOptimizer在Tensorflow中使用.但是,由于此优化程序使用某个内部变量,因此尝试在不初始化此变量的情况下使用它会产生错误:
FailedPreconditionError(参见上面的回溯):尝试使用未初始化的值Variable_2/Momentum
例如,通过初始化所有变量可以很容易地解决这个问题
tf.global_variables_initializer().run()
Run Code Online (Sandbox Code Playgroud)
但是,我不想初始化所有变量 - 只有优化器的变量.有没有办法做到这一点?
Luc*_*asB 19
通过使用"Momentum"字符串过滤变量名称,当前的答案都有用.但这在两方面都非常脆弱:
幸运的是,tensorflow的抽象Optimizer类有一个机制,这些额外的优化器变量称为"槽",您可以使用以下get_slot_names()方法获取优化器的所有插槽名称:
opt = tf.train.MomentumOptimizer(...)
print(opt.get_slot_names())
# prints ['momentum']
Run Code Online (Sandbox Code Playgroud)
并且您可以v使用以下get_slot(var, slot_name)方法获取与特定(可训练)变量的槽相对应的变量:
opt.get_slot(some_var, 'momentum')
Run Code Online (Sandbox Code Playgroud)
将所有这些放在一起,您可以创建一个初始化优化器状态的操作,如下所示:
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])
Run Code Online (Sandbox Code Playgroud)
这实际上只会重置正确的变量,并且在优化器之间保持稳健.
除了一个不幸的警告:AdamOptimizer.那个人还会反复调用它的频率.这意味着你应该在这里努力思考你在做什么,但为了完整起见,你可以得到它的额外状态opt._get_beta_accumulators().返回的列表应添加到上reset_opt_op一行的列表中.
Sou*_*rer 18
有一种更直接的方式:
optimizer = tf.train.AdamOptimizer()
session.run(tf.variables_initializer(optimizer.variables()))
Run Code Online (Sandbox Code Playgroud)
Yar*_*tov 11
您可以按名称过滤变量,只进行初始化.IE
momentum_initializers = [var.initializer for var in tf.global_variables() if 'Momentum' in var.name]
sess.run(momentum_initializers)
Run Code Online (Sandbox Code Playgroud)
建立在LucasB关于的答案的基础上AdamOptimizer,此函数采用一个已创建AdamOptimizer实例(称为或的两个实例之一)。该函数创建一个实例adam_opt,该实例在调用时会针对传递的变量以及全局变量重新初始化优化器的变量。计数状态。Variablesadam_opt.minimize(loss, var_list=var_list)adam_opt.apply_gradients(zip(grads, var_list))Op
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)
Run Code Online (Sandbox Code Playgroud)
例如:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8138 次 |
| 最近记录: |