介于Tf1和Tf2之间的Adam优化器



我正在尝试在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'变量:0'shape=(3,(dtype=float32,numpy=数组([0.49998865,1.4999859,2.4999857],dtype=fluat32(>

在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相同的结果。

非常感谢!

如果您这样做:

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 ]

在商业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文档中发现了这一点:许多优化器子类,如AdamAdagrad,分配和管理与要训练的变量相关联的附加变量。这些称为插槽。插槽有名称,您可以向优化器询问它使用的插槽的名称。一旦有了槽名,就可以向优化器询问它为保存槽值而创建的变量。

此外,如果您试图将代码从1迁移到2,您可以根据https://www.tensorflow.org/guide/migrate.

最新更新