使用 PyTorch 的交叉熵损失函数是否需要 One-Hot 编码?

Loa*_*aky 7 python computer-vision multilabel-classification deep-learning pytorch

例如,如果我想解决 MNIST 分类问题,我们有 10 个输出类。对于 PyTorch,我想使用该torch.nn.CrossEntropyLoss功能。我是否必须格式化目标以便它们是单热编码的,还是我可以简单地使用数据集附带的类标签?

ray*_*ica 12

nn.CrossEntropyLoss需要整数标签。它在内部所做的是,它根本不会对类标签进行一次性编码,而是使用标签索引到输出概率向量中来计算损失(如果您决定使用此类作为最终标签)。这个小而重要的细节使计算损失更容易,并且是执行单热编码的等效操作,测量每个输出神经元的输出损失,因为输出层中的每个值都为零,但在目标类中索引的神经元除外. 因此,如果您已经提供了标签,则无需对数据进行一次性编码。

文档对此有更多见解:https : //pytorch.org/docs/master/generated/torch.nn.CrossEntropyLoss.html。在文档中,您将看到targets哪个用作输入参数的一部分。这些是您的标签,它们被描述为:

目标

这清楚地显示了应该如何塑造输入以及预期的内容。如果您实际上想对数据进行单热编码,则需要使用torch.nn.functional.one_hot. 为了最好地复制交叉熵损失nn.functional.log_softmax在幕后所做的事情,您还需要作为最终输出,并且您必须另外编写自己的损失层,因为 PyTorch 层都没有使用对数 softmax 输入和单热编码目标。但是,nn.CrossEntropyLoss将这两种操作结合​​在一起,如果您的输出只是类标签,则首选,因此无需进行转换。

  • @LoaySharaky 是的。为了阐明这一点,假设您的批次中有一个输入张量“N x D”,其中“N”是批次大小,“D”是单个示例的维度。目标应该只是大小为“N”的一维张量,其中值可以从“0”到“C - 1”,其中“C”是类的总数。但是,预测值的 **输出层** 的形状应为“N x C”。因此,损失函数将以目标中的标签作为索引,并直接访问输出层张量中的值来计算损失。 (2认同)