反向传播和优化 pytorch

**前置知识:

优化器:optim=torch.optim.SGD(xigua1.parameters(),lr=0.01) 传入模型的参数、学习速率

计算损失:result_loss=loss(outputs,targets)

梯度清零:optim.zero_grad()

计算梯度并反向传播:result_loss.backward()

更新参数:optim.step()

  1. optim.zero_grad() : 在每次训练迭代之前清除所有优化器(如SGD、Adam等)维护的梯度信息。在神经网络中,每个参数(如权重和偏置)都有一个与之关联的梯度,这个梯度表示参数对损失函数的贡献程度。随着训练的进行,这些梯度会被累积,如果不加以重置,会导致梯度累加,从而影响模型的学习效果。因此,zero_grad() 函数通过将这些梯度重置为零,确保了每次迭代都是在无偏见的情况下开始。

  2. result_loss.backward() : 执行反向传播算法,计算损失函数相对于模型参数的梯度。在神经网络前向传播过程中,网络输出与实际标签之间的差异被量化为损失函数。backward() 函数通过链式法则自动计算损失函数对每个参数的梯度,这些梯度随后被存储在相应的参数的 .grad 属性中。这一步是优化过程的核心,因为它直接关系到参数如何被调整以最小化损失。

  3. optim.step() : 在计算出损失函数的梯度后,step() 函数根据这些梯度来更新模型参数。优化器使用特定的算法(如梯度下降、Adam等)来决定如何更新每个参数,以便在下一次迭代中减少损失。简而言之,step() 函数实现了从当前参数状态向更优参数状态的"跳跃"。

总的来说,这三个函数协同工作,形成了深度学习中参数优化的基本流程:首先清除旧的梯度信息,然后计算新的梯度,最后根据这些梯度更新参数。这一过程在每次训练迭代中重复进行,直到模型的性能满足要求或达到预设的停止条件。

**代码:

python 复制代码
import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

#以CIFAR10的分类检测为例

test_set=torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader=DataLoader(test_set,batch_size=1)

class Xigua(nn.Module):
    def __init__(self):
        super().__init__()
        self.model1=Sequential(
        Conv2d(3,32,5,padding=2),
        MaxPool2d(2),
        Conv2d(32,32,5,padding=2),
        MaxPool2d(2),
        Conv2d(32,64,5,padding=2),
        MaxPool2d(2),
        Flatten(),
        Linear(1024,64),
        Linear(64,10),
        )

    def forward(self,x):
        x=self.model1(x)
        return x

xigua1=Xigua()
loss=nn.CrossEntropyLoss()
optim=torch.optim.SGD(xigua1.parameters(),lr=0.01)

#为了节省时间,这里能显示出优化的效果即可,就只训练5轮,每轮都只是计算前10个数据
for epoch in range(5): #训练5轮
    running_loss=0.0 #每轮都计算出一个所有数据损失的总和
    step=0
    for data in dataloader:
        imgs,targets=data
        outputs=xigua1(imgs)
        result_loss=loss(outputs,targets)
        optim.zero_grad() #将梯度清零
        result_loss.backward() #计算损失对应的梯度,并将其反向传播
        optim.step() #更新模型参数
        #loss函数在其中只是起到了一个提供梯度的作用,而这个梯度就藏在optim中
        running_loss+=result_loss
        step+=1
        if step>=10:
            break
    print(running_loss)
相关推荐
web135085886351 小时前
Python大数据可视化:基于python的电影天堂数据可视化_django+hive
python·信息可视化·django
刘什么洋啊Zz1 小时前
MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用
人工智能·macos·ai·ollama·deepseek
东方芷兰1 小时前
伯克利 CS61A 课堂笔记 11 —— Mutability
笔记·python
奔跑草-2 小时前
【拥抱AI】GPT Researcher 源码试跑成功的心得与总结
人工智能·gpt·ai搜索·deep research·深度检索
禁默3 小时前
【第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025】网络安全,人工智能,数字经济的研究
人工智能·安全·web安全·数字经济·学术论文
不会Hello World的小苗4 小时前
Java——列表(List)
java·python·list
boooo_hhh4 小时前
深度学习笔记16-VGG-16算法-Pytorch实现人脸识别
pytorch·深度学习·机器学习
AnnyYoung4 小时前
华为云deepseek大模型平台:deepseek满血版
人工智能·ai·华为云
INDEMIND5 小时前
INDEMIND:AI视觉赋能服务机器人,“零”碰撞避障技术实现全天候安全
人工智能·视觉导航·服务机器人·商用机器人
慕容木木5 小时前
【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体的替代品,可本地部署+知识库,注册即可有750w的token使用
人工智能·火山引擎·deepseek·deepseek r1