python - 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_score
AUROC。我使用此处定义的代码。
当我训练模型时,我得到以下统计数据:
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 结束时计算的不同?
解决方案
在训练期间,指标是“按批次”计算的。他们会在当前批次指标和先前结果之间以某种“平均值”为每个新批次不断更新。
现在,您的回调计算“整个数据”,并且仅在最后。两种方法之间会有正常差异。
很常见的是,下一个 epoch 以比上一个 epoch 显示的值更好的指标开始,因为旧指标的平均值包括很多当时没有训练的批次。
您可以通过调用来执行更精确的比较model.evaluate(x_test,y_test)
。不确定通过调用此“期间”训练是否会发生冲突,但您可以单独训练每个时期并在每个时期之间调用它。
奇怪的东西:
y_pred
你的里面没有roc_callback
。你是叫model.predict()
里面的吗?
推荐阅读
- python - Flask 重定向不起作用,没有错误,并且 db 没有更新
- javascript - 布尔数据似乎在 vue 3 中的 vue 反应中表现得很奇怪
- javascript - d3.js 将链接线向右移动
- azure-iot-hub - 如何在二头肌中部署 Azure IoT Hub 存储帐户归档?
- r - 在两个不同的向量上匹配相同的字符串
- tcp - 如何强制终止 Ejabberd 会话
- php - 如果结果集中的值与当前登录的用户不匹配,则有条件地使用备用值
- amazon-web-services - 如何从 EKS Monitoring 中账户 A 中的 node-exporter pod 中提取账户 B 中的 Prometheus pod 的日志?
- listview - FDQuery.Refresh 在单独的线程中同时 LiveBindings AutoActive := true
- typescript - 从另一个接口中的键的字符串数组创建具有固定长度键的 Record 类型