欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > Pytorch复习笔记--pytorch常见交叉熵函数的实现

Pytorch复习笔记--pytorch常见交叉熵函数的实现

2024/10/24 7:25:40 来源:https://blog.csdn.net/weixin_43863869/article/details/142387180  浏览:    关键词:Pytorch复习笔记--pytorch常见交叉熵函数的实现

1. nn.CrossEntropyLoss()

计算公式如下:
L o s s ( x , c l a s s ) = − l n ( e x [ c l a s s ] ∑ i e x [ i ] ) = − x [ c l a s s ] + l n ( ∑ i e x [ i ] ) Loss(x, class) = -ln(\frac{e^{x[class]}}{\sum_{i}e^{x[i]}}) = -x[class] + ln(\sum_{i}e^{x[i]}) Loss(x,class)=ln(iex[i]ex[class])=x[class]+ln(iex[i])
代码实现如下:

import torch
import torch.nn as nn
import math
import numpy as npdef cross_entorpy(logits, labels):loss = 0batch = len(labels)for b_idx in range(batch):hou = 0for j in logits[b_idx]: # 计算累加部分hou += np.exp(j)loss += -logits[b_idx][labels[b_idx]] + np.log(hou) # -logits[b_idx][labels[b_idx]]表示计算-x[class]return np.around(loss / batch, 4) # 保留四位小数if __name__ == "__main__":entroy = nn.CrossEntropyLoss()logits = torch.Tensor([[0.1234, 0.5555,0.3211], [0.1234, 0.5555,0.3211], [0.1234, 0.5555,0.3211]])labels = torch.tensor([0, 1, 2])loss1 = entroy(logits, labels) # 调用pytorch接口print("loss1: ", loss1) # tensor(1.1142)logits = np.array(logits)labels = np.array(labels)loss2 = cross_entorpy(logits, labels) # 调用自定义函数print("loss2: ", loss2) # 1.1142print("All Done!")

2. nn.BCELoss()

计算公式如下:
L o s s ( x , y ) = − 1 n ∑ i n ( y i ∗ l n ( x i ) + ( 1 − y i ) ∗ l n ( 1 − x i ) ) Loss(x, y) = -\frac{1}{n}\sum_{i}^{n}(y_{i}*ln(x_{i}) + (1-y_{i})*ln(1 - x_{i})) Loss(x,y)=n1in(yiln(xi)+(1yi)ln(1xi))
代码实现如下:

import torch
import torch.nn as nn
import math
import numpy as npdef BCE_loss(logits, labels):func = nn.Sigmoid()logits = func(logits)batch = logits.shape[0]Num_class = logits.shape[1]total_loss = 0for b_idx in range(batch):single_sample_loss = 0for j in range(Num_class):single_sample_loss += labels[b_idx][j].item() * math.log(logits[b_idx][j].item()) + (1 - labels[b_idx][j].item()) * math.log(1 - logits[b_idx][j].item())total_loss += single_sample_loss / Num_classloss = -1 * (total_loss / batch)return np.around(loss, 4)        if __name__ == "__main__":BCEloss = nn.BCELoss()func = nn.Sigmoid()logits = torch.Tensor([[1.1234, 1.5555, 1.3211], [1.1234, 1.5555, 1.3211], [1.1234, 1.5555, 1.3211]])labels = torch.Tensor([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) # 转换成one-hot的形式loss1 = BCEloss(func(logits), labels) # 调用nn.BCELoss()时,logits的数值必须在区间(0, 1)之间print("loss1: ", loss1) # tensor(1.1254)loss2 = BCE_loss(logits, labels)print("loss2: ", loss2) # 1.1254print("All Done!")

3. nn.BCEWithLogitsLoss()

计算公式如下:
L o s s ( x , y ) = − 1 n ∑ i n ( y i ∗ l n ( x i ) + ( 1 − y i ) ∗ l n ( 1 − x i ) ) Loss(x, y) = -\frac{1}{n}\sum_{i}^{n}(y_{i}*ln(x_{i}) + (1-y_{i})*ln(1 - x_{i})) Loss(x,y)=n1in(yiln(xi)+(1yi)ln(1xi))
nn.BCEWithLogitsLoss() 和 nn.BCELoss()的区别在于nn.BCEWithLogitsLoss()自带Sigmoid()函数来处理输入。

代码实现如下:

import torch
import torch.nn as nn
import math
import numpy as npdef BCE_loss(logits, labels):func = nn.Sigmoid()logits = func(logits)batch = logits.shape[0]Num_class = logits.shape[1]total_loss = 0for b_idx in range(batch):single_sample_loss = 0for j in range(Num_class):single_sample_loss += labels[b_idx][j].item() * math.log(logits[b_idx][j].item()) + (1 - labels[b_idx][j].item()) * math.log(1 - logits[b_idx][j].item())total_loss += single_sample_loss / Num_classloss = -1 * (total_loss / batch)return np.around(loss, 4)        if __name__ == "__main__":BCEWithLogitsLoss = nn.BCEWithLogitsLoss() # 自带Sigmoid()函数logits = torch.Tensor([[1.1234, 1.5555, 1.3211], [1.1234, 1.5555, 1.3211], [1.1234, 1.5555, 1.3211]])labels = torch.Tensor([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) # 转换成one-hot的形式loss1 = BCEWithLogitsLoss(logits, labels) # 调用nn.BCELoss()时,logits的数值必须在区间(0, 1)之间print("loss1: ", loss1) # tensor(1.1254)loss2 = BCE_loss(logits, labels)print("loss2: ", loss2) # 1.1254print("All Done!")

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com