1. torch.optim介绍
1.1 如何创建优化器
1.2 step()方法和zero_grad()方法
2.代码实战
from torch import nn, optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
class My_Module(nn.Module):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.seq = nn.Sequential(
nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
nn.MaxPool2d(kernel_size=2),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),
nn.MaxPool2d(kernel_size=2),
nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
nn.MaxPool2d(kernel_size=2),
nn.Flatten(),
nn.Linear(in_features=1024, out_features=64),
nn.Linear(in_features=64, out_features=10)
)
def forward(self, x):
output = self.seq(x)
return output
my_module = My_Module()
loss = nn.CrossEntropyLoss() # 定义损失函数
optimizer = optim.SGD(params=my_module.parameters(), lr=0.01) # 定义优化器,采用随机梯度下降算法
test_dataset = datasets.CIFAR10(root="datasets", transform=transforms.ToTensor(), download=True)
test_dataloader = DataLoader(dataset=test_dataset, batch_size=1, shuffle=True, drop_last=False)
for data in test_dataloader:
imgs, targets = data
output = my_module(imgs)
result_loss = loss(output, targets)
optimizer.zero_grad() # 将模型的上一轮梯度清零,防止对本轮梯度优化产生影响
result_loss.backward()
optimizer.step() # 通过随机梯度下降算法优化模型的梯度
3.代码调试
3.1反向传播前模型梯度
3.2反向传播后模型梯度
3.3随机梯度下降优化后