1.TORCH.OPTIM
torch.optim — PyTorch 1.11.0 documentation
(1)如何用优化器
举例如下:
a.构造优化器
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)#模型的参数、lr学习速率
b.调用优化器的step方法
for input, target in dataset: optimizer.zero_grad()#一定要做的,梯度清零,防止之前梯度的影响 output = model(input) loss = loss_fn(output, target)#计算误差 loss.backward()#反向传播,得到每个参数对应的梯度 optimizer.step()#每个参数根据上一步的梯度做优化
c.算法
具体参考官方文档:torch.optim — PyTorch 1.11.0 documentation
(2)代码示例
import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
#加载数据集
dataset=torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader=DataLoader(dataset,batch_size=1)
#网络
class Tudui(nn.Module):
def __init__(self) -> None:
super().__init__()
self.modul1=nn.Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)
def forward(self,x):
x=self.modul1(x)
return x
loss=nn.CrossEntropyLoss()
tudui=Tudui()
#优化器:随机梯度下降
#学习速率不能设置太大,也不能设置太小,太大 模型不稳定 太小 模型训练速度慢,一般情况下
#一开始采用学习速率较大的来进行学习,后面采用学习速率较小的来学习
#1.定义优化器
optim=torch.optim.SGD(tudui.parameters(),lr=0.01)
for epoch in range(20):#进行一轮一轮的训练
running_loss=0.0
for data in dataloader:
imgs,targets=data
output=tudui(imgs)
result_loss=loss(output,targets)#计算误差
#2.梯度清零
optim.zero_grad()
#3.反向传播计算梯度
result_loss.backward()
#4.对每个参数进行调优
optim.step()
running_loss=running_loss+result_loss
print(running_loss)