我試圖在 Tf1 和 Tf2 之間復制相同的結果。下面是一個使用 Adam 優化器的簡單示例。
在 TF2 中:
x = tf.Variable([1,2,3], dtype=tf.float32)
grad = tf.constant([0.1, 0.2, 0.3])
optimizer = tf.keras.optimizers.Adam(learning_rate=0.5, epsilon=1e-08)
optimizer.apply_gradients(zip([grad], [x]))
print(x)
x 是:<tf.Variable 'Variable:0' shape=(3,) dtype=float32, numpy=array([0.49998665, 1.4999859, 2.4999857], dtype=float32)>
在 TF1 中時:
x = tf.Variable([1,2,3], dtype=tf.float32)
grad = tf.constant([0.1, 0.2, 0.3])
optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=0.5)
optimizer.apply_gradients(zip([grad], [x]))
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(x))
x 是:[1。2. 3.]
有誰知道是什么導致了使用 Adam Optimizer 時 Tf1 和 Tf2 之間的不一致?我不排除錯誤實施的可能性。
如果有人能告訴我我在 TF1 中做錯了什么,我無法得到與 TF2 相同的結果,我將不勝感激。
非常感謝!
uj5u.com熱心網友回復:
如果你這樣做:
x = tf.Variable([1,2,3], dtype=tf.float32)
grad = tf.constant([0.1, 0.2, 0.3])
optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=0.5)
step = optimizer.apply_gradients(zip([grad], [x]))
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init_op)
sess.run(step)
print(x.eval())
你得到相同的結果(除非我認為可能是浮點不準確)。
[0.50000155 1.5000007 2.5000005 ]
uj5u.com熱心網友回復:
可重復性是商業 AI/ML 專案中一個棘手但至關重要的步驟。
這是 Adam 在 GH 上的 v1 實作:https : //github.com/tensorflow/tensorflow/blob/4c081973a6374ce867794ad66a5c4b204c310afb/tensorflow/python/keras/optimizer_v1.py#L468
這是 v2 版本:https : //github.com/keras-team/keras/blob/v2.7.0/keras/optimizer_v2/adam.py
它們的實作方式略有不同。我發現這個V2檔案中:許多優化的子類,如Adam以及Adagrad分配和管理與變數列車相關的其他變數。這些被稱為 Slots。插槽有名稱,您可以向優化器詢問它使用的插槽的名稱。一旦你有了一個插槽名稱,你就可以向優化器詢問它為保存插槽值而創建的變數。
此外,如果您嘗試將代碼從 1 遷移到 2,您可以按照https://www.tensorflow.org/guide/migrate自動進行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388271.html
