簡體   English   中英

Tensorflow:使用Adam優化器

[英]Tensorflow: Using Adam optimizer

我正在嘗試使用張量流中的一些簡單模型,包括一個看起來非常類似於ML初學者示例的第一個MNIST ,但具有更大的維度。 我能夠毫無問題地使用梯度下降優化器,獲得足夠好的收斂性。 當我嘗試使用ADAM優化器時,出現如下錯誤:

tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Variable_21/Adam
     [[Node: Adam_2/update_Variable_21/ApplyAdam = ApplyAdam[T=DT_FLOAT, use_locking=false, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_21, Variable_21/Adam, Variable_21/Adam_1, beta1_power_2, beta2_power_2, Adam_2/learning_rate, Adam_2/beta1, Adam_2/beta2, Adam_2/epsilon, gradients_11/add_10_grad/tuple/control_dependency_1)]]

抱怨未初始化的特定變量根據運行而變化。 這個錯誤是什么意思? 它表明什么是錯的? 無論我使用什么學習率,它似乎都會發生。

AdamOptimizer類創建其他變量,稱為“槽”,用於保存“m”和“v”累加器的值。

如果你很好奇,請查看此處的源代碼,它實際上非常易讀: https//github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39 其他優化器,如Momentum和Adagrad也使用插槽。

在訓練模型之前,必須初始化這些變量。

初始化變量的常規方法是調用tf.initialize_all_variables() ,它會添加操作以在調用圖形初始化圖形中存在的變量。

(旁白:與其名稱不同,initialize_all_variables()不會初始化任何內容,它只會添加將在運行時初始化變量的操作。)

添加優化程序后,您必須執行的操作是調用initialize_all_variables():

...build your model...
# Add the optimizer
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

FailedPreconditionError:嘗試使用未初始化的值是與tensorflow相關的最常見錯誤之一。 從官方文檔, FailedPreconditionError

在運行在初始化之前讀取tf.Variable的操作時,通常會引發此異常。

在您的情況下,錯誤甚至解釋了未初始化的變量: Attempting to use uninitialized value Variable_1 其中一篇TF教程解釋了很多變量,它們的創建/初始化/保存/加載

基本上初始化變量有3個選項:

我幾乎總是使用第一種方法。 記住你應該把它放在會話運行中。 所以你會得到這樣的東西:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

如果您對有關變量的更多信息感到好奇,請閱讀本文檔以了解如何report_uninitialized_variables並檢查is_variable_initialized

您需要在會話中調用tf.global_variables_initializer() ,例如

init = tf.global_variables_initializer()
sess.run(init)

這個偉大的教程中提供了完整的示例https://www.tensorflow.org/get_started/mnist/mechanics

在AdamOptimizer之后運行init,並且之前沒有init init或運行init

sess.run(tf.initialize_all_variables())

要么

sess.run(tf.global_variables_initializer())

我遇到了類似的問題。 (使用GradientDescent優化器訓練沒有問題,但在使用Adam Optimizer或任何其他具有自己變量的優化器時出現錯誤)

更改為交互式會話為我解決了這個問題。

sess = tf.Session()

sess = tf.InteractiveSession()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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