Keras获取各批次验证损失与精度返回None列表问题求助
问题:Keras无法获取验证集每个批次的损失与精度
我尝试获取Keras模型训练与验证阶段每个批次的损失(loss)和精度(accuracy),目前已成功获取训练集的对应指标,但获取验证集指标时得到的是全为None的列表。
我自定义了如下LossHistory回调类:
class LossHistory(keras.callbacks.Callback): def on_train_begin(self, logs={}): self.history = {'loss':[],'val_loss':[], 'accuracy':[],'val_accuracy':[], 'loss_avg':[],'val_loss_avg':[], 'accuracy_avg':[],'val_accuracy_avg':[]} def on_batch_end(self, batch, logs={}): self.history['loss'].append(logs.get('loss')) self.history['val_loss'].append(logs.get('val_loss')) self.history['accuracy'].append(logs.get('accuracy')) self.history['val_accuracy'].append(logs.get('val_accuracy')) def on_epoch_end(self, epoch, logs={}): self.history['loss_avg'].append(logs.get('loss')) self.history['val_loss_avg'].append(logs.get('val_loss')) self.history['accuracy_avg'].append(logs.get('accuracy')) self.history['val_accuracy_avg'].append(logs.get('val_accuracy'))
目前能正常获取每轮结束后的验证损失与精度平均值,但无法拿到每个批次的验证指标,想请教问题原因。
问题原因
核心原因是Keras默认不会在训练批次结束时对验证集进行评估,验证集的指标计算逻辑如下:
on_batch_end的logs参数仅包含当前训练批次的训练指标(如loss、accuracy),不会携带val_前缀的验证类指标- 只有在每轮训练结束的
on_epoch_end阶段,Keras才会完整遍历一次验证集,计算并返回验证集的整体指标(如val_loss、val_accuracy)
如果确实需要获取验证集的逐批次指标,需要手动在回调中实现验证集的批次评估:
- 在
on_batch_end方法内,手动取出验证集数据并按批次拆分 - 调用
model.test_on_batch()方法计算当前验证批次的损失与精度 - 将计算得到的指标存入自定义的历史记录字典中
内容的提问来源于stack exchange,提问作者Theodore Psillos
相关产品推荐
相关产品推荐

