Pytorch的F.cross_entropy交叉熵函数

发布于:2025-02-24 ⋅ 阅读:(12) ⋅ 点赞:(0)

参考笔记: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.第一种

2.第二种


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)最后计算每个样本损失值的平均值:

Loss =(-(logQ(2) +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=(1.7715+1.5416+2.0304) \div 3 = 1.7611


自己实现交叉熵损失函数的流程计算 loss 值: