参考笔记:pytorch的F.cross_entropy交叉熵函数和标签平滑函数_怎么给crossentropyloss添加标签平滑-CSDN博客
先来讲下基本的交叉熵cross_entropy,官网如下:torch.nn.functional.cross_entropy — PyTorch 1.12 documentation
torch.nn.functional.cross_entropy(input, target, weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction='mean', label_smoothing=0.0)
loss=F.cross_entropy(input, target)
从官网所给的资料及案例,根据传入参数的数据形式,交叉熵函数的计算方式有两种
目录
1.第一种
N:样本个数,C:类别数
input:{Tensor:(N,C)},存放每个样本对于某种类别的预测值
target:{Tensor:(N,)},存放每个样本的真实类别
input = torch.randn(3, 5, requires_grad=True) #input[i][j]表示第i个样本第j个类别的预测值
target = torch.randint(5, (3,), dtype=torch.int64) #target[i]表示第i个样本的类别
loss = F.cross_entropy(input, target)
交叉熵损失的计算公式如下:
交叉熵损失计算公式
- 第1步:对 input 中每个样本对于各类别的预测值先进行 Softmax ,将预测值转化为每个样本对于某个类别的概率,得到 input_soft 。Softmax 的计算公式如下所示:
Softmax计算公式
- 第2步:对 input_soft 进行 log 运算,记为 input_soft_log
- 第3步:对 input_soft_log 与真实值 target 进行处理
(1)先将 target 进行 one-hot 编码,即对于每个样本,生成一个长度为 C 的 one-hot 标签向量,其中真实类别值为 1 ,其他类别值为 0 ,如下所示:
target = [[0 0 1 0 0],
[0 0 0 1 0],
[0 0 0 0 1]]
(2)计算第一个样本的损失
P = [0 0 1 0 0]
Q = [-1.9134, -1.2139, -0.1602, 1.1279, 0.4113]
logQ = [-3.6874, -2.9879, -1.9342, -0.6461, -1.3627]
由交叉熵公式可得,第一个样本的损失值计算方法如下:
第一个样本的损失值计算
同理可得,第二、第三个样本的损失值分别为 - logQ(3)、-logQ(4)
(3)最后计算每个样本损失值的平均值:
调用 Pytorch 实现的交叉熵函数计算 loss 值:
自己实现交叉熵损失函数的流程计算 loss 值:
2.第二种
N:样本个数,C:类别数
input:{Tensor:(N,C)},存放每个样本对于某种类别的预测值
target:{Tensor:(N,C)},存放每个样本的对于某种类别的真实概率
交叉熵损失的计算公式如下:
交叉熵损失函数计算公式
计算流程与第一种大致相同,只是不再需要对 taget 作 one-hot 编码,将交叉熵损失函数计算公式中的 P 值用真实概率值代替即可
这里以计算第一个的样本的损失值为例:
P = [0.1062, 0.3173, 0.1361, 0.2172, 0.2232]
Q = [-1.2470, 0.5475, -0.4514, -1.3397, -0.8915]
logQ = [-2.4485, -0.6540, -1.6529, -2.5411, -2.0930]
由交叉熵公式可得,第一个样本的损失值计算方法如下:
第一个样本的损失值计算
同理可得,第二、第三个样本的损失值分别为1.5416, 2.0304
最后计算三个样本的平均损失值:
自己实现交叉熵损失函数的流程计算 loss 值: