當前位置: 首頁>>技術問答>>正文


Tensorflow:使用Adam優化器

我正在試驗TensorFlow中的一些簡單模型,其中包括與入門MNIST for ML Beginners example非常相似的模型,但具有較大的維度。使用梯度下降優化器時,沒有問題,收斂性足夠好。但是,當我嘗試使用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)]]

提示在運行時未初始化的特定變量被改變。這個錯誤是什麽意思?無論我使用的學習速率如何,它似乎都會發生。

最佳解決辦法

這應該是一個經常遇到的問題,當運行一個在初始化之前讀取tf.Variable的操作時,通常會引發此異常。

AdamOptimizer類創建稱為”slots”的其他變量來保存”m”和”v”累加器的值。

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

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

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

(另外:不像其名稱所暗示的那樣, initialize_all_variables()不會初始化任何內容,它隻會添加在運行時初始化變量的操作。)

在添加優化器之後,您必須執行的操作是call 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)

附圖1:各種迭代算法訓練開銷(adam對比)

附圖2:迭代算法動態圖

參考資料

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3875.html,未經允許,請勿轉載。