如何获取已加载Keras模型的训练轮次(epochs)数量?
获取已加载Keras模型的训练轮次
很遗憾,默认情况下用load_model()加载的Keras模型是无法直接获取训练轮次的。原因很简单:Keras默认的模型保存格式(不管是.h5还是SavedModel)只会存储模型的架构、权重,以及如果你指定保存优化器状态的话会包含优化器的参数,但训练过程的元数据(比如总共训练了多少轮)并不会被自动保存到模型文件里。
不过不用慌,我们可以通过几个提前准备的方法来解决这个问题,分情况来看:
1. 训练时主动保存训练轮次元数据
这是最稳妥的方案,在训练模型的时候,把训练的epochs数和模型一起保存到额外的文件中:
# 训练阶段代码 import json from tensorflow.keras.models import Sequential # 假设你定义好了模型 model = Sequential(...) epochs = 10 history = model.fit(X_train, y_train, epochs=epochs) # 保存模型 model.save('trained_model.h5') # 把训练轮次保存到JSON文件 metadata = {'total_training_epochs': epochs} with open('model_metadata.json', 'w') as f: json.dump(metadata, f)
之后加载模型时,同时读取这个元数据文件:
# 加载阶段代码 from tensorflow.keras.models import load_model import json model = load_model('trained_model.h5') with open('model_metadata.json', 'r') as f: metadata = json.load(f) total_epochs = metadata['total_training_epochs'] print(f"模型总共训练了 {total_epochs} 轮")
2. 保存训练的History对象
如果你在训练时保留了fit()返回的History对象,也可以把它保存下来,之后通过History里的日志长度来获取轮次(因为每一轮训练都会生成一条loss/metrics记录):
# 训练时保存History import pickle history = model.fit(X_train, y_train, epochs=8) with open('training_history.pkl', 'wb') as f: pickle.dump(history.history, f)
加载时读取并计算:
# 加载后获取轮次 import pickle with open('training_history.pkl', 'rb') as f: history = pickle.load(f) total_epochs = len(history['loss']) # loss列表的长度就是训练轮次 print(f"模型训练了 {total_epochs} 轮")
3. 利用带epoch信息的模型文件名
如果训练时使用了ModelCheckpoint回调,并且设置文件名包含当前epoch数,那可以直接从加载的模型文件名里提取轮次:
# 训练时设置带epoch的检查点 from tensorflow.keras.callbacks import ModelCheckpoint checkpoint_callback = ModelCheckpoint( 'model_epoch_{epoch:03d}.h5', save_freq='epoch', save_best_only=False ) model.fit(X_train, y_train, epochs=15, callbacks=[checkpoint_callback])
比如你加载的是model_epoch_015.h5,那就能直接从文件名里解析出训练到了第15轮。
注意事项
如果之前训练时完全没有做上述任何一种保存操作,那现在加载的模型里确实没有训练轮次的信息,没办法直接获取。这种情况下你只能去查找当时的训练日志,或者重新训练模型并记录轮次了。
内容的提问来源于stack exchange,提问作者Hagbard
相关产品推荐
相关产品推荐

