BCEWithLogitsLoss:试图将预测标签的二进制输出作为张量,与输出层混淆

Posted

技术标签:

【中文标题】BCEWithLogitsLoss:试图将预测标签的二进制输出作为张量,与输出层混淆【英文标题】:BCEWithLogitsLoss: Trying to get binary output for predicted label as a tensor, confused with output layer 【发布时间】:2021-01-08 03:44:54 【问题描述】:

我的数据集的每个元素都有一个多标签张量,例如 [1, 0, 0, 1],并具有 1's0's 的不同组合。在这种情况下,由于我有 4 个张量,因此我的神经网络的输出层为 4。在使用 BCEWithLogitsLoss 时,当我调用模型(输入)时,我获得了一个输出张量,如[3, 2, 0, 0],它在范围内的 (0, 3),正如我用输出层指定的那样有 4 个输出神经元。这与预期目标的格式不匹配,尽管当我将输出神经元的数量更改为 2 时,出现形状不匹配错误。需要做什么来解决这个问题?

【问题讨论】:

【参考方案1】:

使用BCEWithLogitsLoss 时,您可以对每个输出二进制标签进行一维预测。 在您的示例中,您有 4 个二进制标签要预测,因此,您的模型输出 4d 向量,每个条目代表其中一个二进制标签的预测。

使用 BCEWithLogitsLoss隐式将 Sigmoid 应用于你的输出:

这种损失将 Sigmoid 层和 BCELoss 组合在一个类中。

因此,如果您想获得模型的预测概率,您需要在预测之上添加torch.sigmoidsigmoid 函数会将您预测的 logits 转换为概率。

【讨论】:

以上是关于BCEWithLogitsLoss:试图将预测标签的二进制输出作为张量,与输出层混淆的主要内容,如果未能解决你的问题,请参考以下文章

修改后的 PyTorch 损失函数 BCEWithLogitsLoss 返回 NaNs

pytorch中BCEWithLogitsLoss&CrossEntropyLoss函数

比较两个分割图预测

pytorch二元交叉熵损失函数 nn.BCELoss() 与 torch.nn.BCEWithLogitsLoss()

包括来自 SciKit Learn Prediction 的标签

多标签分类:keras自定义指标