首页 > 解决方案 > Keras:训练期间和 epoch 结束时的不同验证 AUROC

问题描述

根据我计算的时间,我得到不同的 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)

Keras 回调在哪里roc_callback使用 sklearn 在每个 epoch 结束时计算roc_auc_scoreAUROC。我使用此处定义的代码。

当我训练模型时,我得到以下统计数据:

  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

那么训练期间的 AUROC 是如何随着每个 epoch 的增加而计算的呢?为什么它与在 epoch 结束时计算的不同?

标签: pythontensorflowkeras

解决方案


在训练期间,指标是“按批次”计算的。他们会在当前批次指标和先前结果之间以某种“平均值”为每个新批次不断更新。

现在,您的回调计算“整个数据”,并且仅在最后。两种方法之间会有正常差异。

很常见的是,下一个 epoch 以比上一个 epoch 显示的值更好的指标开始,因为旧指标的平均值包括很多当时没有训练的批次。

您可以通过调用来执行更精确的比较model.evaluate(x_test,y_test)。不确定通过调用此“期间”训练是否会发生冲突,但您可以单独训练每个时期并在每个时期之间调用它。


奇怪的东西:

y_pred你的里面没有roc_callback。你是叫model.predict()里面的吗?


推荐阅读