[英]Why is AdamOptimizer duplicated in my graph?
我對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
節點的說明替換了所有這些。
這不是一個錯誤,只是一個可能有問題的方式泄漏到你自己的范圍之外。
首先,不是錯誤:Adam優化器不重復。 從圖中可以看出,有一個/MyAdam
范圍,而不是兩個。 這里沒問題。
但是, 有兩個MyAdam
和MyAdam_1
添加到您的變量的作用域子范圍 。 它們分別對應於此變量的Adam優化器的m
和v
變量(及其初始化操作)。
這是優化器做出的選擇值得商榷的地方。 您確實可以合理地期望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.
據我所知,他們選擇在變量本身范圍的子范圍內定位變量的統計數據,這樣如果變量被共享/重用,那么它的統計數據也會被共享/重用,不需要重新計算。 這確實是一件合理的事情,即使再一次,在你的范圍之外爬行也有些令人不安。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.