为什么在我的图形中重复了AdamOptimizer?

Ben*_*res 9 python tensorflow tensorboard

我对TensorFlow的内部知识还很陌生。为了试图理解TensorFlow的AdamOptimizer的实现,我检查了TensorBoard中的相应子图。默认情况下name + '_1',似乎有一个名为的重复子图name='Adam'

以下MWE产生下图。(请注意,我已经扩展了该x节点!

import tensorflow as tf

tf.reset_default_graph()
x = tf.Variable(1.0, name='x')
train_step = tf.train.AdamOptimizer(1e-1, name='MyAdam').minimize(x)

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    with tf.summary.FileWriter('./logs/mwe') as writer:
        writer.add_graph(sess.graph)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我很困惑,因为我希望上面的代码在图形内部仅产生一个名称空间。即使检查相关的源文件(即之后adam.pyoptimizer.pytraining_ops.cc),这不是很清楚,我如何/为什么/在其中创建副本。

问题:重复AdamOptimizer子图的来源是什么?

我可以想到以下可能性:

  • 我代码中的错误
  • TensorBoard中生成的某种工件
  • 这是预期的行为(如果是,那么为什么?)
  • TensorFlow中的错误

编辑:清理和澄清

由于最初的困惑,我在最初的问题上写了详细的说明,以详细说明如何使用TensorFlow / TensorBoard建立可重现的环境,该环境可重现此图。现在,我已将所有内容替换为有关扩展x节点的说明。

P-G*_*-Gn 3

这不是一个错误,只是一种可能有问题的泄漏到您自己的范围之外的方式。

首先,不是错误:Adam 优化器不重复。从图中可以看出,只有一个/MyAdam范围,而不是两个。这里没问题。

但是,变量作用域中添加了两个MyAdamMyAdam_1 作用域。它们分别对应于该变量的 Adam 优化器的mv变量(及其初始化操作)。

这是优化器做出的选择值得商榷的地方。您确实可以合理地期望 Adam 优化器操作和变量在其指定范围内严格定义。相反,他们选择潜入优化变量的范围来定位统计变量。

因此,至少可以说,这是一个有争议的选择,但不是一个错误,因为 Adam 优化器确实没有重复。

编辑

请注意,这种定位变量的方式在优化器中很常见——您可以通过MomentumOptimizer示例观察到相同的效果。事实上,这是为优化器创建槽的标准方法- 请参见此处

# Scope the slot name in the namespace of the primary variable.
# Set "primary.op.name + '/' + name" as default name, so the scope name of
# optimizer can be shared when reuse is True. Meanwhile when reuse is False
# and the same name has been previously used, the scope name will add '_N'
# as suffix for unique identifications.
Run Code Online (Sandbox Code Playgroud)

因此,据我了解,他们选择将变量的统计信息定位在变量本身范围的子范围内,这样如果变量被共享/重用,那么它的统计信息也会被共享/重用,并且不需要重新计算。这确实是一件合理的事情,即使再次超出你的范围有点令人不安。