TensorFlow Adam Optimizer 状态未更新( get_config )

Posted

技术标签:

【中文标题】TensorFlow Adam Optimizer 状态未更新( get_config )【英文标题】:Tensorflow Adam Optimizer state not updating ( get_config ) 【发布时间】:2021-01-29 18:53:41 【问题描述】:

我使用optimizer.get_config() 来获取我的亚当优化器的最终状态(如https://***.com/a/60077159/607528)但是.get_config() 正在返回初始状态。我认为这意味着以下之一

    .get_config() 应该返回初始状态 我的优化器没有更新,因为我设置错误 我的优化器未更新 tf 的 adam 已损坏(极不可能) 我的优化器正在更新,但在我调用 .get_config() 之前正在某个地方重置 还有别的吗?

当然,我最初在一个包含训练和验证集等的适当项目中注意到了这个问题,但这里有一个非常简单的 sn-p,它似乎重现了这个问题:

import tensorflow as tf
import numpy as np

x=np.random.rand(100)
y=(x*3).round()

model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x, y, epochs=500)
model.evaluate(x, y)

model.optimizer.get_config()

【问题讨论】:

你到底把什么叫做状态?如果你的意思是跑步的意思,那么你的方法是错误的。 @Dr.Snoopy 是的 - 我希望能够以或多或少相同的 lr/momentum 重新开始训练 【参考方案1】:

如果您想恢复训练 - 您应该保存优化器权重,而不是配置:

    weight_values = optimizer.get_weights()
    with open(self.output_path+'optimizer.pkl', 'wb') as f:
        pickle.dump(weight_values, f)

然后加载它们:

    model.fit(dummy_x, dummy_y, epochs=500) # build optimizer by fitting model with dummy input - e.g. random tensors with simpliest shape
    with open(self.path_to_saved_model+'optimizer.pkl', 'rb') as f:
        weight_values = pickle.load(f)
    optimizer.set_weights(weight_values)

【讨论】:

谢谢@andrey:这个答案非常正确,我在测试之前接受了这个。可悲的是,我是它导致我遇到了一个新问题ValueError: You called set_weights(weights) on optimizer Adam with a weight list of length 255, but the optimizer was expecting 0 weights. 在***.com/a/49504376/607528 之后我尝试调用_make_train_function,它在 TF2.3 中不存在 - 但是make_train_function 确实存在。但是model.make_train_function(); model.optimizer.set_weights(weight_values) 仍然不能解决问题。想法? @*** 你必须在加载权重之前构建优化器 - 查看更新的答案

以上是关于TensorFlow Adam Optimizer 状态未更新( get_config )的主要内容,如果未能解决你的问题,请参考以下文章

tf.kerastf.keras使用tensorflow中定义的optimizer

如何在 tensorflow 2.0.0 中使用 Lazy Adam 优化器

神经网络优化算法如何选择Adam,SGD

Pytorch自定义优化器Optimizer简单总结(附AdamW代码分析)

Pytorch自定义优化器Optimizer简单总结(附AdamW代码分析)

什么是 Adam Optimizer 权重衰减的正确方法