为何设置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
相关产品推荐
相关产品推荐

