You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何设置restore_best_weights=True后模型结果未更新?

EarlyStopping restore_best_weights=True未正确恢复权重的问题解决

你遇到的是TensorFlow 2.12版本中EarlyStopping组件的已知bug:当设置restore_best_weights=True时,日志显示已恢复最佳epoch的权重,但模型评估结果却对应中间epoch的损失值,并未正确反映恢复后的模型性能。

解决方案

1. 升级TensorFlow版本

该bug在TensorFlow 2.13及后续版本中已被修复,直接升级即可解决问题:

pip install --upgrade tensorflow

2. 手动保存并加载最佳权重(适用于无法升级的场景)

结合ModelCheckpoint回调手动保存训练过程中的最佳权重,训练结束后再加载到模型中,绕过EarlyStopping的恢复权重bug:

修改后的完整代码:

import numpy as np
from tensorflow.keras.utils import set_random_seed
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

np.random.seed(1)
set_random_seed(2)

x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 4., 2., 5.])

model = Sequential()
model.add(Dense(2, input_shape=(1, ), activation='tanh'))
model.add(Dense(4, activation='relu'))
model.add(Dense(1))

model.compile(optimizer=RMSprop(learning_rate=0.1), loss='mse')

# 配置ModelCheckpoint保存最佳权重
checkpoint = ModelCheckpoint(
    'best_model_weights.h5',
    monitor='loss',
    save_best_only=True,
    save_weights_only=True,
    verbose=1
)
stopmon = EarlyStopping(monitor='loss', patience=2, verbose=1)
history = model.fit(x, y, epochs=100, verbose=2, callbacks=[checkpoint, stopmon])

# 加载保存的最佳权重
model.load_weights('best_model_weights.h5')

# 重新评估模型
res = model.evaluate(x, y, verbose=1)
print(f'best={min(history.history["loss"]):.4f}, loss={res:.4f}')

运行这段代码后,模型评估的loss会与最佳epoch的loss一致,确保使用的是训练过程中性能最好的权重。


内容的提问来源于stack exchange,提问作者Michel de Ruiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:13:15