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

问题描述 投票:9回答:1

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

enter image description here

我很困惑因为我希望上面的代码在图中只生成一个命名空间。即使在检查了相关的源文件(即adam.pyoptimizer.pytraining_ops.cc)之后,我也不清楚创建副本的方式/原因/位置。

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

我可以想到以下几种可能性:

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

编辑:清理和澄清

由于一些最初的混淆,我把我原来的问题弄得很复杂,详细说明了如何使用TensorFlow / TensorBoard设置一个可重现的环境来重现这个图。我已经用扩展x节点的澄清替换了所有这些。

python tensorflow tensorboard
1个回答
2
投票

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

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

但是,在您的变量范围中添加了两个MyAdamMyAdam_1子镜。它们分别对应于此变量的Adam优化器的mv变量(及其初始化操作)。

这是优化器做出的选择值得商榷的地方。您确实可以合理地期望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.

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

© www.soinside.com 2019 - 2024. All rights reserved.