根据计算时间的不同,我会得到不同的 AUROC。我的代码是
def auc_roc(y_true, y_pred):
# any tensorflow metric
value, update_op = tf.metrics.auc(y_true, y_pred)
return update_op
model.compile(loss='binary_crossentropy', optimizer=optim, metrics=['accuracy', auc_roc])
my_callbacks = [roc_callback(training_data=(x_train, y_train),validation_data=(x_test,y_test))]
model.fit(x_train, y_train, validation_data=(x_test, y_test), callbacks=my_callbacks)
其中,roc_callback
是一个 Keras 回调,它使用 sklearn 中的 roc_auc_score
计算每个时期结束时的 AUROC。我使用定义的代码 here .
当我训练模型时,我得到以下统计数据:
Train on 38470 samples, validate on 9618 samples
Epoch 1/15
38470/38470 [==============================] - auc_roc: 0.5116 - val_loss: 0.6899 - val_acc: 0.6274 - val_auc_roc: 0.5440
roc-auc_val: 0.5973
Epoch 2/15
38470/38470 [==============================] - auc_roc: 0.5777 - val_loss: 0.6284 - val_acc: 0.6870 - val_auc_roc: 0.6027
roc-auc_val: 0.6391
.
.
.
.
.
.
.
Epoch 12/15
38470/38470 [==============================] - auc_roc: 0.8754 - val_loss: 0.9569 - val_acc: 0.7747 - val_auc_roc: 0.8779
roc-auc_val: 0.6369
那么训练过程中每个 epoch 的 AUROC 是如何计算的呢?为什么它与 epoch 结束时计算的不同?
最佳答案
在训练期间,指标是“每批处理”计算的。 他们会以当前批处理指标和之前结果之间的某种“平均值”不断更新每个新批处理。
现在,您的回调计算“整个数据”,并且仅在最后计算。两种方法之间存在正常差异。
很常见的是,下一个纪元以比上一个纪元显示的值更好的指标开始,因为旧指标的平均值中包含许多当时未训练的批处理。
您可以通过调用model.evaluate(x_test,y_test)
来执行更精确的比较。不确定将其称为“训练期间”是否会产生冲突,但您可以单独训练每个时期并在每个时期之间调用此方法。
奇怪的事情:
您的 roc_callback
中没有任何 y_pred
。您是否在其中调用 model.predict()
?
关于python - Keras:训练期间和纪元结束时的不同验证 AUROC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51291804/