机器学习——优化器

1.优化器的作用:

使用损失函数时,调用损失函数的backward得到反向传播。

反向传播求出需要调节参数对应的梯度。

梯度可以使用优化器,对梯度的参数进行调整。达到整体降低误差的目的。

如何使用优化器:

(1)构造

#SGD为构造优化器的算法。随机梯度下降。
#模型参数,学习速率,特定优化器算法中需要设定的参数
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

(2)调用优化器step的方法。

利用之前得到的梯度,对参数进行更新。

     for data in dataloader:
        img, target = data
        outputs = wang(img)
		# 输出跟真实的target计算出的loss
        result = loss(outputs, target)
        # 把上一步训练的每个参数的梯度清零
        optimizer.zero_grad()
        # 反向函数求出每个结点的梯度
        result.backward()
        # 梯度进行优化
        optimizer.step()

【举例】SGD随机梯度下降法为例进行说明:学习速率不能太大,不然模型不稳定。也不能太小,不然模型训练慢。先采用大的学习速率,后采用小的学习速率。

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

# 加载数据集并转为tensor数据类型
dataset = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)

dataloader = DataLoader(dataset, batch_size=64)


# 创建神经网络
class net(nn.Module):
    def __init__(self):
        super(net, self).__init__()
        self.model1 = Sequential(
            Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
            MaxPool2d(kernel_size=2),
            Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),
            MaxPool2d(kernel_size=2),
            Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
            MaxPool2d(kernel_size=2),
            Flatten(),
            Linear(in_features=1024, out_features=64),
            Linear(in_features=64, out_features=10)
        )

    def forward(self, x):
        x = self.model1(x)
        return x


# 计算loss
loss = CrossEntropyLoss()
# 搭建网络
wang = net()
# 设置优化器,随机梯度下降法。
optim = torch.optim.SGD(wang.parameters(), lr=0.01)
for i in range(20):
    running_loss = 0.0
    for data in dataloader:
        # img为输入,放入神经网络
        img, target = data
        # outputs神经网络输出,target实际输出
        outputs = wang(img)
        # 计算loss
        result_loss = loss(outputs, target)
        # 把网络模型中每一个可以调节的参数对应梯度设置为0
        optim.zero_grad()
        # 反向函数求出每个结点的梯度
        result_loss.backward()
        # 进行优化
        optim.step()
        running_loss = running_loss + result_loss
    print(running_loss)

你可能感兴趣的:(深度学习,人工智能)