24 优化器
一、官方文档
torch.optimizer
-
优化器的定义

-
之后调用优化器的step方法
作用:就是利用得到的梯度对参数进行更新

- 相关优化器的算法
共同点:模型参数,学习速率,优化器自身的参数
二、案例
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,进行反向传播,并进行参数更新的过程

3. 结果
- 一开始下降,后面就反向优化了,所以就上升了



浙公网安备 33010602011771号