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^{xclass}}{\sum_{i}e^{xi}}) = -xclass + ln(\sum_{i}e^{xi}) Loss(x,class)=−ln(∑iexiexclass)=−xclass+ln(i∑exi)

代码实现如下:

python 复制代码
import torch
import torch.nn as nn
import math
import numpy as np

def cross_entorpy(logits, labels):
    loss = 0
    batch = len(labels)
    for b_idx in range(batch):
        hou = 0
        for 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.1142
    
    print("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)=−n1i∑n(yi∗ln(xi)+(1−yi)∗ln(1−xi))

代码实现如下:

python 复制代码
import torch
import torch.nn as nn
import math
import numpy as np

def BCE_loss(logits, labels):
    func = nn.Sigmoid()
    logits = func(logits)
    batch = logits.shape[0]
    Num_class = logits.shape[1]
    total_loss = 0
    for b_idx in range(batch):
        single_sample_loss = 0
        for 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_class
        
    loss = -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.1254
    
    print("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)=−n1i∑n(yi∗ln(xi)+(1−yi)∗ln(1−xi))

nn.BCEWithLogitsLoss() 和 nn.BCELoss()的区别在于nn.BCEWithLogitsLoss()自带Sigmoid()函数来处理输入。

代码实现如下:

python 复制代码
import torch
import torch.nn as nn
import math
import numpy as np

def BCE_loss(logits, labels):
    func = nn.Sigmoid()
    logits = func(logits)
    batch = logits.shape[0]
    Num_class = logits.shape[1]
    total_loss = 0
    for b_idx in range(batch):
        single_sample_loss = 0
        for 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_class
        
    loss = -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.1254
    
    print("All Done!")
相关推荐
jzshmyt6 小时前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
Thomas.Sir12 小时前
第13课:PyTorch|经典CNN网络模型从零复现【从LeNet到VGG的逐行实现】
网络·pytorch·cnn
Thomas.Sir18 小时前
第7课:PyTorch|激活函数全品类详解与选型实战【神经网络的“火花塞”】
人工智能·pytorch·神经网络
Thomas.Sir18 小时前
第10课:PyTorch|学习率调度策略全面精讲【训练过程的“自适应巡航”】
人工智能·pytorch·学习
Thomas.Sir18 小时前
第4课:PyTorch|自动微分Autograd机制深度解析【深度学习的“发动机”】
人工智能·pytorch·深度学习
维基框架18 小时前
坊间传闻 OpenAI 将要发布GPT-6 Sol 模型
人工智能·pytorch·python
浔溺1 天前
al+大数据每日学习笔记39
pytorch
ysu_03142 天前
PINNs的参数反演——从“正问题”到“逆问题”的工程改造
人工智能·pytorch·深度学习·mcmc·参数反演·逆问题·darcy流
玫幽倩2 天前
2026第二届湾区杯网络安全大赛决赛(AI专项赛道静态题wp)
pytorch·python·ai·agent·ctf·rag·湾区杯
论文复现现场2 天前
课程作业要跑 PyTorch 训练,学校机房不够用去哪租?云 GPU 选型、环境迁移与防丢数据指南
人工智能·pytorch·深度学习·云计算·gpu·cuda