我在Pytorch中寻找一个交叉熵损失函数,它类似于Tensorflow中的CategoricalCrossEntropyLoss
。
我的标签是一个热编码,预测是一个softmax层的输出。例如(每个样本属于一个类):
targets = [0, 0, 1]
predictions = [0.1, 0.2, 0.7]
我想计算softmax值的(分类)交叉熵,不将预测的最大值作为标签,然后计算交叉熵。不幸的是,我没有找到合适的解决方案,因为Pytorch的 CrossEntropyLoss 不是我想要的,它的 BCELoss 也不是我需要的(不是吗?)。
有谁知道在Pytorch中使用哪个损失函数或者如何处理它吗?提前非常感谢!
1条答案
按热度按时间dldeef671#
我原以为Tensorflow的
CategoricalCrossEntropyLoss
和PyTorch的CrossEntropyLoss
是等价的,但现在看来并不是。前者接受OHE,而后者也接受标签。然而,看起来区别在于:torch.nn.CrossEntropyLoss
是torch.nn.LogSoftmax
和torch.nn.NLLLoss()
的组合:tf.keras.losses.CategoricalCrossEntropyLoss
类似于:您的预测已经通过了 softmax。因此,只需应用负对数似然。根据前面讨论的here,您可以尝试以下操作:
上面的预测向量从一位热码编码转换为用
torch.Tensor.argmax
标记。如果这是正确的,为什么不首先使用
torch.nn.CrossEntropyLoss
呢?你只需要删除模型最后一层的softmax,然后转换目标标签。