torch.nn.CrossEntropyLoss()使用注意

torch.nn.CrossEntropyLoss()使用注意

CrossEntropyLoss(将 nn.LogSoftmax()nn.NLLLoss() 结合在一个类中)一般用于计算分类问题的损失值,可以计算出不同分布之间的差距。

CLASS torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor] = None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = 'mean')

一般的书写格式为:

criterion = torch.nn.CrossEntropyLoss()
.......
outputs = model(inputs) #从模型中输出预测值outputs 维度为(batchsize, num_class)
loss = criterion(outputs, labels)  #labels是标签为一个长度为batchsize的Tensor在[0, num_class-1] num_class为类别数
loss.backward()
......

注意:输入的label(存放类别的Tensor)必须是长整型的Tensor,使用方法如下

y = torch.LongTensor([0])  # 必须是长整型64位!!!!!!!!
z = torch.Tensor([[0.2, 0.1, -0.1]])
criterion = torch.nn.CrossEntropyLoss()
loss = criterion(z, y)

举例说明(三分类问题):

通过预测值Y_pred和标签Y体现CrossEntropyLoss

import torch
criterion = torch.nn.CrossEntropyLoss()
#Y是标签 此时batch_size为3
Y = torch.LongTensor([2, 0, 1]) #一定要用LongTensor或者int64否则会报错

#Y_pred1是模型的输出结果 num_class = 3
Y_pred1 = torch.Tensor([[0.1, 0.2, 0.9],   #实际为类别2
                        [1.1, 0.2, 0.2],   #实际为类别0
                        [0.2, 2.1, 0.1]])   #实际为类别1
l1 = criterion(Y_pred1, Y)
#运行结果为l1=0.4966
Y_pred2 = torch.Tensor([[0.8, 0.2, 0.3],   #实际为类别2 预测数据0的概率最大
                        [0.2, 0.3, 0.5],   #实际为类别0 预测数据2的概率最大
                        [0.2, 0.2, 0.5]])   #实际为类别1 预测数据2的概率最大
l2 = criterion(Y_pred2, Y)
#运行结果为l1=1.2389

以上可以得到l1的预测明显好于l2

pytorch官方给出的例子:

# 输入的target为类别索引
loss = nn.CrossEntropyLoss()
#随机初始化一个batch_size=3 num_class的Tensor
input = torch.randn(3, 5, requires_grad=True)
#初始化batch_size个标签
target = torch.empty(3, dtype=torch.long).random_(5)
output = loss(input, target)
output.backward()

# 输入的target为类别概率
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5).softmax(dim=1)
output = loss(input, target)
output.backward()

猜你喜欢

转载自blog.csdn.net/gary101818/article/details/124600355