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

如何在Keras训练周期内获取当前批次的预测结果?

获取训练批次的错误预测样本用于难负样本挖掘

这问题我之前做分类任务搞难样本挖掘时也碰到过,其实有两种实用的实现方式,你可以根据自己的需求选:

方式一:简洁直接,基于predict_on_batch

这种方式不需要改动原有训练逻辑太多,核心思路是先让模型对当前批次做预测,找出错误样本后再执行训练(或者先训练再预测,取决于你想要的是训练前还是训练后的预测结果,通常难样本挖掘用训练前的预测结果更合理)。

代码示例(分类任务为例)

假设你的输入x是当前批次数据,y是one-hot编码的标签:

import numpy as np

# 1. 获取模型对当前批次的预测结果
batch_predictions = model.predict_on_batch(x)

# 2. 把预测结果和真实标签转换成类别索引
pred_labels = np.argmax(batch_predictions, axis=1)
true_labels = np.argmax(y, axis=1)

# 3. 筛选出预测错误的样本索引
wrong_idx = np.where(pred_labels != true_labels)[0]

# 4. 提取错误样本
hard_x = x[wrong_idx]
hard_y = y[wrong_idx]

# 5. 保存难样本——可以用numpy的savez方便后续加载
# 首次保存
np.savez("hard_samples.npz", x=hard_x, y=hard_y)
# 后续批次追加的话,可以这样写:
# try:
#     existing = np.load("hard_samples.npz")
#     updated_x = np.concatenate([existing["x"], hard_x], axis=0)
#     updated_y = np.concatenate([existing["y"], hard_y], axis=0)
#     np.savez("hard_samples.npz", x=updated_x, y=updated_y)
# except FileNotFoundError:
#     np.savez("hard_samples.npz", x=hard_x, y=hard_y)

# 6. 执行当前批次的训练
_loss, _acc = model.train_on_batch(x, y)

如果你的y已经是类别索引(不是one-hot),那第2步的true_labels直接用y就行,不用np.argmax。

方式二:更高效,自定义训练步骤

上面的方式会做两次前向传播(一次predict_on_batch,一次train_on_batch),如果你的批次数据很大,会有点浪费算力。这时候可以用tf.GradientTape手动实现训练步骤,一次前向传播同时拿到预测结果、计算损失并更新权重:

代码示例

import tensorflow as tf

# 自定义训练函数
def custom_train_step(x, y):
    with tf.GradientTape() as tape:
        # 一次前向传播得到预测结果
        predictions = model(x, training=True)
        # 计算损失(用模型编译时定义的损失函数)
        loss = model.compiled_loss(y, predictions)
    
    # 计算梯度并更新模型权重
    gradients = tape.gradient(loss, model.trainable_variables)
    model.optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    
    # 更新准确率指标
    model.compiled_metrics[0].update_state(y, predictions)
    acc = model.compiled_metrics[0].result()
    
    return loss, acc, predictions

# 在训练循环中调用
_loss, _acc, batch_predictions = custom_train_step(x, y)

# 后续处理预测结果、筛选保存难样本的逻辑和方式一一样
# ...

后续难样本挖掘的使用建议

积累了一定数量的难样本后,你可以:

  • 每次训练时混合一定比例的难样本和普通样本,提升模型对难例的识别能力;
  • 定期单独用难样本训练几个epoch,针对性优化;
  • 结合样本的预测置信度(比如预测概率很低但分类错误的样本),进一步筛选更有价值的难样本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:29