更新: 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( ) ) ) ) ) )
一起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
类(见下文)这样的错误optim
的情况下,可能很难避免。
还请注意,tf.initialize_variables无法评估tf.report_uninitialized_variables,因此它们两者都必须在会话上下文中运行才能起作用。
有一个优雅但简洁的方法可以做到这一点。在引入新变量之前,请运行temp = set(tf.all_variables())
,然后运行sess.run(tf.initialize_variables(set(tf.all_variables()) - temp))
。这些一起只能初始化分配了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的答案陈述了解决我的问题的正确方法。从理论上讲,您应该使用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'
。当我弄清楚我做错了什么时,我将进行编辑,这样您就不会犯我的错误。
0
TensorFlow中初始化变量的标准方法是
经过一段时间的学习后,我创建了一组新的变量,但是一旦初始化它们,它将重置所有现有变量。目前,解决此问题的方法是保存我需要的所有变量,然后在tf.initalize_all_variables调用之后重新应用它们。这有效,但是有点笨拙。我在文档中找不到类似的内容...
有谁知道初始化未初始化变量的好方法吗?