在上文的训练中,使用了这样两行代码
optimizer = torch.optim.SGD(net.parameters(), lr=lr)
criterion = nn.CrossEntropyLoss()
第一行代码是使用 PyTorch 中的 torch.optim.SGD 优化器来定义一个随机梯度下降(SGD)优化器。
第二行导入torch.nn模块中的CrossEntropyLoss类,并将其实例化为criterion对象,作为损失函数。
-
深度学习网络训练时,优化器和损失函数是需要一起定义和使用的,它们共同完成了模型参数的更新和优化的过程。
-
损失函数用于度量模型在训练数据上的预测结果与真实标签之间的差异。
-
优化器则用于根据损失函数的梯度信息来更新模型的参数,以最小化损失函数。
-
优化器根据损失函数的梯度信息计算参数的更新方向和步长。然后,通过应用更新规则来更新模型的参数值,使其朝着减小损失的方向前进。这个迭代的过程被重复执行,直到达到某个停止条件(如达到最大迭代次数或损失函数收敛)。
-
通常,在训练循环中,先计算损失函数,在反向传播过程中计算梯度,然后使用优化器执行参数更新。这个过程是反复进行的,每次迭代都会通过计算损失和梯度来更新模型的权重。优化器根据梯度信息对模型参数进行调整,以最小化损失函数,从而逐步优化模型的性能。
-
因此,在深度学习网络训练中,优化器和损失函数是紧密配合的,并且需要一起定义和使用,以实现权重的更新和模型的优化。
torch.optim.SGD 是 PyTorch 中的一个优化器类,用于实现随机梯度下降算法。在深度学习中,通过最小化损失函数来优化模型参数是一个常见的任务,而 SGD 是一种常用且简单的优化算法,用于在训练过程中更新参数以最小化损失函数。
值得注意的是,交叉熵损失函数适用于多分类任务,当标签数据为整数形式表示类别时,可以直接将预测输出和标签传递给交叉熵损失函数进行计算。如果标签是one-hot编码形式,需先使用torch.argmax()函数将其转换为整数形式再进行计算。
在给定的代码中,net.parameters() 是一个网络模型 net 的参数列表,我们将这些参数作为优化器的优化目标。lr 是学习率(learning rate),它控制了每次参数更新的步长大小。学习率越大,参数更新得越快,但可能会导致不稳定性和震荡;学习率越小,参数更新得越慢,但可能会收敛得更稳定。
通过将参数列表和学习率传递给 torch.optim.SGD 构造函数,我们创建了一个 SGD 优化器对象 optimizer,可以使用其提供的方法来更新模型参数。例如,可以使用 optimizer.step() 方法来更新参数,optimizer.zero_grad() 方法来清除之前计算的梯度。
下面是一种典型的训练循环示例,使用 SGD 优化器进行模型训练:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义网络模型
net = Net()
# 定义优化器
optimizer = optim.SGD(net.parameters(), lr=lr)
# 定义损失函数
criterion = nn.CrossEntropyLoss()
# 进行训练循环
for epoch in range(num_epochs):
# 前向传播
outputs = net(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
optimizer.zero_grad()
loss.backward()
# 更新参数
optimizer.step()
在训练循环中,我们首先进行前向传播计算输出和损失,然后通过调用 optimizer.zero_grad() 清零梯度,接着进行反向传播计算梯度,最后使用 optimizer.step() 更新参数。
通过不断重复以上步骤,我们可以使用 SGD 优化器对模型进行训练,以最小化损失函数并优化模型的参数。