首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Tensorflow:如何在另一个图上初始化变量?

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

Stack Overflow用户
提问于 2017-10-23 17:04:39
回答 2查看 2.7K关注 0票数 3

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

在G1中,我有一个名为"a“的变量。

我可以使用tf.import_graph_def将G1包含到主图上,并公开它的"a“变量。

如何初始化此变量并成功打印"a“?的值

以下是实际代码:

代码语言:javascript
运行
复制
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中出错。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-31 12:01:05

出现错误的原因是当您导入一个图def时,没有任何变量和值被导入或还原。

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

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

最起码的例子是如何做到这一点:

代码语言:javascript
运行
复制
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))
票数 4
EN

Stack Overflow用户

发布于 2017-10-23 21:47:26

您所需要的是tensorflow文档中的详细内容:

model

请参阅此部分与关联代码示例:

选择要保存和恢复的变量

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

有时,显式地为检查点文件中的变量指定名称很有用。例如,您可能已经使用一个名为“权重”的变量训练了一个模型,该变量的值要还原为一个名为"params“的变量。

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

通过向tf.train.Saver()构造函数传递以下任一项,您可以轻松地指定要保存或加载的名称和变量:

  • 变量列表(将以自己的名称存储)。
  • Python字典,其中键是要使用的名称,值是要管理的变量。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46894808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档