Tensorflow:如何在另一个图上初始化变量?

时间:2017-10-23 17:04:40

标签: tensorflow

我有一个默认图表和一个新创建的图表(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会出错。

2 个答案:

答案 0 :(得分:3)

出现错误的原因是,当您导入图形def时,不会导入或还原任何变量和值。

如果执行以下操作,则可以在另一个图中使用变量:

  • 在会话中声明变量,然后运行tf.global_variables_initalizer()
  • 保存您的变量
  • 导入graph_def后,恢复变量
  • 重要:在导入图定义时,请使用name =''来使用与其他图相同的名称空间,否则会出错

如何做到这一点的最小示例:

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字典,其中键是要使用的名称,值是要管理的变量