卷积神经网络模型的训练

17 Mar 2025 | 4 分钟阅读

在上一个主题中,我们实现了我们的 CNN 模型。 现在,我们的下一个任务是训练它。 为了训练我们的 CNN 模型,我们将涉及 CUDA 张量类型,它将实现与 CPU 张量相同的功能,但它们用于计算。

以下是训练我们的 CNN 模型的步骤:

步骤 1

在训练部分的第一个步骤中,我们将借助 torch.device() 指定设备。 我们将检查 CUDA; 如果 CUDA 可用,那么我们将使用 Cuda,否则我们将使用 CPU。

步骤 2

在下一步中,我们将我们的模型分配给我们的设备,如下所示:

步骤 3

现在,我们将定义我们的损失函数。 损失函数的定义方式与我们在之前的模型中使用的深度神经网络的定义方式相同。

之后,我们将使用熟悉的优化器,即 Adam,如下所示:

步骤 4

在下一步中,我们将指定 epoch 的数量。 我们初始化 epoch 的数量,并通过绘图分析每个 epoch 的损失。 我们将初始化两个列表,即 loss_history 和 correct history。

步骤 5

我们将从迭代每个 epoch 开始,并且对于每个 epoch,我们必须迭代训练加载器提供给我们的每个训练批次。 每个训练批次包含一百张图像以及训练加载器中的一百个标签,如下所示:

步骤 6

我们正在处理卷积神经网络,其中输入首先被传递。 我们将在四个维度中传递图像,因此无需将它们展平。

正如我们将我们的模型分配给我们的设备一样,我们也以相同的方式将输入和标签分配给我们的设备。

现在,在这些输入的帮助下,我们得到输出为

步骤 7

在下一步中,我们将以与之前在图像识别中所做的相同方式执行优化算法。

步骤 8

为了跟踪每个 epoch 的损失,我们将初始化一个变量 loss,即 running_loss。 对于每个按批次计算的损失,我们必须将每个批次的损失全部加起来,然后计算每个 epoch 的最终损失。

现在,我们将这个累积的整个 epoch 的损失追加到我们的损失列表中。 为此,我们在循环语句之后使用一个 else 语句。 因此,一旦 for 循环完成,就会调用 else 语句。 在此 else 语句中,我们将打印为整个数据集计算的在该特定 epoch 的累积损失。

步骤 11

在下一步中,我们将找到我们网络的准确率。 我们将初始化 correct 变量并将值分配为零。 我们将比较模型对每张训练图像的预测与图像的实际标签,以显示在 epoch 中有多少图像是正确的。

对于每张图像,我们将取最大分数的值。 在这种情况下,将返回一个元组。 它返回的第一个值是实际的最高值 - 模型对图像批次中每张图像所做的最高分数。 因此,我们对第一个元组值不感兴趣,第二个值将对应于模型所做的最佳预测,我们将调用 preds。 它将返回该图像的最大值的索引。

步骤 12

每张图像的输出将是值的集合,索引范围从 0 到 9,因此 MNIST 数据集包含从 0 到 9 的类。 由此可见,最大值出现的预测对应于模型所做的预测。 我们将比较模型所做的所有这些预测与图像的实际标签,以查看它们有多少是正确的。

这将给出每批图像的正确预测数。 我们将以与 epoch 损失相同的方式定义 epoch 准确率,并同时打印 epoch 损失和准确率,如下所示:

这将给出预期的结果,如下所示:

PyTorch Training

步骤 13

现在,我们将整个 epoch 的准确率追加到我们的 correct_history 列表中,为了更好地可视化,我们将绘制 epoch 损失和准确率,如下所示:


PyTorch Training

PyTorch Training

完整代码


下一个主题CNN 验证