书说上文CIFAR10的分类网络,在进行初始的训练得到预测结果与实际结果的差值后,进行选择合适的损失函数计算误差,利用损失函数backward进行反向传播。求出个网络中需要调节参数的梯度。然后本节选择合适的优化器就能根据不同策略进行调整参数。
SGD随机梯度下降(stochastic gradient descent)
torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False, *, maximize=False, foreach=None, differentiable=False)
必要参数:
- params----- 模型的参数
- lr (Learning rate)学习速率
import torch
import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoader
"""
使用优化器对反向传播计算的梯度进行优化 还是使用以往CIFAR10分类的网络!主要内容在下面
主要操作步骤:
1.配置优化器 注意参数 传入模型参数和学习速率
2.进行反向传播前,为后续迭代做准备需要将参数梯度进行归0处理
3.应用优化器进行优化参数
"""
# 下载数据
dataset = torchvision.datasets.CIFAR10("../DataSet/dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=False)
# 加载数据块
dataloader = DataLoader(dataset, batch_size=64)
# 创建自己的网络模型
class MyModule(nn.Module):
def __init__(self):
super().__init__()
self.module1 = nn.Sequential(
nn.Conv2d(3, 32, 5, 1, 2),
nn.MaxPool2d(2),
nn.Conv2d(32, 32, 5, 1, 2),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 5, 1, 2),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(1024, 64),
nn.Linear(64, 10),
)
def forward(self, x):
x = self.module1(x)
return x
# 配置交叉熵损失函数
loss = nn.CrossEntropyLoss()
# 使用模型.
mymodule = MyModule()
# 1.配置优化器 注意参数 传入模型参数和学习速率
optim = torch.optim.SGD(mymodule.parameters(), lr=0.01)
# 为进行多轮遍历,再次循环
for epoch in range(20):
running_loss = 0.0 # 用于观测每轮计算后的损失值
# 一个遍历dataloader是对其一轮的学习
for data in dataloader:
imgs, target = data
# 图像传入网络
outputs = mymodule(imgs)
# 计算损失值
result_loss = loss(outputs, target)
# 2.进行反向传播前,为后续迭代做准备需要将参数梯度进行归0处理
optim.zero_grad()
# 设置反向传播
result_loss.backward()
# 3.应用优化器步入进行优化参数
optim.step()
running_loss += result_loss
print(f"第{epoch}次训练的损失值为:{running_loss}")
迭代结果:
第0次训练的损失值为:360.9898986816406
第1次训练的损失值为:358.5152587890625
第2次训练的损失值为:349.4891662597656
第3次训练的损失值为:325.69720458984375
第4次训练的损失值为:314.4262390136719
第5次训练的损失值为:306.1275939941406
第6次训练的损失值为:296.10223388671875
第7次训练的损失值为:287.5134582519531
第8次训练的损失值为:279.3343505859375
第9次训练的损失值为:271.9222106933594
第10次训练的损失值为:265.560791015625
第11次训练的损失值为:259.9539489746094
第12次训练的损失值为:254.91583251953125
第13次训练的损失值为:250.4344024658203
第14次训练的损失值为:246.44271850585938
第15次训练的损失值为:242.77537536621094
第16次训练的损失值为:239.33126831054688
第17次训练的损失值为:236.03419494628906
第18次训练的损失值为:232.80242919921875
第19次训练的损失值为:229.59130859375
损失值会在迭代过程中减小,前期可能减少很多后期很少,也可能出现反向优化现象。和学习率设定的大小有关!
其他优化器的使用
每个优化器的使用参数大都不相同,但一定需要网络模型参数和学习率,所以初步学习可以仿照或使用默认参数即可。后续可逐渐成为调参大师在做其他改变。
重要的点为:在针对每次训练做反向传播前请先清空上一轮优化的梯度参数在做backward。然后优化器步入