我试图理解tf.name_scope。文档中提到了以下内容。
"这个上下文管理器推送了一个名字范围,它将使所有在它里面添加的操作的名字都有一个前缀。
例如,要定义一个新的Python操作,名为my_op。
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)
当执行时,Tensors a, b, c, 将会有MyOpa, MyOpb, 和MyOpc的名字。"
我的理解是,在Python中,with块并没有引入一个新的局部作用域。正常情况下,张量变量a也会引用函数my_op的局部参数a。 使用Python上下文如何实现名称前缀为 "MyOp"?在tf.name_scope( )的源码链接中。https:/github.comtensorflowtensorflowblobv2.2.0tensorflowpythonframeworkops.py#L6423-L6442。)有一个调用
ctx = context.context()
但我找不到 context.context()的语义。大多数上下文管理器的讨论都是关于 进入 和 退出但没有提到用某个前缀重命名变量。这是不是Python中的一些内省机制,允许对Python变量作用域进行操作?非常感谢你的任何见解。
名称作用域完全是为了方便命名。它与python的作用域没有任何关系。每当你在tensorflow中执行一个操作时,它都会根据tensorflow维护的一些状态得到一个名字,但是如果你想让这些操作在你的用例中被清楚地命名,那么就会使用name scope。任何在name scope内的操作都会在它的名字中附加提供的值,没有更多的用途。关于实现,我非常怀疑那些作用域的实现是否会在python中暴露出来。所有的张量创建操作都是由tensorflow的C++后端执行的,所以作用域应该主要由他们来处理。