首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】20.优化器Optimizer


本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





01

优化器:


Pytorch中,优化器(Optimizer)是用于更新和计算模型参数的工具,目的是最小化或最大化一个损失函数。优化器根据损失函数的输出和模型的梯度信息来更新模型的权重。

Pytorch将常用的优化器封装在torch库的optim子模块中,各种优化算法(都继承自基类optim.Optimizer)可以使用以下语句查看:

import torch.optim as optim
dir(torch.optim)
会得到以下列表:
['ASGD',
 'Adadelta',
 'Adagrad',
 'Adam',
 'AdamW',
 'Adamax',
 'LBFGS',
 'NAdam',
 'Optimizer',
 'RAdam',
 'RMSprop',
 'Rprop',
 'SGD',
 'SparseAdam',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '_functional',
 '_multi_tensor',
 'lr_scheduler',
 'swa_utils']

PyTorch使用优化器通常遵循以下步骤:
  • 实例化优化器:
模型的参数(通常是model.parameters())一般作为优化器的第一个输入。传递给优化器的所有参数都保留在优化器对象中,这样优化器就可以更新它们的值并访问其grad属性。另外还需传入一些优化器的特定参数(如学习率等)
  • 在训练循环中使用优化器:
使用优化器的公开方法optimizer.zero_grad()可以将传递给优化器的所有参数的grad属性归零,避免梯度的累加。
使用optimizer.step()根据计算出的梯度更新参数。即优化器会查看params.grad并更新params,从中减去学习率乘以梯度。

02

使用优化器实现线性回归:


本次将在使用自动求导机制的基础上使用优化器实现线性回归操作。
生成数据以及定义函数部分与之前相同,就不做过多介绍:
  • 生成数据:

# 设置随机数种子,保证运行结果一致
torch.manual_seed(2024)

def get_fake_data(num):
    """
    生成随机数据,y = 0.5 * x +30并加上一些随机噪声
    """

    x = torch.randint(low = -5, high=30, size=(num,)).to(dtype=torch.float32)
    y = 0.5 * x +30 + torch.randn(num,)
    return x,y

x , y = get_fake_data(num=11)

# 对输入数据做归一化处理
x_new = x * 0.1
  • 定义函数:
# 定义模型:
def model(x , w , b):
    return w * x + b

# 定义损失函数:
def loss_fn(y_p , y):
    squared_diffs = (y_p - y)**2
    return squared_diffs.mean()
  • 循环训练,求解参数值:
首先使用优化器更新训练循环代码:
def training_loop(n_epochs , optimizer , params , x , y):
    for epoch in range(1 , n_epochs+1):

        #前向传播
        y_p = model(x,*params)
        loss = loss_fn(y_p ,y)

        # 梯度归零
        optimizer.zero_grad()
        # 反向传播
        loss.backward()
        # 参数更新
        optimizer.step()


        if epoch % 10 ==0:
            print(f"Epoch : {epoch} , Loss : {loss}")
            print(f"Params : {params} , Grad : {params.grad}")
            print("-----")

    return params
然后再实例化一个优化器,根据需要选择优化器,本次使用SGD随机梯度下降优化器,该优化器使用默认值时也是一种梯度下降算法,与我们之前使用的算法本质上是相同的。
# 实例化一个优化器
params=torch.tensor([1.0 , 0.0],requires_grad=True)
learning_rate=1e-2

optimizer = torch.optim.SGD([params] , lr=learning_rate)
设置相关参数值并运行,可以看到结果与之前一致,说明操作成功。
training_loop(n_epochs=1000 , optimizer=optimizer , params=params , x=x_new , y=y)


更多内容可以前往官网查看

https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments