Tensorflow:保存和恢复会话 - 多个变量

时间:2016-12-30 17:44:41

标签: python tensorflow

给出以下代码:

import tensorflow as tf

with tf.Session() as sess:
    var = tf.Variable(42, name='var')
    sess.run(tf.global_variables_initializer())
    tf.train.export_meta_graph('file.meta')

with tf.Session() as sess:
    saver = tf.train.import_meta_graph('file.meta')
    print sess.run(var)

我在第saver = tf.train.import_meta_graph('file.meta')ValueError: At least two variables have the same name: var时收到错误。

我该如何解决这个问题?在导入元图时,是否有覆盖计算图?

修改

我已经得到以下代码:

import tensorflow as tf

file_name = "./file"

with tf.Session() as sess:
    var = tf.Variable(42, name='my_var')
    sess.run(tf.global_variables_initializer())

    saver = tf.train.Saver()
    saver.save(sess,file_name)
    saver.export_meta_graph(file_name + '.meta')

with tf.Session() as sess:
    saver = tf.train.import_meta_graph(file_name + '.meta')
    saver.restore(sess, file_name)
    print(sess.run(var))

    # new code that fails:
    saver = tf.train.Saver()
    saver.save(sess,file_name)
    saver.export_meta_graph(file_name + '.meta')

这会打印var的正确值,但是当我第二次保存图表时,我会收到相同的原始错误:ValueError: At least two variables have the same name: var

1 个答案:

答案 0 :(得分:3)

在这种情况下,您将在已定义变量的默认图形中加载变量。于是 在导入之前,您需要重置TensorFlow图。

使用tf.reset_default_graph()执行此操作。在导入之前。看一下"在默认图表中导入" Exporting and Importing a MetaGraph下的部分。

当然,您必须使用var重新定义变量tf.get_variable()。试试这段代码,

import tensorflow as tf

with tf.Session() as sess:
    var = tf.Variable(42, name='var')
    sess.run(tf.global_variables_initializer())
    tf.train.export_meta_graph('file.meta')
tf.reset_default_graph()
with tf.Session() as sess:
    saver = tf.train.import_meta_graph('file.meta')
    var = tf.global_variables()[0]
    sess.run(tf.initialize_all_variables())
    print sess.run(var)

您的中间代码无法正常工作的原因是tf.get_variable()正在创建一个随机初始化的新变量。确保首先执行tf.get_variable_scope().reuse_variables()。 看看Understanding tf.get_variable()

很遗憾,使用tf.Variable()创建的变量无法直接与tf.get_variable()重复使用。请查看此comment和此comment以确切了解原因。因此,如果您希望将来重复使用该变量,则需要使用tf.get_variable() 创建变量。