簡體   English   中英

為什么AdamOptimizer在我的圖表中重復?

[英]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.pyoptimizer.pytraining_ops.cc )之后,我也不清楚創建副本的方式/原因/位置。

問題:重復的AdamOptimizer子圖的來源是什么?

我可以想到以下幾種可能性:

  • 我的代碼中的一個錯誤
  • TensorBoard中生成的某種工件
  • 這是預期的行為(如果是,那么為什么?)
  • TensorFlow中的一個錯誤

編輯:清理和澄清

由於一些最初的混淆,我把我原來的問題弄得很復雜,詳細說明了如何使用TensorFlow / TensorBoard設置一個可重現的環境來重現這個圖。 我已經用擴展x節點的說明替換了所有這些。

這不是一個錯誤,只是一個可能有問題的方式泄漏到你自己的范圍之外。

首先,不是錯誤:Adam優化器不重復。 從圖中可以看出,有一個/MyAdam范圍,而不是兩個。 這里沒問題。

但是, 兩個MyAdamMyAdam_1添加到您的變量的作用域子范圍 它們分別對應於此變量的Adam優化器的mv變量(及其初始化操作)。

這是優化器做出的選擇值得商榷的地方。 您確實可以合理地期望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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM