pytorch-优化器

优化器简单使用示例代码:

# 导入第三方库
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('./CIFAR10',train=False,transform=torchvision.transforms.ToTensor(),download=True)

dataloader = DataLoader(dataset,batch_size=1)

# 构造神经网络
class Booze(nn.Module):

    def __init__(self):
        super(Booze, self).__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
# 生成神经网路对象
obj = Booze()

# 设置损失函数,构造损失函数对像
loss = nn.CrossEntropyLoss()

# 设置优化器
optim = torch.optim.SGD(obj.parameters(),lr=0.01)

# 训练20批次
for epoch in range(20):
    running_loss = 0.0
    for data in dataloader:
        imgs,targets = data
        # 使用神经网络对imgs进行训练
        outputs = obj(imgs)
        # 我们先看下outputs和targets长什么样,看选择什么样的损失函数
        # print(outputs)
        # tensor([[-0.1001, -0.0233, 0.0671, -0.0933, -0.0362, -0.1075, 0.1059, 0.0873,
        #          0.1323, 0.0313]], grad_fn= < AddmmBackward0 >)
        # 可以看到有十个输出,每个代表预测这个类别的概率
        # ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] 分别是这是个类别的概率
        # print(targets)

        result_loss = loss(outputs,targets)
        # print("result_loss:\n",result_loss)
        # 将参数梯度设置为零 设置为零是为了避免上一次的梯度影响本次训练的模型 上一次的梯度对这一次的更新是没有用的
        optim.zero_grad()
        # 优化器进行调优需要网络中每个参数的梯度 所以这里需要用到backward()方法来获得参数的梯度
        result_loss.backward()
        # 执行optim.step()代码又会跳转到for data in dataloader:这一句代码这里执行。
        optim.step()
        # running_loss适用于统计训练20批次每批次的总损失数
        running_loss +=result_loss

需要注意的一些点:

  • optim = torch.optim.SGD(obj.parameters(),lr=0.01)第一个参数是传入网络模型的参数,第二个参数是学习速率。
  • optim.step()执行optim.step()代码又会跳转到for data in dataloader:这一句代码这里执行。
  • optim.zero_grad()这句话在代码中的作用是将参数梯度设置为零 设置为零是为了避免上一次的梯度影响本次训练的模型 上一次的梯度对这一次的更新是没有用的。
  • result_loss.backward()优化器进行调优需要网络中每个参数的梯度,所以这里需要用到backward()方法来获得参数的梯度

你可能感兴趣的:(pytorch,pytorch,深度学习,神经网络)