• 优化器的使用


    代码示例:

    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
    
    # 加载数据集转化为Tensor数据类型
    dataset = torchvision.datasets.CIFAR10("../dataset", train=False, transform=torchvision.transforms.ToTensor()
                                           , download=True)
    # 使用dataloader加载数据集
    dataloader = DataLoader(dataset, batch_size=1)
    
    
    class Kun(nn.Module):
        def __init__(self):
            super(Kun, self).__init__()
            self.model1 = Sequential(
                Conv2d(in_channels=3, out_channels=32, kernel_size=5, stride=1, padding=2),
                MaxPool2d(kernel_size=2),
                Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),
                MaxPool2d(kernel_size=2),
                Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
                MaxPool2d(kernel_size=2),
                Flatten(),  # 将数据进行展平 64*4*4 =1024
                Linear(in_features=1024, out_features=64),
                Linear(64, 10)
            )
    
        def forward(self, x):
            x = self.model1(x)
            return x
    
    
    loss = nn.CrossEntropyLoss()
    kun = Kun()
    
    # 设置优化器
    optim = torch.optim.SGD(kun.parameters(), lr=0.01)
    # 相当于一轮学习
        for data in dataloader:
            imgs, target = data
            outputs = kun(imgs)
            result = loss(outputs, target)
    
            optim.zero_grad()  # 将所有参数梯度调整为0
            result.backward()  # 调用损失函数的反向传播求出每个梯度
            optim.step()  # 循环调优
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    增加训练次数

    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
    
    # 加载数据集转化为Tensor数据类型
    dataset = torchvision.datasets.CIFAR10("../dataset", train=False, transform=torchvision.transforms.ToTensor()
                                           , download=True)
    # 使用dataloader加载数据集
    dataloader = DataLoader(dataset, batch_size=1)
    
    
    class Kun(nn.Module):
        def __init__(self):
            super(Kun, self).__init__()
            self.model1 = Sequential(
                Conv2d(in_channels=3, out_channels=32, kernel_size=5, stride=1, padding=2),
                MaxPool2d(kernel_size=2),
                Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),
                MaxPool2d(kernel_size=2),
                Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
                MaxPool2d(kernel_size=2),
                Flatten(),  # 将数据进行展平 64*4*4 =1024
                Linear(in_features=1024, out_features=64),
                Linear(64, 10)
            )
    
        def forward(self, x):
            x = self.model1(x)
            return x
    
    
    loss = nn.CrossEntropyLoss()
    kun = Kun()
    
    # 设置优化器
    optim = torch.optim.SGD(kun.parameters(), lr=0.01)
    for epoch in range(20):
        running_loss = 0.0      # 记录每轮学习损失的总和
        # 相当于一轮学习
        for data in dataloader:
            imgs, target = data
            outputs = kun(imgs)
            result = loss(outputs, target)
    
            optim.zero_grad()  # 将所有参数梯度调整为0
            result.backward()  # 调用损失函数的反向传播求出每个梯度
            optim.step()  # 循环调优
            running_loss += result
        print(running_loss)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    结果示例:每轮的损失参数不断减小

    在这里插入图片描述

    造成损失参数不降反升,是lr设置过大

    调整lr=0.001

    optim = torch.optim.SGD(kun.parameters(), lr=0.001)
    
    • 1

    结果:

    在这里插入图片描述

  • 相关阅读:
    震撼来袭,最具中国特色的微服务组件:新一代SpringCloud Alibaba
    vue用axios在页面直接调用接口完整版(代码源码)最新(四)
    jQuery源码
    Maven项目在pom.xml里配置远程仓库
    想要精通算法和SQL的成长之路 - K次取反后最大化的数组和
    腾讯云轻量和CVM有啥区别?怎么选择服务器配置?
    图论(算法竞赛、蓝桥杯)--Dijkstra算法最短路
    BES耳机空间音频技术实现
    cefsharp 最新稳定版104.4.240 (chromium-104.0.5112.102)
    Spring Data JPA之自动创建数据库表
  • 原文地址:https://blog.csdn.net/Kunjpg/article/details/132921495