PyTorch定义损失函数和优化器

1,415 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

前言

损失函数用于计算模型输出值和目标值之间的距离,损失函数也被称为目标函数、成本函数。根据不同实际问题,我们需要定义合适的损失函数。例如,对于分类问题,我们通常使用交叉熵损失。

使用优化器在训练期间更新模型参数(或称权重),PyTorch 中的 optim 包提供了各种优化算法,包括随机梯度下降 (stochastic gradient descent, SGD) 算法及其变体 AdamRMSprop 等。

在本节中,我们将学习如何在 PyTorch 中定义损失函数和优化器。

定义损失函数

我们将定义一个损失函数并在一小批 (mini-batch) 数据集上对其进行测试。

1. 首先,定义负对数似然损失:

from torch import nn
loss_func = nn.NLLLoss(reduction="sum")

2.mini-batch 上测试损失函数:

for xb, yb in train_dl:
    xb=xb.type(torch.float).to(device)
    yb=yb.to(device)
    out=model(xb)
    # 计算损失
    loss = loss_func(out, yb)
    break

3. 计算关于模型参数的梯度:

loss.backward()

在本小节中,我们首先定义了损失函数,使用 torch.nn 包来定义负对数似然损失,此损失对于训练多分类神经网络模型非常有效,负对数似然损失函数的输入是对数概率。在 PyTorch 构建模型一节中,我们在输出层应用 log_softmax 以从模型中获取对数概率。接下来,我们介绍了神经网络前向计算流程,提取一小批 (mini-batch) 数据,将其输入模型,并计算损失值。接下来,使用 backward() 方法计算损失相对于模型参数的梯度,得到的梯度将在反向传播时用于优化神经网络参数。  

定义优化器

接下来,我们将定义优化器并进行反向传播步骤。

1. 定义 Adam 优化器:

from torch import optim
opt = optim.Adam(model.parameters(), lr=1e-4)

2. 使用以下代码更新模型参数:

opt.step()

3. 接下来,我们将梯度设置为零:

opt.zero_grad()

在本小节中,我们首先定义了 Adam 优化器,优化器的输入是模型参数和学习率。然后,我们使用 step() 方法自动更新模型参数。需要注意的是,在计算下一批数据的梯度之前,需要将梯度设置为零。

相关链接

PyTorch张量操作详解

PyTorch数据加载和处理

PyTorch神经网络模型构建