012pyTorch入门——优化器
内容目录

合集请看:pyTorch入门合集
参考视频:https://www.bilibili.com/video/BV1hE411t7RN/?spm_id_from=333.337.search-card.all.click

核心代码

optim = torch.optim.SGD(pan.parameters(), lr=0.01)

for data in dataloader:  
    imgs, targets = data  
    outputs = pan(imgs)  
    result_loss = loss(outputs, targets)  

    # 将优化器中的梯度清零,以免影响到后续计算  
    optim.zero_grad()  
    # 调用损失函数的反向传播  
    result_loss.backward()  
    # 调用step进行优化  
    optim.step()

上述代码用了torch.optim.SGD优化器,实际上pytorch内置了许多,根据实际情况考虑。但是所有优化器都有两个参数是必填的,即parameters(神经网络的配置)和lr(学习速率)
随后在循环中使用,注意:每次使用前一定要将其中的梯度清零!即代码中的 optim.zero_grad()

完整代码

import torch  
import torchvision  
from torch import nn  
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential  
from torch.utils.data import DataLoader  
from torch.utils.tensorboard import SummaryWriter  

dataset = torchvision.datasets.CIFAR10("../data",train=False, transform=torchvision.transforms.ToTensor(),  
                                       download=True)  
dataloader = DataLoader(dataset, batch_size=1)  

class Pan(nn.Module):  
    def __init__(self):  
        super().__init__()  
        self.model1 = 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.model1(x)  
        return x  

pan = Pan()  
loss = nn.CrossEntropyLoss()  
optim = torch.optim.SGD(pan.parameters(), lr=0.01)  

# 将数据集训练20遍,方便看优化器的效果  
for epoch in range(20):  
    running_loss = 0.0  
    for data in dataloader:  
        imgs, targets = data  
        outputs = pan(imgs)  
        result_loss = loss(outputs, targets)  

        # 将优化器中的梯度清零,以免影响到后续计算  
        optim.zero_grad()  
        # 调用损失函数的反向传播  
        result_loss.backward()  
        # 调用step进行优化  
        optim.step()  

        running_loss = running_loss + result_loss  
    print(running_loss)  

# writer = SummaryWriter("../logs_seq")  
# writer.add_graph(pan, input)  
# writer.close()

运行结果

image.png|414

可以发现,一开始损失函数是在下降,之后却开始上升
怀疑是因为学习率过大导致的反向优化,因此将学习率从0.01调整为0.001,如下图所示,损失函数开始稳步下降
image.png|349

但是还是很奇怪,理论上学习率过大应该是在一定范围内反复横跳才对,不知道这里具体是什么情况

上一篇
下一篇