24 优化器

一、官方文档

torch.optimizer

  • 优化器的定义
    image

  • 之后调用优化器的step方法

作用:就是利用得到的梯度对参数进行更新

image

  • 相关优化器的算法

共同点:模型参数,学习速率,优化器自身的参数
image

二、案例

1. 代码

  • 学习速率的设置:太大-模型不稳定,太小-速率太慢,一般由大到小设置

  • 多个epoch进行参数更新,查看每轮loss和

点击查看代码
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d,MaxPool2d,Flatten,Linear,Sequential
from torch.utils.tensorboard import SummaryWriter
# 测试集
from torch.utils.data import DataLoader

test_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",transform=torchvision.transforms.ToTensor(),train=False,download=True)
test_loader=DataLoader(dataset=test_data,batch_size=1)
# 定义网络结构
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        # self.conv1=Conv2d(3,32,5,padding=2) #可以每一层都用这种方式定义,下面再用这种方式调用
        self.model1=Sequential( #使用sequential
            Conv2d(3,32,5,padding=2), #in_channel 3;out_channel 32;kernel 5;padding需要计算(一般不会太大)
            MaxPool2d(2), #kennel_Size=2
            Conv2d(32,32,5,padding=2),
            MaxPool2d(2),
            Conv2d(32,64,5,padding=2),
            MaxPool2d(2),
            Flatten(), #展平 :可以把后面的删掉 获得输出的大小
            Linear(1024,64),#看上一层的大小 ,可以看到是1024
            Linear(64,10) #输入大小 64 输出大小 10
        )

    def forward(self,x):
        x=self.model1(x)
        return x
# 声明网络
tudui=Tudui()

#定义loss
loss=nn.CrossEntropyLoss()

#设置优化器
optim=torch.optim.SGD(tudui.parameters(),lr=0.01)

#进行多轮学习
for epoch in range(20):
    running_loss=0.0
    for data in test_loader:
        imgs,targets=data
        outputs=tudui(imgs)
        result_loss=loss(outputs,targets)
        # 清0
        optim.zero_grad()
        # 计算梯度 反向传播:注意反向传播的对象 下一步就是利用优化器来优化
        result_loss.backward()
        #利用grad更新参数
        optim.step()
        running_loss=running_loss+result_loss #每一轮所有误差的结果

    ##损失的结果
    print(running_loss)


2.debug

获得loss,进行反向传播,并进行参数更新的过程

image

3. 结果

  • 一开始下降,后面就反向优化了,所以就上升了

image

posted @ 2022-05-24 11:21  Trouvaille_fighting  阅读(63)  评论(0)    收藏  举报