我有一个默认图表和一个新创建的图表(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
会出错。
答案 0 :(得分:3)
出现错误的原因是,当您导入图形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))
答案 1 :(得分:0)
您需要的所有内容都在tensorflow文档中详细说明:
https://www.tensorflow.org/programmers_guide/saved_model
使用关联代码示例查看此部分:
选择要保存和恢复的变量
如果未将任何参数传递给tf.train.Saver(),则保护程序将处理图中的所有变量。每个变量都保存在创建变量时传递的名称下。
有时在检查点文件中明确指定变量的名称很有用。例如,您可能已经使用名为“权重”的变量训练了一个模型,该变量的值要恢复为名为“params”的变量。
仅保存或恢复模型使用的变量子集有时也很有用。例如,您可能已经训练了一个具有五层的神经网络,现在您想要训练一个具有六层的新模型,该模型重用五个训练层的现有权重。您可以使用保护程序恢复前五个图层的权重。
您可以通过传递给以下任一项的tf.train.Saver()构造函数轻松指定要保存或加载的名称和变量:
变量列表(将以自己的名义存储)。
一个Python字典,其中键是要使用的名称,值是要管理的变量