尽管对稀疏目标使用稀疏分类熵,但 Logits 和标签必须具有相同的第一维误差

Posted

技术标签:

【中文标题】尽管对稀疏目标使用稀疏分类熵,但 Logits 和标签必须具有相同的第一维误差【英文标题】:Logits and labels must have the same first dimension error, despite using sparse catogorical entropy for sparse targets 【发布时间】:2022-01-12 14:00:03 【问题描述】:

这些是我的特征和目标变量的形状。

(1382, 1785, 2) (1382, 2)

这里的目标有两个标签,每个标签有相同的28个类。我有一个 CNN 网络如下:-

model.add(Conv1D(100,5, activation='relu', input_shape=(1785,2)))
model.add(MaxPooling1D(pool_size=5))
model.add(Conv1D(64,10, activation='relu'))
model.add(MaxPooling1D(pool_size=4))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(Dense(28, activation='softmax'))

当我使用一个热编码目标 (1382,28) 和分类交叉熵损失函数时,模型运行良好且没有错误。

但是当我使用稀疏目标(1382,2)和稀疏分类交叉熵损失函数时,我遇到了以下错误。

logits and labels must have the same first dimension, got logits shape [20,28] and labels shape [40]
 [[node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at \AppData\Local\Temp/ipykernel_9932/3729291395.py:1) ]] [Op:__inference_train_function_11741]

根据我从发布相同问题的人那里看到的情况,似乎对一个热门编码目标变量使用了稀疏分类交叉熵。

我认为批次的形状可能存在一些问题。 logit 的形状变为 [x,28],其中 x 是批量大小。 另一个可能是问题的事情是我有两个标签,但没有关于如何从那里解决问题的线索。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

如果你使用SparseCategoricalCrossEntropy作为你的损失函数,你需要确保你的数据中的每个数据样本都属于一个从0到27的类别。例如:

samples = 25
labels = tf.random.uniform((25, ), maxval=28, dtype=tf.int32)
print(labels)
tf.Tensor(
[12  7  1 13 22 14 26 13  6  1 27  1 11 18  5 18  5  6 12 14 21 18 17 12
  5], shape=(25,), dtype=int32)

考虑labels 的形状,它既不是(25, 2) 也不是(25, 28),而是与SparseCategoricalCrossEntropy 一起使用的(25,)

【讨论】:

如果我的标签是 (x,2) 的形式,有没有办法使用稀疏分类交叉熵?我无法将标签转换为 (x, ),因为我需要预测两个标签。 那么 SparseCategoricalCrossEntropy 不是您的用例的正确解决方案。这没有任何意义。您正在处理多标签问题。为什么不能使用分类交叉熵? 我使用了分类交叉熵。我只是想知道是否可以将稀疏分类交叉熵用于多标签问题。我明白为什么它现在不能用于多标签。谢谢

以上是关于尽管对稀疏目标使用稀疏分类熵,但 Logits 和标签必须具有相同的第一维误差的主要内容,如果未能解决你的问题,请参考以下文章

稀疏分类交叉熵未按预期工作

具有对数损失的 TensorFlow 单 sigmoid 输出与具有稀疏 softmax 交叉熵损失的两个线性输出,用于二进制分类

一种热编码分类特征 - 仅稀疏形式

TypeError:传递了稀疏矩阵,但需要密集数据。使用 X.toarray() 转换为密集的 numpy 数组。使用 NaiveBayes 分类器

用于文档分类的 scipy/sklearn 稀疏矩阵分解

映射比稀疏向量更好?