计算交叉熵损失以进行火炬分类

时间:2019-09-23 13:41:36

标签: python machine-learning neural-network pytorch

我正在尝试建立两个用于分类的神经网络。一个用于二进制,第二个用于多类分类。我尝试使用torch.nn.CrossEntropyLoss()作为损失函数,但是尝试训练我的第一个神经网络时,出现以下错误:

multi-target not supported at /opt/conda/conda-bld/pytorch_1565272271120/work/aten/src/THNN/generic/ClassNLLCriterion.c:22

根据我的分析,我发现我的数据集存在两个导致错误的问题。

  • 我的数据集是一种热编码的。我使用一种热编码来预处理我的数据集。第一个目标Y_binary的形状为torch.Size([125973, 1]),形状为0和1,表示类“否”和“是”。
  • 我的数据尺寸错误?我发现我无法使用具有交叉熵损失函数的简单向量。有些人在输入损失函数之前,使用以下代码重塑了目标向量。

out = out.permute(0, 2, 3, 1).contiguous().view(-1, class_number)

但是我并不真正理解此代码背后的原因。但是对于我来说,我似乎需要跟踪以下变量:Class_NumberBatch_sizeDimension_Output。对于我的代码,这是尺寸

X_train.shape: (125973, 122)
Y_train2.shape: (125973, 1)
batch_size = 64
K = len(set(Y_train2)) # Binary classification For multi class classification use K = len(set(Y_train5))
  • 目标值应该是一种热编码吗?如果没有,如何将名义特征提供给损失函数?
  • 如果我使用调整输出的形状,可以帮我做一下代码吗?

我正在尝试对我的两个神经网络都使用此损失函数。

先谢谢您

1 个答案:

答案 0 :(得分:2)

该错误是由于使用了torch.nn.CrossEntropyLoss()所致,如果您要在N个类别中预测1个类别,可以使用该错误。对于多类分类,应使用torch.nn.BCEWithLogitsLoss(),它在一个单独的类中结合了Sigmoid层和BCELoss

如果是多类,并且如果您使用Sigmoid + BCELoss,则您需要将目标设为单次编码,即每个样本类似这样:[0 1 0 0 0 1 0 0 1 0],其中1表示位置的课程数量。