优化器的使用

代码示例:

python 复制代码
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()  # 循环调优

增加训练次数:

python 复制代码
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)

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

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

调整lr=0.001

python 复制代码
optim = torch.optim.SGD(kun.parameters(), lr=0.001)

结果:

相关推荐
kyle~1 小时前
深度学习框架---TensorFlow概览
人工智能·深度学习·tensorflow
南部余额1 小时前
Python 类变量与实例变量完全指南:区别、使用场景及常见陷阱
开发语言·python
yunvwugua__1 小时前
Python训练营打卡 Day26
前端·javascript·python
满怀10152 小时前
【Django全栈开发实战】从零构建企业级Web应用
前端·python·django·orm·web开发·前后端分离
夜幕龙2 小时前
LeRobot 项目部署运行逻辑(七)—— ACT 在 Mobile ALOHA 训练与部署
人工智能·深度学习·机器学习
半路_出家ren2 小时前
python处理异常,JSON
python·json·异常处理
仙人掌_lz2 小时前
深度理解用于多智能体强化学习的单调价值函数分解QMIX算法:基于python从零实现
python·算法·强化学习·rl·价值函数
小白学大数据2 小时前
Python+Selenium爬虫:豆瓣登录反反爬策略解析
分布式·爬虫·python·selenium
未来之窗软件服务2 小时前
人体肢体渲染-一步几个脚印从头设计数字生命——仙盟创梦IDE
开发语言·ide·人工智能·python·pygame·仙盟创梦ide
戌崂石2 小时前
最优化方法Python计算:有约束优化应用——线性不可分问题支持向量机
python·机器学习·支持向量机·最优化方法