首页 > 解决方案 > 准确率:精度:召回率:0.9020 始终相同

问题描述

我在我的测试数据集中有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"))

标签: kerasmetrics

解决方案


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

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

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

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

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

也应该是损失binary_crossentropy


推荐阅读