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 优化器
Pytorch自定义优化器Optimizer简单总结(附AdamW代码分析)