pytorch中的损失函数使用

1. 二元交叉熵损失函数 BCE

1.1 介绍和理解

计算公式:
L=−1N∑i=1Nyilog⁡(y\^i)+(1−yi)log⁡(1−y\^i) \mathcal{L} = -\frac{1}{N} \sum_{i=1}^{N} \left y_i \\log(\\hat{y}_i) + (1-y_i) \\log(1-\\hat{y}_i) \\right L=−N1i=1∑Nyilog(y\^i)+(1−yi)log(1−y\^i)

前面的 y 是预测值,后面的 y 是目标值。

可以把这个损失函数理解为一个严厉的老师,会对猜错的行为进行严厉处罚。比如:

  • 如果模型预测的概率是1,而目标值其实是0,这就意味着模型猜错了,带入公式会发现只用计算前一半,得到的结果会非常大,结果非常大也就意味着惩罚很强。
  • 同理,如果猜对了,结果会非常接近0。

1.2 代码实现

python 复制代码
import torch  
import torch.nn as nn  
  
# 定义输入  
input = torch.randn(3, 2)  
# 二分类的情况需要将值控制在 0 - 1 
pred = torch.sigmoid(input)  
  
# 定义目标值  
target = torch.tensor([[0, 1], [1, 0], [0, 1]], dtype=torch.float32)  
loss = nn.BCELoss()  
print(loss(pred, target))

2. 多分类交叉熵损失函数

2.1 概念和理解

计算公式为:
L=−1N∑i=1N∑c=1Cyi,clog⁡(y^i,c) \mathcal{L} = - \frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) L=−N1i=1∑Nc=1∑Cyi,clog(y^i,c) 原理和理解同二分类交叉熵损失函数。

2.2 代码实现

python 复制代码
import torch  
import torch.nn as nn  
  
# 多分类交叉熵损失函数的使用  
# 定义输入值,六分类  
input = torch.randn(5, 6)  
# 其实这一步可以省略,因为损失函数底层默认经过了softmax处理  
pred = input.softmax(dim=1)  
  
# 定义目标值,情况一:目标值用顺序标签标识,即一组数据直接对应分类的目标值  
target = torch.tensor([1, 3, 5, 0, 4])  
loss = nn.CrossEntropyLoss()  
print(loss(pred, target))  
  
# 情况二:目标值是一组概率值,即每个目标值都是一组概率,实际中可使用独热编码的形式,这里为了方便演示直接使用一组处理后的概率数据  
target2 = torch.randn(5, 6).softmax(dim=1)  
print(loss(pred, target2))

3. 使用损失函数的简单模型练习

python 复制代码
import torch  
import torch.nn as nn  
  
# 定义一个简单模型  
class Net(nn.Module):  
    def __init__(self):  
        super(Net, self).__init__()  
        # 只定义一层  
        self.linear = nn.Linear(5, 3)  
        # 初始化权重  
        self.linear.weight.data.normal_(mean=0.0, std=0.01)  
        print(self.linear.weight)  
        # 初始化偏置  
        self.linear.bias.data.normal_(mean=0.0, std=0.01)  
        print(self.linear.bias)  
  
    def forward(self, x):  
        x = self.linear(x)  
  
        return x  
  
# 创建模型  
model = Net()  
  
# 定义输入  
input = torch.randn(2, 5)  
  
# 定义目标值  
target = torch.zeros(2, 3)  
  
# 定义损失函数  
loss = nn.MSELoss()  
  
# 前向传播  
output = model(input)  
  
# 计算损失  
loss = loss(output, target)  
  
# 反向传播  
loss.backward()  
  
# 定义参数更新方式,即定义优化器  
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)  
# 仅仅更新一步,演示  
optimizer.step()  
optimizer.zero_grad()  
  
# 打印参数  
for param in model.state_dict():  
    print(param)  
    print(model.state_dict()[param])
相关推荐
To_OC5 小时前
搞懂 Token 和 Embedding 后,我终于明白大模型是怎么 "读" 文字的
人工智能·llm·agent
冬奇Lab8 小时前
每日一个开源项目(第139篇):Voicebox - 本地运行的开源 ElevenLabs 替代品
人工智能·开源·资讯
冬奇Lab8 小时前
Skill 系列(03):Skill 设计范式——5 个模式让输出从混沌到可预测
人工智能·开源·agent
IT_陈寒10 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
大模型真好玩11 小时前
什么是Loop Engineering?最通俗易懂的Loop Engineering核心概念
人工智能·agent·deepseek
叁两12 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
LaiYoung_12 小时前
🎁 送你一套超好用超实用的 FE AI-Coding Skills
前端·人工智能·开源
ZzT14 小时前
怎么做才不会被 AI 替代?
人工智能·程序员
道友可好14 小时前
从今天开始:你的第一个 Harness Engineering 实践
前端·人工智能·后端