目录
现在我们有了模型和数据,是时候通过优化我们的数据上的参数来训练、验证和测试我们的模型了。 训练模型是一个迭代过程; 在每次迭代(称为 epoch)中,模型对输出进行猜测,计算猜测中的误差(损失),收集误差相对于其参数的导数,并优化 这些参数使用梯度下降。
We load the code from the previous sections on?Datasets & DataLoaders?and?Build Model.
超参数是可调整的参数,可让您控制模型优化过程。 不同的超参数值会影响模型训练和收敛速度(阅读有关超参数调整的更多信息)
我们为训练定义了以下超参数:
一旦我们设置了超参数,我们就可以使用优化循环来训练和优化我们的模型。 优化循环的每次迭代称为一个时期。
每个时期包括两个主要部分:
训练循环 - 迭代训练数据集并尝试收敛到最佳参数。
验证/测试循环 - 迭代测试数据集以检查模型性能是否正在改善。
当呈现一些训练数据时,我们未经训练的网络可能不会给出正确的答案。 损失函数衡量得到的结果与目标值的相异程度,是我们在训练时要最小化的损失函数。 为了计算损失,我们使用给定数据样本的输入进行预测,并将其与真实数据标签值进行比较。
常见的损失函数包括用于回归任务的 nn.MSELoss(均方误差)和用于分类的 nn.NLLLoss(负对数似然)。 nn.CrossEntropyLoss 结合了 nn.LogSoftmax 和 nn.NLLLoss。
我们将模型的输出 logits 传递给 nn.CrossEntropyLoss,它将对 logits 进行归一化并计算预测误差。
优化是在每个训练步骤中调整模型参数以减少模型误差的过程。 优化算法定义了如何执行这个过程(在这个例子中,我们使用随机梯度下降)。 所有优化逻辑都封装在优化器对象中。 在这里,我们使用 SGD 优化器; 此外,PyTorch 中有许多不同的优化器可用,例如 ADAM 和 RMSProp,它们可以更好地用于不同类型的模型和数据。
我们通过注册需要训练的模型参数并传入学习率超参数来初始化优化器。
在训练循环中,优化分三个步骤进行:
定义了循环优化代码的 train_loop,以及针对我们的测试数据评估模型性能的 test_loop。
我们初始化损失函数和优化器,并将其传递给 train_loop 和 test_loop。 随意增加 epoch 的数量来跟踪模型的改进性能。
PyTorch 模型将学习到的参数存储在称为 state_dict 的内部状态字典中。 这些可以通过 torch.save 方法持久化:
要加载模型权重,您需要先创建相同模型的实例,然后使用 load_state_dict() 方法加载参数。
一定要在推理之前调用 model.eval()方法,将 dropout 和 batch normalization 层设置为评估模式。 不这样做会产生不一致的推理结果。
加载模型权重时,我们需要先实例化模型类,因为该类定义了网络的结构。 我们可能希望将此类的结构与模型一起保存,在这种情况下,我们可以将模型(而不是 model.state_dict())传递给保存函数:
参考:
官方文档:Save and Load the Model — PyTorch Tutorials 1.11.0+cu102 documentation
版权所有:Copyright © 2002-2017 欧陆平台-欧陆娱乐-注册登录中心 版权所有 粤IP**********