keras - 准确率:精度:召回率: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 添加到 TP(标签 '1' )
- +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"))
解决方案
当您对二进制分类应用 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
。
推荐阅读
- prestashop - Prestashop 1.7 CartRule::autoAddToCart 到底做了什么?
- java - Java Eclipse:创建新类但不显示 git staging
- javascript - 似乎无法让 addEventListener 工作
- bootstrap-4 - BootStrap DataTable:重新绑定来自服务器的数据
- docker - redis-cli 不能用作 docker 命令
- javascript - 如何检查滚动是由代码还是由用户完成的?
- python - 如何将熊猫数据框中的几行合并为 1 行
- python - python graphviz中的子图方法?
- excel - 通过将图表数据放入 vba 来隐藏图表数据
- javascript - 更新未知的 Immutable.js 地图结构