我有一个默认图和一个新创建的图(G1)。
在G1中,我有一个名为"a“的变量。
我可以使用tf.import_graph_def
将G1包含到主图上,并公开它的"a“变量。
如何初始化此变量并成功打印"a“?的值
以下是实际代码:
import tensorflow as tf
INT = tf.int32
def graph():
g = tf.Graph()
with g.as_default() as g:
a = tf.get_variable('a', [], INT, tf.constant_initializer(10))
return g
tf.reset_default_graph()
g = graph()
[g_a] = tf.import_graph_def(g.as_graph_def(), return_elements=['a:0'])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(g_a))
上面的内容不起作用,它将在FailedPreconditionError: Attempting to use uninitialized value import/a
中出错。
发布于 2018-08-31 04:01:05
出现错误的原因是当您导入一个图def时,没有任何变量和值被导入或还原。
如果您执行以下操作,可以在另一个图中使用变量:
最起码的例子是如何做到这一点:
import tensorflow as tf
INT = tf.int32
def graph():
g = tf.Graph()
with tf.Session(graph=g) as sess:
a = tf.get_variable("a", shape=[1], dtype=INT, initializer=tf.constant_initializer(10))
sess.run(tf.global_variables_initializer())
saver = tf.train.Saver()
saver.save(sess, './test_dir/test_save.ckpt')
return g
g = graph()
tf.reset_default_graph()
g_a = tf.import_graph_def(g.as_graph_def(), return_elements=['a:0'], name='')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
second_saver = tf.train.Saver(var_list=g_a)
second_saver.restore(sess, './test_dir/test_save.ckpt')
a = sess.graph.get_tensor_by_name('a:0')
print(sess.run(a))
发布于 2017-10-23 13:47:26
您所需要的是tensorflow文档中的详细内容:
请参阅此部分与关联代码示例:
选择要保存和恢复的变量
如果不向tf.train.Saver()传递任何参数,则保护程序将处理图中的所有变量。每个变量都以创建变量时传递的名称保存。
有时,显式地为检查点文件中的变量指定名称很有用。例如,您可能已经使用一个名为“权重”的变量训练了一个模型,该变量的值要还原为一个名为"params“的变量。
有时只保存或恢复模型使用的变量的子集也很有用。例如,你可能已经训练了一个五层的神经网络,现在你想要训练一个六层的新模型,它重用了五个训练层的现有权重。您可以使用保护程序来恢复前五层的权重。
通过向tf.train.Saver()构造函数传递以下任一项,您可以轻松地指定要保存或加载的名称和变量:
https://stackoverflow.com/questions/46894808
复制相似问题