首页 > 解决方案 > 了解 tf.name_scope

问题描述

我想了解 tf.name_scope。该文档提到以下内容:

“这个上下文管理器推送一个名称范围,这将使添加在其中的所有操作的名称都有一个前缀。

例如,要定义一个名为 my_op 的新 Python 操作:

def my_op(a, b, c, name=None):
  with tf.name_scope("MyOp") as scope:
    a = tf.convert_to_tensor(a, name="a")
    b = tf.convert_to_tensor(b, name="b")
    c = tf.convert_to_tensor(c, name="c")
    # Define some computation that uses `a`, `b`, and `c`.
    return foo_op(..., name=scope)

执行时,张量 a、b、c 将具有名称 MyOp/a、MyOp/b 和 MyOp/c。”

我的理解是 with 块不会在 Python 中引入新的本地范围。一般情况下,张量变量a也会引用函数my_op的局部参数a。如何使用 Python 上下文实现以“MyOp/”为前缀的名称?在 tf.name_scope 的源代码链接(https://github.com/tensorflow/tensorflow/blob/v2.2.0/tensorflow/python/framework/ops.py#L6423-L6442)中有一个调用

ctx = context.context()

但我找不到 context.context() 的语义。大多数上下文管理器讨论都讨论了enterexit,但没有提到带有一些前缀的变量重命名。这是 Python 中允许操纵 Python 变量范围的一些内省机制吗?非常感谢您的任何见解。

标签: pythontensorflowvariablesscope

解决方案


名称范围完全是为了命名方便。它与python范围无关。每当您在 tensorflow 中执行操作时,它将根据 tensorflow 维护的某些状态获得一个名称,但如果您希望为您的用例明确命名这些操作,则使用名称范围。名称范围内的任何操作都将在其名称中附加提供的值,仅此而已。关于实现,我非常怀疑这些范围实现是否会在 python 中公开。所有的张量创建操作都由 tensorflow 的 C++ 后端执行,所以作用域应该主要由它们处理


推荐阅读