首页 > 解决方案 > 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 结束后不会重置并继续添加。

标签: pythontensorflowkeras

解决方案


推荐阅读