【问题标题】:Keras: different validation AUROC during training and on epoch endKeras:训练期间和 epoch 结束时的不同验证 AUROC
【发布时间】:2018-12-19 20:50:08
【问题描述】:

我得到不同的 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 在每个 epoch 结束时计算 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

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

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

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

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

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

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


    有些奇怪:

    您的roc_callback 中没有任何y_pred。你在里面打电话给model.predict()吗?

    【讨论】:

    • 我知道会有差异,但在后来的时代,它是巨大的。例如,在我上面发布的内容中,纪元 12 具有 val_auc_roc=0.87,并且在纪元结束时回调计算 roc-auc_val=0.6369。
    • 我已经在我的问题中链接到它,但是here you go。是的,它确实在其中调用了model.predict
    • 如果您尝试在批次之间打印该回调怎么办?对于测试,您可以在 fit 方法中设置 shuffle=False 并逐批比较以查看。我怀疑因为“auc”是基于排序的,所以在批量计算时可能会有很大的变化。
    • 我会试试看。但我怀疑你之前解释的更多:它是平均每批统计数据。但是平均批次 AUROC 与总体 AUROC 相差这么远是很不寻常的
    【解决方案2】:

    打印在进度条右侧的auc_roc 值是您提供给model.compile() 的指标。该分数是通过每次一批评估 training 数据上定义的 auc_roc 函数来计算的。随着模型继续训练,该值会更新为模型性能的运行平均值。同样,val_auc_roc 是通过在 validation 数据上评估您的 auc_roc 函数来计算的。

    另一方面,roc-auc_val 完全由您正在使用的回调 roc-auc_val 定义。查看您更密切地链接到的代码。它使用 sklearn 的函数而不是 tensorflow 的函数来确定您的模型的 AUC 分数。无论打印的 auc_rocroc-auc_val 值之间出现什么差异,都可以通过所使用的两个 AUC 函数之间的差异来解释。

    【讨论】:

    • 我确实在 epoch 结束时使用 TF 的 AUC 函数进行了尝试,我得到的值与训练期间看到的 sklearn 的值相似
    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2020-09-26
    相关资源
    最近更新 更多