【问题标题】:Adam optimizer between Tf 1 and Tf 2Tf 1 和 Tf 2 之间的 Adam 优化器
【发布时间】:2021-12-18 19:54:14
【问题描述】:

我试图在 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 是:

在 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 中相同的结果,我将不胜感激。

非常感谢!

【问题讨论】:

    标签: tensorflow tensorflow2.0 tensorflow1.15


    【解决方案1】:

    如果您改为这样做:

    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 ]
    

    【讨论】:

    • 我看到了问题!太好了,谢谢!
    【解决方案2】:

    可重复性是商业 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 自动执行此操作。

    【讨论】:

    • 感谢丹尼尔,您的解释。我阅读了您提供的所有链接,考虑到项目的整个范围,它们非常有帮助。但是,在提供的示例中,我仍然不明白为什么使用相同的函数会得到两个不同的结果。这些示例在此处提供:github.com/tensorflow/tensorflow/blob/master/tensorflow/python/…
    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2022-01-10
    • 2019-11-05
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多