CrossEntropyLoss用于计算多分类问题的交叉熵损失。因为torch.nn.CrossEntropyLoss内置了Softmax运算,所以在使用torch.nn.CrossEntropyLoss作为损失函数时,不要在网络的最后添加Softmax层!!!label应为一个整数,而不是one-hot编码形式。
示例
import torch
'''
每一个样本都有一个标签,表示它的真实类别。在深度学习中,通常是分批进行训练。
对于一个N分类问题,样本的标签只可能是0、1、2 ... N-1
则对于一个3分类问题,样本的标签只可能是0或1或2。
当batch_size为5时,这一个batch的标签是一个形状为[batch_size]的tensor,即shape为[5]
'''
# 一个batch(batch_size=5)的标签
label = torch.tensor([1, 2, 0, 1, 0])
print(label.shape) # [5]
'''
对于一个3分类问题,当训练时batch_size为5,
则深度网络对每一个batch的预测值是一个形状为[batch_size, classes]的tensor,即shape为[5, 3]
以深度网络对第一个样本的预测值[0.5, 0.8, -1.2]为例,
经过Softmax层后,得到[0.3949, 0.5330, 0.0721],表示深度网络认为第一个样本属于0,1,2这三类的概率分别是0.3949,0.5330, 0.0721
'''
predict = torch.tensor([[ 0.5, 0.8, -1.2],
[-0.2, 1.8, 0.5],
[ 0.3, 0.2, 0.7],
[ 0.6, -0.8, -0.4],
[-0.4, 0.2, 0.8]])
print(predict.shape) # [5, 3]
# 当reduction='none'时,输出是对每一个样本预测的损失
loss_func = torch.nn.CrossEntropyLoss(reduction='none')
loss = loss_func(predict, label)
print(loss) # tensor([0.6292, 1.6421, 1.2228, 1.8790, 1.8152])
# 当reduction='sum'时,输出是对这一个batch预测的损失之和
loss_func = torch.nn.CrossEntropyLoss(reduction='sum')
loss = loss_func(predict, label)
print(loss) # tensor(7.1883)
# 当reduction='mean'时,输出是对这一个batch预测的平均损失
loss_func = torch.nn.CrossEntropyLoss(reduction='mean')
loss = loss_func(predict, label)
print(loss) # tensor(1.4377)