使用nn.BCEWithLogitsLoss()
#pred和label都是2d的情况,行数表示有几个样本
#第1列是预测为标签0的分数,第2列是预测为标签1的分数,第3列是预测为标签2的概率,有3种标签
# 下面为nn.BCEWithLogitsLoss()的输入概率,和正确标签(float类型)的格式(输入概率和正确标签的shape相同,2d情况)
pred_1 = torch.tensor([[-0.2,0.6,0.4],
[0.2,0.1,0.5],
[0.3,0.8,0.9]])
label_1 = torch.tensor([[1,0,1], #表示第一个样本既属于标签0也属于标签2
[1,0,0], #表示第二个样本仅仅属于标签0
[0,1,1]]) #表示第三个样本既属于标签1也属于标签2
print('nn.BCEWithLogitsLoss())(pred,label) = ',nn.BCEWithLogitsLoss()(pred_1,label_1.float())) #tensor(0.6924)
print('nn.BCEWithLogitsLoss()(pred,label) = nn.BCELoss()(torch.sigmoid(pred),label)=',nn.BCELoss()(torch.sigmoid(pred_1),label_1.float()))
print('下面分3个步骤计算')
print('step 1,使用sigmoid归一化预测概率pred')
pred_1_sigmoid = torch.sigmoid(pred_1) #;print(pred_1_sigmoid)
# tensor([[0.4502, 0.6457, 0.5987],
# [0.5498, 0.5250, 0.6225],
# [0.5744, 0.6900, 0.7109]])
print('step 2,分别计算每个样本的损失')
#计算第一个样本的损失,第一个样本的标签为 (1,0,1)
sample_1_loss = -1*(1*torch.log(torch.tensor(0.4502)) + 0*torch.log(1-torch.tensor(0.4502)) +
0*torch.log(torch.tenso