Skip to main content
 首页 » 编程设计

python之Tensorflow:保存和恢复 session之多个变量

2025年05月04日24think

给定以下代码:

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: 至少两个变量具有相同的名称: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:至少两个变量具有相同的名称: 变量

请您参考如下方法:

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

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

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

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() 来创建变量。