我正在尝试构建两个用于分类的神经网络。一个用于二分类,另一个用于多分类。我尝试使用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,分别表示’No’和’Yes’类别。 - 我的数据维度有问题?我发现我不能使用简单的向量来与交叉熵损失函数一起使用。有些人使用以下代码在输入损失函数前重塑他们的目标向量。
out = out.permute(0, 2, 3, 1).contiguous().view(-1, class_number)
但我并不完全理解这段代码背后的原因。不过对我来说,似乎需要跟踪以下变量:Class_Number
,Batch_size
,Dimension_Output
。对于我的代码,以下是维度信息
X_train.shape: (125973, 122)Y_train2.shape: (125973, 1)batch_size = 64K = len(set(Y_train2)) # 二分类 对于多分类使用 K = len(set(Y_train5))
- 目标值应该是一热编码吗?如果不是,我该如何将名义特征输入到损失函数中?
- 如果我需要重塑输出,你能帮我为我的代码做这个操作吗?
我尝试将这个损失函数用于我的两个神经网络。
提前感谢,
回答:
该错误是由使用torch.nn.CrossEntropyLoss()引起的,该函数可用于从N个类别中预测一个类。对于多分类任务,你应该使用torch.nn.BCEWithLogitsLoss(),它结合了Sigmoid层和BCELoss在一个单一的类中。
在多分类的情况下,如果你使用Sigmoid + BCELoss,那么目标需要是一热编码,即每个样本类似于这样:[0 1 0 0 0 1 0 0 1 0]
,其中1会在存在类别的位置上。