python - Keras TensorBoard 显示不正确的召回/精度指标
问题描述
这个想法是设置具有良好指标的 TensorBoard 来跟踪我的模型训练和评估模型性能。但是,大多数指标似乎不正确(尤其是精度/召回/false_negative_count)我使用的是 tf v1.8.0。
为了创建指标,我使用以下代码:
def as_keras_metric(method, **kwargs):
@functools.wraps(method)
def wrapper(self, args):
""" Wrapper for turning tensorflow metrics into keras metrics """
value, update_op = method(self, args, **kwargs)
tf.keras.backend.get_session().run(tf.local_variables_initializer())
with tf.control_dependencies([update_op]):
value = tf.identity(value)
return value
return wrapper
def create_metrics():
auc_roc = as_keras_metric(tf.metrics.auc)
recall = as_keras_metric(tf.metrics.recall)
precision = as_keras_metric(tf.metrics.precision)
fn = as_keras_metric(tf.metrics.false_negatives)
fp = as_keras_metric(tf.metrics.false_positives)
kwargs = {'specificity': 0.95}
sensitivity_at_specificity = as_keras_metric(tf.metrics.sensitivity_at_specificity, **kwargs)
mean_per_class_accuracy = as_keras_metric(tf.metrics.mean_per_class_accuracy, **{'num_classes': 2})
return [fn, fp, auc_roc, recall, precision, sensitivity_at_specificity, mean_per_class_accuracy, tf.keras.metrics.binary_accuracy]
我使用以下方法编译模型:
model.compile(loss='binary_crossentropy', optimizer='adadelta', metrics=create_metrics())
并适合使用
model.fit_generator(generator=KerasSequence)
现在问题来了:
我的数据不平衡,我有大约 2% 的观察结果属于 +ve 类。让我们看看最后几个时期。
纪元 16/50 6/7 [========================>.....] - ETA:0s - 损失:5.9874 - auc: 0.9171 - 召回:1.0000 - 精度:0.0068 - 灵敏度_at_specificity:0.8050 - mean_per_class_accuracy:0.5000 - 假阴性:0.0000e+00 - 假阳性:13570.6667 - binary_accuracy:1.0000
纪元 50/50 6/7 [========================>.....] - ETA:0s - 损失:0.0205 - auc: 0.9207 - 召回率:1.0000 - 精度:0.0069 - 敏感度_at_specificity:0.8494 - mean_per_class_accuracy:0.5000 - 假阴性:0.0000e+00 - 假阳性:43821.6667 - binary_accuracy:1.0000
我知道 500 个样本中有 6 个被预测为 +ve 类。所以我不明白怎么可能有这些指标。它们是相互排斥的。召回率为 1,精度如此之低。这表明我实际上对所有观察结果都预测为 1,而实际上只有 5/500 被预测为 +ve 类。false_positive
另外,当我只有 500 个训练样本时,怎么可能得到43000 的计数。它随着每个时代的发展而增长
截图
损失为 0(过度拟合),但误报计数在每个 epoch 增加......为什么?有趣的是,在第一个 epoch 之后,误报计数为 200。这让我觉得指标在 epoch 结束后不会重置并继续添加。
解决方案
推荐阅读
- vba - Excel vba 只杀死指定的扩展名
- android - 在 OnePlus 6 上显示广告时应用程序崩溃
- mysql - 如何在查看天气的同时获取关注者列表我是否关注关注者?
- java - Java Vector `removeElementAt` 函数实际上是如何工作的?
- c - 使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试
- codenameone - 选择器没有在正确的时刻显示
- image - 如何自动删除 7 天前创建的 docker 镜像?
- android - 使用 when 使用 Kotlin 检查 Android SDK 版本
- angular - 如何在打字稿/角度设置html元素的样式
- python - 我陷入了无限循环