首页 文章

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

提问于
浏览
1

我有一个默认图表和一个新创建的图表(G1) .

在G1中,我有一个名为“a”的变量 .

我可以使用 tf.import_graph_def 将G1包含在主图上,并显示其"a"变量 .

How do I initialize this variable and successfully print the value of "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 回答

  • 1

    出现错误的原因是,在导入图形def时,不会导入或恢复任何变量和值 .

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

    • 在会话中声明您的变量,然后运行tf.global_variables_initalizer()

    • 保存您的变量
      导入graph_def后

    • ,恢复变量

    • important :导入图形时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))
    
  • 0

    所有您需要的内容在tensorflow文档中有详细说明:

    https://www.tensorflow.org/programmers_guide/saved_model

    使用关联代码示例查看此部分:

    选择要保存和恢复的变量

    如果未将任何参数传递给tf.train.Saver(),则保护程序将处理图中的所有变量 . 每个变量都保存在创建变量时传递的名称下 .

    有时在检查点文件中明确指定变量的名称很有用 . 例如,您可能已经使用名为“weights”的变量训练了一个模型,该变量的值要恢复为名为“params”的变量 .

    有时仅保存或恢复模型使用的变量子集也是有用的 . 例如,您可能已经训练了一个具有五层的神经网络,现在您想要训练一个具有六层的新模型,该模型重用五个训练层的现有权重 . 您可以使用保护程序恢复前五个图层的权重 .

    您可以通过传递给tf.train.Saver()构造函数来轻松指定要保存或加载的名称和变量:

    • 变量列表(将以自己的名称存储) .

    • 一个Python字典,其中键是要使用的名称,值是要管理的变量

相关问题