我对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
子图的来源是什么?
我可以想到以下可能性:
由于最初的困惑,我在最初的问题上写了详细的说明,说明如何使用TensorFlow / TensorBoard建立可重现的环境,该环境可重现此图。现在,我将所有这些替换为关于扩展x
节点的说明。
答案 0 :(得分:2)
这不是错误,只是泄漏到自己范围之外的一种可能有问题的方式。
首先,不是错误:亚当优化器没有重复。从图中可以看出,只有一个/MyAdam
范围,而不是两个。没问题。
但是,有 两个MyAdam
和MyAdam_1
子范围添加到了变量范围。它们分别对应于该变量的Adam优化器的m
和v
变量(及其初始化操作)。
这是优化程序进行辩论的地方。您确实可以合理地预期Adam优化器的操作和变量将在其分配的范围内严格定义。取而代之的是,他们选择在优化变量的范围内爬行以找到统计变量。
因此,就亚当优化器的确没有重复的意义而言,至少可以说是值得商choice的选择,而不是错误。
编辑
请注意,这种定位变量的方式在优化程序中很常见-例如,您可以使用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.
据我所知,他们选择将变量的统计信息放在变量本身作用域的子范围内,这样,如果共享/重用该变量,则其统计信息也将被共享/重用,而不是需要重新计算。即使确实如此,这确实是一件合理的事,即使爬到您的范围之外也会有些不安。