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

如何设置Keras每N个训练轮次后执行模型验证?

实现每N个训练轮次后执行验证的两种方法

这个需求太常见了——当验证数据集很大时,每轮都跑验证确实会浪费不少时间。我给你分享两种实用的实现方式,你可以根据自己的习惯选:

方法1:自定义回调函数(最灵活)

这种方法是通过Keras的Callback来手动控制验证时机,完全避开默认的每轮验证逻辑,步骤如下:

  1. 首先,移除model.fit_generator里的validation_data和validation_steps参数,防止默认的每轮验证触发。
  2. 写一个自定义的回调类,在每个epoch结束时判断是否到达了我们设定的验证间隔,若是则手动调用evaluate_generator执行验证。

代码示例

from keras.callbacks import Callback

class PeriodicValidation(Callback):
    def __init__(self, validation_generator, validation_steps, every_n_epochs=5):
        super().__init__()
        self.val_gen = validation_generator
        self.val_steps = validation_steps
        self.every_n = every_n_epochs  # 验证间隔,比如每5轮一次

    def on_epoch_end(self, epoch, logs=None):
        # Keras里epoch从0开始计数,所以要+1来匹配我们日常说的第N轮
        if (epoch + 1) % self.every_n == 0:
            print(f"\n=== 开始第{epoch+1}轮后的验证 ===")
            # 手动执行验证
            val_loss, val_acc = self.model.evaluate_generator(
                self.val_gen,
                steps=self.val_steps,
                verbose=2,
                workers=12
            )
            # 把验证结果写入训练日志,这样能在控制台看到统一的输出
            if logs is not None:
                logs['val_loss'] = val_loss
                logs['val_acc'] = val_acc
            print(f"验证结果:loss={val_loss:.4f}, accuracy={val_acc:.4f}\n")

使用方式

# 初始化自定义回调,替换N为你想要的间隔
periodic_val_callback = PeriodicValidation(
    validation_generator,
    validation_steps=nb_validation_samples // batch_size,
    every_n_epochs=N
)

# 启动训练,注意不要传validation_data和validation_steps
model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    verbose=2,
    workers=12,
    callbacks=[periodic_val_callback]
)

优点

  • 完全自定义验证时机,还能在验证后加额外逻辑(比如保存最佳模型、发送通知)
  • 验证结果会被整合到训练日志里,方便后续分析

方法2:分阶段循环训练(更直观)

如果觉得写回调有点麻烦,也可以手动拆分训练过程:每次训练N个epoch,然后手动执行一次验证,循环直到完成总训练轮次。

代码示例

total_epochs = epochs
n_epochs_per_round = N  # 每N轮验证一次
current_epoch = 0

while current_epoch < total_epochs:
    # 处理最后一轮可能不足N的情况
    epochs_to_run = min(n_epochs_per_round, total_epochs - current_epoch)
    
    print(f"\n=== 训练第{current_epoch+1}~{current_epoch+epochs_to_run}轮 ===")
    model.fit_generator(
        train_generator,
        steps_per_epoch=nb_train_samples // batch_size,
        epochs=current_epoch + epochs_to_run,
        initial_epoch=current_epoch,
        verbose=2,
        workers=12
    )
    
    # 更新当前训练进度
    current_epoch += epochs_to_run
    
    # 执行验证
    print("\n=== 开始验证 ===")
    val_loss, val_acc = model.evaluate_generator(
        validation_generator,
        steps=nb_validation_samples // batch_size,
        verbose=2,
        workers=12
    )
    print(f"验证结果:loss={val_loss:.4f}, accuracy={val_acc:.4f}\n")
    
    # 可选:保存当前模型
    model.save(f"model_after_{current_epoch}_epochs.h5")

优点

  • 逻辑简单易懂,不用写回调函数,适合新手快速上手
  • 可以在每个训练阶段后灵活调整策略(比如修改学习率、更换数据增强方式)

注意事项

  • 如果用的是TensorFlow 2.x,建议改用model.fit替代fit_generator(后者已被弃用),两种方法的逻辑完全适用,只需要把fit_generator换成fit即可。
  • 确保你的validation_generator是可重复使用的(比如不要是一次性迭代器),否则第二次验证会报错。
  • 验证时建议关闭验证数据的随机变换(比如设置shuffle=False),保证每次验证的结果具有可比性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:27:40