【问题标题】:How to get probability of each class instead of one hot encoded array with one value 1 and others 0?如何获得每个类的概率,而不是一个值为 1 和其他值为 0 的热编码数组?
【发布时间】:2020-01-23 16:10:26
【问题描述】:

我的 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)

【问题讨论】:

  • 尝试在最后一层使用sigmoid激活函数代替softmax
  • @techytushar 是的,这是最后的手段。

标签: keras conv-neural-network categorical-data multiclass-classification


【解决方案1】:

这样做的一种方法是删除最后一个激活层 (related issue)。

您可以使用model.layers[-1].activation=None 来做到这一点。

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

【讨论】:

  • 我确实认为数据存在一些问题。但是,我如何检查训练是否“正确”完成。你为什么提到检查培训。请详细说明。谢谢
  • 我的意思是您的模型以 100% 的置信度预测特定类别,因此您可能想检查您正在训练的内容(错误标记的数据?)。
  • 我正在使用 .flow_from_directory() 函数来提供数据。每个子目录都有标签名称,并且只包含与该标签相关的文件
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2021-07-31
  • 2023-01-19
  • 2016-12-17
相关资源
最近更新 更多