112_深度学习的导航仪:PyTorch 优化器(Optimizer)全解析
在经历了前向传播计算 Loss、反向传播计算梯度Gradient后我们来到了最关键的一步更新参数。优化器就像是一位经验丰富的导航员它根据梯度指示的方向决定如何调整模型的权重使 Loss 降到最低。1. 优化器的核心逻辑优化器的主要工作包含以下三个步骤缺一不可梯度清零 (zero_grad)在每一轮计算开始前必须把之前的梯度清空否则梯度会不断累加导致训练出错。反向传播 (backward)计算当前误差对每个参数的梯度。参数更新 (step)根据选定的算法如 SGD、Adam和梯度值实际修改网络中的权重。2. 实战代码神经网络的完整训练循环通过 CIFAR-10 数据集演示了如何使用SGD随机梯度下降优化器进行多轮Epoch训练。import torch import torchvision 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 dataset torchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor(),downloadTrue) dataloader DataLoader(dataset, batch_size64,drop_lastTrue) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.model1 Sequential( Conv2d(3,32,5,padding2), MaxPool2d(2), Conv2d(32,32,5,padding2), MaxPool2d(2), Conv2d(32,64,5,padding2), MaxPool2d(2), Flatten(), Linear(1024,64), Linear(64,10) ) def forward(self, x): x self.model1(x) return x loss nn.CrossEntropyLoss() # 交叉熵 tudui Tudui() optim torch.optim.SGD(tudui.parameters(),lr0.01) # 随机梯度下降优化器 for epoch in range(20): running_loss 0.0 for data in dataloader: imgs, targets data outputs tudui(imgs) result_loss loss(outputs, targets) # 计算实际输出与目标输出的差距 optim.zero_grad() # 梯度清零 result_loss.backward() # 反向传播计算损失函数的梯度 optim.step() # 根据梯度对网络的参数进行调优 running_loss running_loss result_loss print(running_loss) # 对这一轮所有误差的总和3. 进阶学习率调整策略 (LR Scheduler)文件中还提到了一个进阶工具StepLR。为什么要调整学习率训练初期我们希望走得快学习率大训练后期为了精准落入最低点我们需要走得慢学习率小。代码实现import torch import torchvision 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 dataset torchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor(),downloadTrue) dataloader DataLoader(dataset, batch_size64,drop_lastTrue) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.model1 Sequential( Conv2d(3,32,5,padding2), MaxPool2d(2), Conv2d(32,32,5,padding2), MaxPool2d(2), Conv2d(32,64,5,padding2), MaxPool2d(2), Flatten(), Linear(1024,64), Linear(64,10) ) def forward(self, x): x self.model1(x) return x loss nn.CrossEntropyLoss() # 交叉熵 tudui Tudui() optim torch.optim.SGD(tudui.parameters(),lr0.01) # 随机梯度下降优化器 scheduler torch.optim.lr_scheduler.StepLR(optim, step_size5, gamma0.1) # 每过 step_size 更新一次优化器更新是学习率为原来的学习率的的 0.1 倍 for epoch in range(20): running_loss 0.0 for data in dataloader: imgs, targets data outputs tudui(imgs) result_loss loss(outputs, targets) # 计算实际输出与目标输出的差距 optim.zero_grad() # 梯度清零 result_loss.backward() # 反向传播计算损失函数的梯度 optim.step() # 根据梯度对网络的参数进行调优 scheduler.step() # 学习率太小了所以20个轮次后相当于没走多少 running_loss running_loss result_loss print(running_loss) # 对这一轮所有误差的总和4. 总结训练全流程闭环分析完此文件后我们终于完成了 PyTorch 训练的完整拼图准备数据(Dataset DataLoader)搭建结构(nn.Module Sequential)衡量误差(Loss Function)计算方向(Backward)调整参数(Optimizer) 学习心得优化器的lr学习率设置非常关键。设置过大模型可能在最低点附近反复横跳无法收敛设置过小模型学习速度会极慢。在实际开发中Adam优化器由于其自适应学习率的特性通常比SGD更容易上手。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2437447.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!