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()