首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Tensorflow variable_scope:函数中的tf.placeholder和tf.get_variable

Tensorflow variable_scope:函数中的tf.placeholder和tf.get_variable
EN

Stack Overflow用户
提问于 2018-06-22 01:40:59
回答 2查看 1.1K关注 0票数 2

我只是想了解一下TensorFlow的命名行为,我仍然需要一些澄清。我在一个项目中遇到了张量命名的麻烦,因为它们是在一个函数中预定义的,这个函数后来被调用。

因此,我这里有以下示例:

import tensorflow as tf


    def foo():

        with tf.variable_scope("foo", reuse=True):

            a = tf.placeholder(tf.float32,name="a")
            b = tf.placeholder(tf.float32,name="b")

        return a,b
    ##

    a,b  = foo()

    print(a)
    print(b)

我得到了输出:

Tensor("foo/a:0", dtype=float32)
Tensor("foo/b:0", dtype=float32)

但是,当我再次调用它时,我得到了输出:

Tensor("foo_1/a:0", dtype=float32)
Tensor("foo_1/b:0", dtype=float32)

为什么会这样呢?我将reuse设置为true,所以我希望张量再次出现在相同的variable_scope "foo“中,或者程序抛出一个错误,比如"tensors已定义”。

因此,我尝试了tf.get_variable的一种解决方法:

    def foo():
    with tf.variable_scope("foo", reuse=True):

        a = tf.get_variable("v", [1])


    return a
##

a1 = foo()
print(a1)

graph = tf.get_default_graph()
#call tensors by name in tensorflow to avoid confusion with the naming
graph.get_tensor_by_name("foo/v:0")

在这里,我总是得到相同的输出:

<tf.Variable 'foo/v:0' shape=(1,) dtype=float32_ref>

不幸的是,我不能处理变量,因为你不能为它们定义一个动态形状。您需要占位符来定义可变形状。谁能解释一下为什么程序会继续为占位符创建新的variable_scopes,而不是在我调用tf.get_variable()的时候?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-22 02:31:07

您可以通过在名称后面添加'/‘来强制重用作用域,例如:tf.variable_scope("foo/", reuse=True):

然而,这并不能解决你的问题。

对于变量,调用tf.Variable将始终创建一个新变量,而调用tf.get_variable将重用该变量(如果该变量已经存在)。

但是有了占位符就没有tf.get_placeholder了。

您可以做的是在foo之外定义您的占位符,只定义一次,并在需要时使用tf.get_default_graph().get_tensor_by_name(name)或直接使用python变量按名称获取它们。

使用get_tensor_by_name的示例

import tensorflow as tf

with tf.name_scope("scope"):
    tf.placeholder(tf.float32,name="a")
    tf.placeholder(tf.float32,name="b")

def foo():
    a = tf.get_default_graph().get_tensor_by_name("scope/a:0")
    b = tf.get_default_graph().get_tensor_by_name("scope/b:0")

    return a,b

a,b = foo()

print(a)
print(b)

请注意,与变量不同,占位符不维护可重用或不可重用的状态。它们只是一个指向稍后要输入的张量的“指针”。它们不应该是模型的一部分,而应该是模型的输入,所以无论如何都不应该多次创建它们。

票数 3
EN

Stack Overflow用户

发布于 2018-06-23 05:51:16

对于在Jupyter笔记本中运行代码两次的情况,请确保笔记本的内核没有重用变量。

相反,如果在默认图形的范围内多次调用函数foo(),则始终会得到相同的结果:

def foo():
  with tf.variable_scope("foo", reuse=True):
    a = tf.placeholder(tf.float32,name="a")
    b = tf.placeholder(tf.float32,name="b")
  return a,b

with tf.Graph().as_default():
  a,b  = foo()

  print(a) # gives variable name 'foo/a'
  print(b) # gives variable name 'foo/b'

但这与用例不同,在用例中,重复调用该函数以创建更多的占位符。

c,d = foo()

在这种情况下,上面的f4答案是推荐的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50974629

复制
相关文章

相似问题

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