【问题标题】:accuracy: precision: recall: 0.9020 are always the same准确率:精度:召回率:0.9020 始终相同
【发布时间】:2021-05-09 20:45:57
【问题描述】:

我的测试数据集中有5960 图像: 我得到了结果指标:

TP: 5116.0  
FP: 794.0   
TN: 5116.0  
FN: 794.0

len(testX) = 5960

一个纪元的日志:

185/185 [==============================] - 1s 6ms/step - loss: 0.4095 - 
                                           tp: 5127.0000 - fp: 783.0000 - 
                                           tn: 5127.0000 - fn: 783.0000 - 
                                           accuracy: 0.8675 - precision: 0.8675 - 
                                           recall: 0.8675 - auc: 0.9200

加载图片:

label = 1 if label == "positive" else 0
...
(trainX, testX, trainY, testY) = train_test_split(data, labels,
test_size=0.2, random_state=42)
# convert the labels from integers to vectors
testY = to_categorical(testY, num_classes=2)

我使用了 keras.metrics,但我只有两个标签:(0 和 1)。 我做错了什么?

loss, tp, fp, tn, fn, accuracy, precision, recall, auc = model.evaluate(testX, testY, verbose=1)

我认为当 image1 有标签'1'时,

  1. 它将 +1 添加到 TP(标签 '1')
  2. +1 到 TN(标签“0”)。

我的模特:

    model.add(Conv2D(20, (5, 5), padding="same",
        input_shape=inputShape))
    model.add(Activation("relu"))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

    # second set of CONV => RELU => POOL layers
    model.add(Conv2D(50, (5, 5), padding="same"))
    model.add(Activation("relu"))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

    # first (and only) set of FC => RELU layers
    model.add(Flatten())
    model.add(Dense(500))
    model.add(Activation("relu"))
    model.add(Dropout(0.05))

    # softmax classifier
    model.add(Dense(classes))
    model.add(Activation("softmax"))

【问题讨论】:

  • 你能添加你的模型吗?
  • 完成。我添加了一个模型。
  • 您对标签应用了一种热编码操作?什么是损失函数?有什么不对劲。 len(testX) = 5960 应该等于 TP + TN + FP + FN
  • 是的。我同意你的看法。但我不知道为什么......
  • 我添加了更多代码。

标签: keras metrics


【解决方案1】:

当您将 one-hot-encoding 应用于二进制分类时,这些指标就会混乱。这是一个例子:

您的标签在一次热编码后如下所示:[ ... [1,0], [0,1], [1,0] ... ]

如果你注意你的TP 等于TN。当正确预测为 0 类时,0 类为 TP,1 类也为 TN。这就是它们相等的原因。

不要应用一种热编码和更改:

model.add(Dense(1))
model.add(Activation("sigmoid"))

同样损失应该是binary_crossentropy

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 2016-06-19
    • 2020-09-02
    • 2016-01-09
    • 2015-12-05
    • 2017-06-21
    • 2022-01-06
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多