accuracy: precision: recall: 0.9020 总是一样的

accuracy: precision: recall: 0.9020 are always the same

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

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

len(testX) = 5960

一个epoch的日志:

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. 它为 TP 添加 +1(标签“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"))

当您对二进制 classification 应用单热编码时,这些指标会变得混乱。这是一个例子:

经过一次热编码后,您的标签看起来像这样:[ ... [1,0], [0,1], [1,0] ... ]

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

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

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

损失也应该是binary_crossentropy.