Pytorch -使用一个热编码和softmax的(分类)交叉熵损失

2izufjch  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(221)

我在Pytorch中寻找一个交叉熵损失函数,它类似于Tensorflow中的CategoricalCrossEntropyLoss
我的标签是一个热编码,预测是一个softmax层的输出。例如(每个样本属于一个类):

targets = [0, 0, 1]
predictions = [0.1, 0.2, 0.7]

我想计算softmax值的(分类)交叉熵,将预测的最大值作为标签,然后计算交叉熵。不幸的是,我没有找到合适的解决方案,因为Pytorch的 CrossEntropyLoss 不是我想要的,它的 BCELoss 也不是我需要的(不是吗?)。
有谁知道在Pytorch中使用哪个损失函数或者如何处理它吗?提前非常感谢!

dldeef67

dldeef671#

我原以为Tensorflow的CategoricalCrossEntropyLoss和PyTorch的CrossEntropyLoss是等价的,但现在看来并不是。前者接受OHE,而后者也接受标签。然而,看起来区别在于:

  • torch.nn.CrossEntropyLosstorch.nn.LogSoftmaxtorch.nn.NLLLoss()的组合:

  • tf.keras.losses.CategoricalCrossEntropyLoss类似于:

您的预测已经通过了 softmax。因此,只需应用负对数似然。根据前面讨论的here,您可以尝试以下操作:

class CategoricalCrossEntropyLoss(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, y_hat, y):
        return F.nll_loss(y_hat.log(), y.argmax(dim=1))

上面的预测向量从一位热码编码转换为用torch.Tensor.argmax标记。
如果这是正确的,为什么不首先使用torch.nn.CrossEntropyLoss呢?你只需要删除模型最后一层的softmax,然后转换目标标签。

相关问题