首页 > 解决方案 > 如何获得每个类的概率,而不是一个值为 1 和其他值为 0 的热编码数组?

问题描述

我的 Sequential CNN 模型作为多类分类器在 39 个类上进行了训练。至于预测,它返回一个单热编码数组,[0,0,...1,0,...]而我想要类似的东西[0.012,0.022,0.067,...,0.997,0.0004,...]

有没有办法得到这个?如果不是,我到底应该做什么才能得到这些?

我想要这样的原因是为了验证其他类的接近程度,所以如果一个人说 0.98 而其他人说 0.96 那么我做错了什么,数据不够等等。

谢谢 :)

我的模型基本上是具有以下配置的 keras.model resnet50:

model = keras.applications.resnet.ResNet50(include_top=False, weights=None, input_tensor=None, input_shape=(64,64,1), pooling='avg', classes=39)

x = model.output
x = Dropout(0.7)(x)
num_classes = 39
predictions = Dense(num_classes, activation= 'softmax')(x)
model = Model(inputs = model.input, outputs = predictions)

optimizer = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer, loss='categorical_crossentropy', metrics=['categorical_accuracy'], loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)

样本输入:

import cv2
img = cv2.imread(IMAGE_PATH, 0)
img = cv2.resize(img, (64,64))
img = np.reshape(img, (1,64,64,1))
predicted_class_indices = np.argmax(model.predict(img, verbose = 1))

样本输出:

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0.]], dtype=float32)

期望的输出(数字是假设的):

array([[0.022, 0.353, 0.0535, 0.52, 0212., 0.822, 0.532, 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0.]], dtype=float32)

标签: kerasconv-neural-networkcategorical-datamulticlass-classification

解决方案


一种方法是删除最后一个激活层(相关问题)。

您可以使用model.layers[-1].activation=None.

但是,softmax 不应该输出单热向量,而是概率分布,您可能需要检查您的训练情况。


推荐阅读