我想知道Keras如何计算指标(自定义指标)。
例如,假设我有以下指标,它会产生预测和基本事实之间的最大误差:
def max_error(y_true, y_pred):
import keras.backend as K
return K.max(K.abs(y_true-y_pred))
输出标量指标是在所有小批量上计算然后平均的,还是直接在整个数据集上计算的指标(培训或验证)?
答案 0 :(得分:3)
训练数据集和验证数据集的指标之间存在差异。对于val集,度量值在整个val数据集的历元结束时计算。 对于列车集:度量是在批次结束时计算的,平均值会持续更新,直到时期结束。
正如您所见,火车组的指标是即时评估的,每个批次都使用不同的权重进行评估。这就是为什么火车指标有时表现出奇怪的行为。
答案 1 :(得分:2)
丹尼斯已经清楚地解释了这一点。
还有一点要指出的是,如果您想要计算所有列车数据集的指标,或者您的客户指标函数可能只是单次通过而不是平均计算,您可以尝试 使用keras回调并定义on_epoch_end,在on_epoch_end方法中,您可以在整个列车数据上进行计算。
像这样: def on_epoch_end(self, epoch, logs={}):
y_pred = self.model.predict(self.X_train, verbose=0)
score = max_error(self.y_train, y_pred)
y_val_pred = self.model.predict(self.X_val, verbose=0)
val_score = max_error(self.y_val, y_val_pred)
print("\n ROC-AUC - epoch: %d - train score: %.6f \n - val score: %.6f" % (epoch+1, score, val_score))
您需要将列车数据和val数据传递给model.fit的validation_data参数。
答案 2 :(得分:2)
关于VALIDATION集合的指标需要了解的其他事项:
与另一个答案中所建议的相反,我只看到验证集上的度量是分批计算的,然后取平均值(当然,在纪元末尾的训练模型是与针对训练集计算指标得分的方式相反。
如果要一次对整个验证数据进行计算,则必须使用已接受答案中所述的回调。
当然,对于通常的度量标准,无论您是先批量计算并求平均值,还是一次完成全部计算,都不会有任何区别。但是自定义指标很可能是:我有一种情况,指标会根据数据调整参数。