在TensorFlow中使用多个图形
tensorflow
5
0

有人可以告诉我name_scope在TensorFlow中如何工作吗?

假设我有以下代码:

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default() as g:
    with g.name_scope( "g1" ) as scope:
        matrix1 = tf.constant([[3., 3.]])
        matrix2 = tf.constant([[2.],[2.]])
        product = tf.matmul(matrix1, matrix2)

tf.reset_default_graph()

g2 = tf.Graph()
with g2.as_default() as g:
    with g.name_scope( "g2" ) as scope:
        matrix1 = tf.constant([[4., 4.]])
        matrix2 = tf.constant([[5.],[5.]])
        product = tf.matmul(matrix1, matrix2)

tf.reset_default_graph()

with tf.Session( graph = g1 ) as sess:
    result = sess.run( product )
    print( result )

当我运行此代码时,出现以下错误消息:

Tensor Tensor("g2/MatMul:0", shape=(1, 1), dtype=float32) is not an element of this graph.

我同意“ g2 / MatMul”不是图g1的元素,但是当会话图设置为g1时为什么选择“ g2 / MatMul”呢?为什么不选择“ g1 / MatMul”?


编辑

以下代码似乎有效:

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default() as g:
    with g.name_scope( "g1" ) as g1_scope:
        matrix1 = tf.constant([[3., 3.]])
        matrix2 = tf.constant([[2.],[2.]])
        product = tf.matmul( matrix1, matrix2, name = "product")

tf.reset_default_graph()

g2 = tf.Graph()
with g2.as_default() as g:
    with g.name_scope( "g2" ) as g2_scope:
        matrix1 = tf.constant([[4., 4.]])
        matrix2 = tf.constant([[5.],[5.]])
        product = tf.matmul( matrix1, matrix2, name = "product" )

tf.reset_default_graph()

use_g1 = False

if ( use_g1 ):
    g = g1
    scope = g1_scope
else:
    g = g2
    scope = g2_scope

with tf.Session( graph = g ) as sess:
    tf.initialize_all_variables()
    result = sess.run( sess.graph.get_tensor_by_name( scope + "product:0" ) )
    print( result )

通过翻转开关use_g1 ,图形g1g2将在会话中运行。这是名称范围界定的工作方式吗?

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

这确实是坏事,但它仍然是与此相关的问题的最佳搜索结果,我认为这可能有助于做出非常明确的内容,以便先前的回答(正确)通过:

Q的变量productpython变量。这样,它指向一个对象:定义后,它指向在name_scope'g1'中定义的matmul tf.Operationtf.Tensor输出。稍后将其重新定义为指向另一个对象,即“ g2”的tf.Tensor输出。此python变量从未听说过tf.name_scope ,因此不在乎。

就是为什么您需要通过tensorflow对象的名称属性进行查找的原因...使用name_scopes的那些属性是唯一且可访问的。或生成不同的python变量-根据python范围规则可以访问并且是唯一的-指向要引用的每个tf.Tensor对象。

邓诺(Dunno)如果这对其他人有帮助,但是如果我忘记了,我将为此感谢自己。

收藏
评论

您的问题是您正在调用最新的变量product ,该product指向在g2上创建的张量-您在第二个作用域中重写了它。只需重新标记所有变量,就可以了。工作代码如下。

import tensorflow as tf

g1 = tf.Graph() with g1.as_default() as g:
    with g.name_scope( "g1" ) as scope:
        matrix11 = tf.constant([[3., 3.]])
        matrix21 = tf.constant([[2.],[2.]])
        product1 = tf.matmul(matrix11, matrix21)

tf.reset_default_graph()

g2 = tf.Graph() with g2.as_default() as g:
    with g.name_scope( "g2" ) as scope:
        matrix12 = tf.constant([[4., 4.]])
        matrix22 = tf.constant([[5.],[5.]])
        product2 = tf.matmul(matrix12, matrix22)

tf.reset_default_graph()

with tf.Session( graph = g1 ) as sess:
    result = sess.run( product1 )
    print( result )
收藏
评论

您的product是全局变量,并且已将其设置为指向“ g2 / MatMul”。

特别是

尝试

print product

你会看到

Tensor("g2/MatMul:0", shape=(1, 1), dtype=float32)

因此,系统使用"g2/MatMul:0"因为这是张量的名称,并尝试在图形g1找到它,因为这是您为会话设置的图形。顺便说一句,您可以看到图形中的所有节点都print [n.name for n in g1.as_graph_def().node]

通常,使用多个图很少有用。您无法合并它们,也无法在它们之间传递张量。我建议只是做

tf.reset_default_graph()
a = tf.Constant(2)
sess = tf.InteractiveSession()
....

这样,您将拥有一个默认图和一个默认会话,并且在大多数情况下可以省略指定图或会话。如果需要显式引用它们,则可以从tf.get_default_graph()tf.get_default_session()获取它们

收藏
评论

我在处理IPython笔记本上的多个图形时遇到类似的困难。对我而言,有效的方法是将每个图形及其会话封装在一个函数中。我想我想这更多是一种hack,我对名称空间一无所知,我知道OP希望沿用这些原则。也许对我不知道的人有帮助,您也可以在计算之间传递结果。

import tensorflow as tf

def Graph1():
    g1 = tf.Graph()
    with g1.as_default() as g:
        matrix1 = tf.constant([[3., 3.]])
        matrix2 = tf.constant([[2.],[2.]])
        product = tf.matmul( matrix1, matrix2, name = "product")

    with tf.Session( graph = g ) as sess:
        tf.initialize_all_variables().run()
        return product


def Graph2(incoming):
    i = incoming
    g2 = tf.Graph()
    with g2.as_default() as g:
        matrix1 = tf.constant([[4., 4.]])
        matrix2 = tf.constant([[5.],[5.]])
        product = tf.matmul( matrix1, matrix2, name = "product" )

    with tf.Session( graph = g ) as sess:
        tf.initialize_all_variables().run()
        print product
        print i

print Graph1()

Graph2(Graph1())
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号