对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,有可能只得到 0 和 1 吗?

Is that possible to get only 0 and 1 For multiclass multilabel problem in tensorflow.keras.models.Sequential.predict?

假设我有 3 个 类,每个样本可以属于其中任何一个 类。标签看起来像这样。

[
    [1 0 0]
    [0 1 0]
    [0 0 1]
    [1 1 0]
    [1 0 1]
    [0 1 1]
    [1 1 1]
]

我将输出设置为 Dense(3, activation="sigmoid"),并使用优化器="adam"、loss="binary_crossentropy" 进行编译。 根据 Keras 输出,我估计损失为 0.05,准确度为 0.98。

我认为如果我使用 sigmoid 和 binary_crossentropy,我只会得到 1 或 0 的预测值。然而,model.predict(training-features) 给了我 1 到 0 之间的值,比如 0.0026。我已经用 sigmoid 和 softmax 尝试了 categorical_crossentropy 和 binary_crossentropy 之间的所有 4 种组合。 Model.predict 总是 returns 一个介于 0 和 1 之间的值,形状为 n_samples by n_classes。在上面的例子中是 7x3。

然后我将值剪裁为 0.5,如下所示并检查 accuracy_score(training_labels, preds)。分数下降到0.1.

preds[preds>=0.5] = 1
preds[preds<0.5] = 0

如果有人可以指导我如何解决这个问题,我将不胜感激。

谢谢!

根据您的描述,这是一个多标签分类问题,因此您应该使用 sigmoid 作为最后一层的激活函数,并使用 binary_crossentropy 作为损失函数。那是因为我们认为每个标签的分类独立于所有其他标签。因此,在这种情况下使用 softmaxcategorical_crossentropy 是错误的。

Keras 报告的精度与使用 sklearn.metrics.accuracy_score() 函数计算的精度之间的差异不是由于四舍五入;实际上,Keras 会执行与计算准确度相同的舍入(或裁剪)操作。相反,差异是由于多标签分类模式中的 accuracy_score 函数仅在该样本的所有真实标签和预测标签相互匹配时才认为该样本被正确分类。这已在 documentation:

中明确说明

In multilabel classification, this function computes subset accuracy: the set of labels predicted for a sample must exactly match the corresponding set of labels in y_true.

但是,在 Keras 中,binary_accuracy 函数报告正确分类标签的平均分数(即部分匹配是可以接受的)。为了更好地理解这一点,请考虑以下示例:

True labels  | Predictions | Keras binary acc | accuracy_score
-----------------------------------------------------------------
  [1 0 0]    |   [1 0 1]   | 2 correct = 0.66 | not match = 0.00
  [0 1 1]    |   [0 1 1]   | 3 correct = 1.00 | match     = 1.00
  [1 0 1]    |   [0 0 1]   | 2 correct = 0.66 | not match = 0.00
=================================================================
      average reported acc |             0.77 |             0.33