在图像识别中实现神经网络

17 Mar 2025 | 6 分钟阅读

我们的下一个任务是在先前标记的图像的帮助下训练一个神经网络,以对新的测试图像进行分类。 因此,我们将使用 nn 模块来构建我们的神经网络。

实现用于图像识别的神经网络有以下步骤

步骤 1

在第一步中,我们将定义用于创建神经网络模型实例的类。 这个类将从 nn 模块继承,因此我们首先必须导入 nn 包。

我们的类将紧跟一个 init() 方法。 在 init() 中,第一个参数将永远是 self,第二个参数将是输入节点的数量,我们将其称为,第三个参数将是隐藏层中节点的数量,第四个参数将是第二个隐藏层中节点的数量,最后一个参数将是输出层中节点的数量。

步骤 2

在第二步中,我们调用 init() 方法来提供各种方法和属性,并且我们将初始化输入层、两个隐藏层和输出层。 记住一件事,我们将处理全连接神经网络。 所以

步骤 3

现在,我们将进行预测,但在进行预测之前,我们将导入 torch.nn.functional 包,然后我们将使用 forward() 函数并将 self 作为第一个参数和 x 作为我们要尝试进行预测的任何输入。

现在,将传递到 forward() 函数中的任何输入都将传递给 linear1 的对象,并且我们将使用 relu 函数而不是 sigmoid。 其输出将作为输入馈入我们的第二个隐藏层,而第二个隐藏层的输出将馈入输出层,并返回我们最终层的输出。

注意:如果我们处理多类数据集,我们将不在输出层中应用任何激活函数。

步骤 4

在下一步中,我们将设置我们的模型构造函数。 根据我们的初始化程序,我们必须设置输入维度、隐藏层维度和输出维度。

图像的像素强度将馈入我们的输入层。 由于每个图像有 28*28 像素,总共有 784 像素将馈入我们的神经网络。 因此,我们将传递 784 作为第一个参数,我们将在第一个和第二个隐藏层中取 125 和 60 个节点,而在输出层中,我们将取十个节点。 所以

步骤 5

现在,我们将定义我们的损失函数。 nn.CrossEntropyLoss() 用于多类分类。 此函数是 log_softmax() 函数和 NLLLoss()(负对数似然损失)的组合。 我们将交叉熵用于具有 n 个类的任何训练和分类问题。 因此,它使用对数概率,因此我们传递行输出而不是 softmax 激活函数的输出。

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

步骤 6

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

步骤 7

我们将首先迭代每个时期,对于每个时期,我们必须迭代通过训练加载器提供给我们的每个单独的训练批次。 每个训练批次包含一百个图像以及训练加载器中的一百个标签,如下所示

步骤 8

当我们迭代我们的图像批次时,我们必须将它们展平,并且我们必须借助 view 方法对它们进行整形。

注意:每个图像张量的形状为(1,28,和 28),这意味着总共有 784 像素。

根据神经网络的结构,我们的输入值将乘以将我们的输入层连接到第一个隐藏层的权重矩阵。 为了进行此乘法,我们必须使我们的图像一维。 代替每个图像有 28 行乘以 2 列,我们必须将其展平为 784 像素的单行。

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

步骤 9

借助输出,我们将计算总的类别交叉熵损失,并且输出最终与实际标签进行比较。 我们还将根据交叉熵标准确定误差。 在执行训练过程的任何部分之前,我们必须将优化器设置为我们之前所做的那样。

步骤 10

为了跟踪每个时期的损失,我们将初始化一个变量 loss,即 running_loss。 对于每个按批次计算的损失,我们必须对每个批次进行加总,然后在每个时期计算最终损失。

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

步骤 11

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

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

步骤 12

每个图像输出将是一组值,其索引范围从 0 到 9,这样 MNIST 数据集就包含了从 0 到 9 的类。 这表明发生最大值的预测对应于模型所做的预测。 我们将比较模型所做的所有这些预测与图像的实际标签,以查看它们中有多少是正确的。

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

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

Implementation of Neural Network in Image Recognition

步骤 13

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

时期损失

Implementation of Neural Network in Image Recognition

时期准确性

Implementation of Neural Network in Image Recognition

完整代码