优化器:随机梯度下降法
反向传播—梯度下降
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
dataset=torchvision.datasets.CIFAR10("dataset_CIFAR10",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader=DataLoader(dataset,batch_size=1)
class Demo(nn.Module):
def __init__(self) -> None:
super().__init__()
self.model1=Sequential(
Conv2d(in_channels=3, out_channels=32, kernel_size=5, stride=1, padding=2, dilation=1, ),
MaxPool2d(kernel_size=2, ),
Conv2d(in_channels=32, out_channels=32, kernel_size=5, stride=1, padding=2, ),
MaxPool2d(kernel_size=2),
Conv2d(32, 64, 5, 1, 2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10),
)
def forward(self,x):
x=self.model1(x)
return x
demo=Demo()
loss=nn.CrossEntropyLoss()
'''优化器:随机梯度下降'''
optim=torch.optim.SGD(params=demo.parameters(),lr=0.01,)
for epoch in range(20):
print('第------{}------轮训练开始'.format(epoch))
running_loss=0.0 #每一轮开始之前,梯度都要设置为0
for data in dataloader:
imgs,targets=data
'''送入网络进行训练'''
outputs=demo(imgs)
'''损失函数'''
result_loss=loss(outputs,targets)
'''优化器进行调优
1、调用一个优化器:optim=torch.optim.SGD(params=demo.parameters(),lr=0.01,)
2、将梯度初始化为0,在循环里这一步都要清0
3、损失函数调用反向传播
4、optim.step()
'''
optim.zero_grad()#首先将梯度设置为0
result_loss.backward()#反向传播,算出梯度(梯度下降法),目的:求出最小的loss 得到需要调节的梯度
optim.step()
running_loss=running_loss+result_loss#在每一轮开始之前,将loss都设置为0,整体误差的总和
#print(result_loss)
print('第{}轮的loss值{}'.format(epoch,running_loss))
结果: