TensorFlow-Keras训练时如何在每个epoch结束后调用测试集评估性能
实现方案
你只需要在on_epoch_end回调逻辑中新增测试集评估步骤,同时将测试集准确率写入训练日志字典logs,Keras就会自动在训练输出中追加test_acc字段。由于Lambda回调的匿名函数不支持多语句逻辑,我们将回调逻辑单独封装为函数实现,修改后代码如下:
result_dic = {"epochs": []} # 单独定义epoch结束时的回调逻辑 def on_epoch_end(epoch, logs): # 评估测试集,verbose设为0避免额外输出打乱训练进度条 test_loss, test_acc = model.evaluate(x_test, y_test, batch_size=batch_size, verbose=0) # 将测试集准确率写入日志字典,训练输出会自动打印该字段 logs['test_acc'] = test_acc # 同步写入结果存储字典 result_dic["epochs"].append({ 'epoch': epoch + 1, 'acc': str(logs['acc']), 'val_acc': str(logs['val_acc']), 'test_acc': str(test_acc) }) json_logging_callback = LambdaCallback( on_epoch_begin=lambda epoch, logs: [learning_rate], on_epoch_end=on_epoch_end ) model.fit(x_train, y_train, validation_data=(x_val, y_val), batch_size=batch_size, epochs=epochs, callbacks=[json_logging_callback])
注意事项
- 如果你的模型配置了多个评估指标,
model.evaluate返回的结果会按照[总损失, 指标1, 指标2...]的顺序排列,按需取对应位置的值即可 - 测试集评估会增加单轮epoch的耗时,若测试集数据量较大可适当调大评估用的
batch_size优化速度
内容的提问来源于stack exchange,提问作者user11849691
相关产品推荐
相关产品推荐

