【问题标题】:Why is AdamOptimizer duplicated in my graph?为什么 AdamOptimizer 在我的图表中重复?
【发布时间】:2019-08-06 00:16:54
【问题描述】:

我对 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)

我很困惑,因为我希望上面的代码在图中只生成一个命名空间。即使在检查了相关的源文件(即adam.py、optimizer.py 和training_ops.cc)之后,我也不清楚副本是如何/为什么/在哪里创建的。

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

我能想到以下几种可能:

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

编辑:清理和澄清

由于最初的一些混淆,我在最初的问题中添加了有关如何使用 TensorFlow/TensorBoard 设置可重现环境的详细说明,以重现此图。我现在已经用关于扩展 x 节点的说明替换了所有这些。

【问题讨论】:

  • @P-Gn,我可以在 1.13.1 中重现该问题。在我的编辑中查看详细信息。有什么想法吗?
  • 我现在想知道这是否更适合作为 GitHub 问题。如果有这样的建议,我可以将其复制粘贴到 GitHub 并删除 SO 问题。 (我不知道应该在哪里区分 GitHub 问题和 SO 问题。)
  • TF 1.12 和 1.13 也无法重现您的错误
  • 感谢您对我的包容。我刚刚提供了在 GCP 上重现的确切步骤。我比以往任何时候都更困惑为什么其他人无法重现这一点。
  • 是的,你是对的,我怎么会错过它。似乎所有优化器都是这种情况,它们会创造额外的价值。但似乎主要是可视化问题,因为我在图表或 savrd 检查点中看不到任何附加值

标签: python tensorflow tensorboard


【解决方案1】:

这不是一个错误,只是在您自己的范围之外泄漏的一种可能值得怀疑的方式。

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

但是,有两个MyAdam 和MyAdam_1 子作用域添加到您的变量作用域中。它们分别对应于该变量的 Adam 优化器的 m 和 v 变量(及其初始化操作)。

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

因此,至少可以说是值得商榷的选择,但不是错误,因为 Adam 优化器确实没有被复制。

编辑

请注意,这种定位变量的方式在优化器中很常见——例如,您可以使用MomentumOptimizer 观察到相同的效果。事实上,这是为优化器创建slots 的标准方式——参见here:

# 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.

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

【讨论】:

  • 啊!所以AdamOptimizer 调用_zeros_slot 反过来calls slot_creator.create_zeros_slot。但是,它无法传递slot_name(即m 或v),因此相应的插槽仅以AdamOptimizer 命名,而不是m 或v。
  • 是的,使用m 和v——也许结合优化器名称——可能会更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多