Pytorch学习日记03-优化器的选择

 书说上文CIFAR10的分类网络,在进行初始的训练得到预测结果与实际结果的差值后,进行选择合适的损失函数计算误差,利用损失函数backward进行反向传播。求出个网络中需要调节参数的梯度。然后本节选择合适的优化器就能根据不同策略进行调整参数。

SGD随机梯度下降(stochastic gradient descent)

torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False, *, maximize=False, foreach=None, differentiable=False)

必要参数:

  • params----- 模型的参数
  • lr (Learning rate)学习速率

损失值甚至会增加

import torch
import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoader

"""
    使用优化器对反向传播计算的梯度进行优化  还是使用以往CIFAR10分类的网络!主要内容在下面
    主要操作步骤:
        1.配置优化器  注意参数 传入模型参数和学习速率
        2.进行反向传播前,为后续迭代做准备需要将参数梯度进行归0处理
        3.应用优化器进行优化参数
"""
# 下载数据
dataset = torchvision.datasets.CIFAR10("../DataSet/dataset", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=False)
# 加载数据块
dataloader = DataLoader(dataset, batch_size=64)


# 创建自己的网络模型
class MyModule(nn.Module):
    def __init__(self):
        super().__init__()
        self.module1 = nn.Sequential(
            nn.Conv2d(3, 32, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024, 64),
            nn.Linear(64, 10),
        )

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


# 配置交叉熵损失函数
loss = nn.CrossEntropyLoss()
# 使用模型.
mymodule = MyModule()
# 1.配置优化器  注意参数 传入模型参数和学习速率
optim = torch.optim.SGD(mymodule.parameters(), lr=0.01)
# 为进行多轮遍历,再次循环
for epoch in range(20):
    running_loss = 0.0  # 用于观测每轮计算后的损失值
    # 一个遍历dataloader是对其一轮的学习
    for data in dataloader:
        imgs, target = data
        # 图像传入网络
        outputs = mymodule(imgs)
        # 计算损失值
        result_loss = loss(outputs, target)
        # 2.进行反向传播前,为后续迭代做准备需要将参数梯度进行归0处理
        optim.zero_grad()
        # 设置反向传播
        result_loss.backward()
        # 3.应用优化器步入进行优化参数
        optim.step()
        running_loss += result_loss
    print(f"第{epoch}次训练的损失值为:{running_loss}")
迭代结果:
	第0次训练的损失值为:360.98989868164061次训练的损失值为:358.51525878906252次训练的损失值为:349.48916625976563次训练的损失值为:325.697204589843754次训练的损失值为:314.42623901367195次训练的损失值为:306.12759399414066次训练的损失值为:296.102233886718757次训练的损失值为:287.51345825195318次训练的损失值为:279.33435058593759次训练的损失值为:271.922210693359410次训练的损失值为:265.56079101562511次训练的损失值为:259.953948974609412次训练的损失值为:254.9158325195312513次训练的损失值为:250.434402465820314次训练的损失值为:246.4427185058593815次训练的损失值为:242.7753753662109416次训练的损失值为:239.3312683105468817次训练的损失值为:236.0341949462890618次训练的损失值为:232.8024291992187519次训练的损失值为:229.59130859375

损失值会在迭代过程中减小,前期可能减少很多后期很少,也可能出现反向优化现象。和学习率设定的大小有关!

其他优化器的使用

 每个优化器的使用参数大都不相同,但一定需要网络模型参数和学习率,所以初步学习可以仿照或使用默认参数即可。后续可逐渐成为调参大师在做其他改变。
重要的点为:在针对每次训练做反向传播前请先清空上一轮优化的梯度参数在做backward。然后优化器步入
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值