2017-06-08 81 views
2

我正在嘗試瞭解GAN,並正在通過the example here進行工作。無法訪問TensorFlow Adam優化程序名稱空間

下面使用ADAM優化的代碼給我

"ValueError: Variable d_w1/Adam/ does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?"

我使用TF 1.1.0

d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dx, labels=tf.fill([batch_size, 1], 0.9))) 
d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dg, labels=tf.zeros_like(Dg))) 
d_loss = d_loss_real + d_loss_fake 

tvars = tf.trainable_variables() 

d_vars = [var for var in tvars if 'd_' in var.name] 
g_vars = [var for var in tvars if 'g_' in var.name] 



# Train the discriminator 
# Increasing from 0.001 in GitHub version 
with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope: 

    # Next, we specify our two optimizers. In today’s era of deep learning, Adam seems to be the 
    # best SGD optimizer as it utilizes adaptive learning rates and momentum. 
    # We call Adam's minimize function and also specify the variables that we want it to update. 
    d_trainer_real = tf.train.AdamOptimizer(0.0001).minimize(d_loss_real, var_list=d_vars) 
    d_trainer_fake = tf.train.AdamOptimizer(0.0001).minimize(d_loss_fake, var_list=d_vars) 

錯誤我認爲亞當優化走的是變量納入自己的命名空間但由於某些原因,他們沒有初始化。我在代碼中稍後調用global_variables_initializer,正如可以在github頁面上看到的那樣。我正在通過文檔檢查,我認爲這可能與我不得不在某處放置某種reuse_variables()電話相關,但我不確定。

任何幫助非常感謝。

+0

我不知道,這個例子是按照最好的一個,考慮到它使用兩個優化的鑑別。它可以使用已經定義的d_loss來使用單個優化器,可能完全避免這個問題。 – jasekp

+0

此外,鑑別器輸出激活是線性的,它應該是一個sigmoid(或其他範圍從0到1的其他東西)。這解釋了爲什麼鑑別器分類在0時步結果爲負的原因。 – jasekp

+0

@jasekp那麼你會建議什麼?有一個鑑別器優化器仍然給我錯誤。我想得到這個工作,並理解亞當優化器,因爲我認爲這是什麼問題在這裏。我可以隨時查看更多示例嗎?任何想法如何讓它工作?謝謝! –

回答

0

你ValueError異常是由variable_scope.reuse ==真中創建新的變量引起的。

變量由亞當創建的,當你調用亞當的最小化功能,保存每一個可訓練變量的勢頭在圖形中。

其實,你所期望的代號爲「重用=假」不起作用。一旦將其設置爲True,重用狀態不會永遠變回False,並且重用狀態將由其所有子作用域繼承。

with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope: 
    assert tf.get_variable_scope().reuse == True 

我想你已經設置重用爲True的地方之前的郵政編碼,因此默認variable_scope.reuse == True。然後,你爲Adam創建一個新的variable_scope,然而,新的作用域將繼承默認作用域的重用狀態。然後,Adam在狀態複用== True的情況下創建變量,這會引發錯誤。

解決的辦法是在設置variable_scope.reuse = True時,在圖的默認範圍下添加一個子範圍,然後默認的scope.reuse仍然是False,並且Adam.minimize將起作用。

相關問題