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

Keras中使用EarlyStopping回调时,如何直接获取训练停止的轮次数?

获取Keras EarlyStopping停止时的epoch数的便捷方法

嘿,这个问题我之前也纠结过,完全不用自己去折腾日志和patience参数计算!Keras的EarlyStopping回调本身就提供了直接获取停止epoch的属性,简单又准确。

核心方法:使用stopped_epoch属性

EarlyStopping对象在训练结束后会自动设置stopped_epoch属性:

  • 如果训练被提前停止,它会返回停止时的epoch索引(从0开始计数)
  • 如果训练跑完了所有预设的epoch(没有触发提前停止),它的值会是-1

代码示例

from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np

# 构建测试用的模型和数据
X_train = np.random.rand(1000, 10)
y_train = np.random.randint(0, 2, 1000)
X_val = np.random.rand(200, 10)
y_val = np.random.randint(0, 2, 200)

model = Sequential([Dense(32, activation='relu', input_shape=(10,)), Dense(1, activation='sigmoid')])
model.compile(optimizer='adam', loss='binary_crossentropy')

# 定义EarlyStopping回调
early_stop = EarlyStopping(
    monitor='val_loss',
    patience=3,
    verbose=1  # 开启后训练时会打印停止提示
)

# 启动训练
history = model.fit(
    X_train, y_train,
    validation_data=(X_val, y_val),
    epochs=50,
    callbacks=[early_stop]
)

# 获取并处理停止的epoch数
if early_stop.stopped_epoch != -1:
    # 转换为我们习惯的从1开始的计数方式
    stopped_epoch_num = early_stop.stopped_epoch + 1
    print(f"\n训练在第 {stopped_epoch_num} 个epoch提前停止")
else:
    print("\n训练完成了所有50个epoch,未触发提前停止")

为什么这个方法更靠谱?

比起自己去遍历history.history里的损失日志,再结合patience计算停止点,直接用stopped_epoch有两个明显优势:

  • 准确性高:这个属性是Keras内部在触发停止逻辑时直接记录的,不会因为日志处理错误或者自定义回调的干扰出错
  • 代码简洁:几行代码就能搞定,不用写额外的遍历和判断逻辑

内容的提问来源于stack exchange,提问作者AlexGuevara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:05:00