更新:TensorFlow 0.9 有一种新方法可以“修复”所有这些问题但前提是您使用 VariableScope 并将 reuse 设置为 True。 tf.report_uninitialized_variables可以和sess.run( tf.initialize_variables( list( tf.get_variable(name) for name in sess.run( tf.report_uninitialized_variables( tf.all_variables( ) ) ) ) ) )在一行中使用
或者更智能地通过指定您期望初始化的变量的能力:
def guarantee_initialized_variables(session, list_of_variables = None):
if list_of_variables is None:
list_of_variables = tf.all_variables()
uninitialized_variables = list(tf.get_variable(name) for name in
session.run(tf.report_uninitialized_variables(list_of_variables)))
session.run(tf.initialize_variables(uninitialized_variables))
return unintialized_variables
这仍然不如实际知道哪些变量已初始化和未初始化并妥善处理,但在像 optim 类(见下文)这样的误导的情况下,可能很难避免。
另请注意,tf.initialize_variables 无法评估 tf.report_uninitialized_variables,因此它们都必须在会话上下文中运行才能工作。
有一种不优雅但简洁的方式来做到这一点。在引入新变量之前运行temp = set(tf.all_variables()),然后运行sess.run(tf.initialize_variables(set(tf.all_variables()) - temp))。这些一起只会初始化分配临时值后创建的任何变量。
我一直在玩迁移学习,所以我也想要一种快速的方法,但这是我能找到的最好方法。尤其是在使用像 AdamOptimizer 这样的东西时,它不会让您轻松(或任何,我不确定)访问它使用的变量。所以以下内容实际上出现在我的代码中。 (我显式初始化新层的变量,并运行一次以显示迁移学习之前的初始错误。只是为了进行完整性检查。)
temp = set(tf.all_variables())
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
#I honestly don't know how else to initialize ADAM in TensorFlow.
sess.run(tf.initialize_variables(set(tf.all_variables()) - temp))
它解决了我所有的问题。
编辑: @Lifu_Huang's answer 说明了解决我的问题的正确方法。理论上,你应该使用tf.train.Optimizer.get_slot_names和tf.train.Optimizer.get_slot:
optim = tf.train.AdadeltaOptimizer(1e-4)
loss = cross_entropy(y,yhat)
train_step = optim.minimize(loss)
sess.run(tf.initialize_variables([optim.get_slot(loss, name)
for name in optim.get_slot_names()])
然而,这给了我AttributeError: 'NoneType' object has no attribute 'initializer'。当我发现我做错了什么时,我会进行修改,所以你不要犯我的错误。