TensorFlow中CNN的训练

2024 年 11 月 14 日 | 阅读 9 分钟

MNIST数据库(**Modified National Institute of Standard Technology database**)是一个广泛的手写数字数据库,用于训练各种图像处理系统。它由“**重新整合**”来自**MNIST**原始数据集的样本创建。

如果我们熟悉Connects的构建模块,我们就可以用TensorFlow构建一个。我们使用MNIST数据集进行图像分类。

准备数据与之前的教程相同。我们可以运行代码并直接跳转到CNN的架构。

在这里,我们在**Google Colab**(机器学习的在线编辑器)中执行我们的代码。

我们可以通过以下链接访问TensorFlow编辑器:https://colab.research.google.com

这些是用于训练CNN(卷积神经网络)的步骤。

步骤:

**步骤 1:**上传数据集

**步骤 2:**输入层

**步骤 3:**卷积层

**步骤 4:**池化层

**步骤 5:**卷积层和池化层

**步骤 6:**密集层

**步骤 7:**Logit层

Training of CNN in TensorFlow

步骤 1:上传数据集

MNIST数据集可通过scikit学习,网址为(统一资源定位符)。我们可以下载它并将其存储在我们的下载中。我们可以使用fetch_mldata('MNIST Original')上传它。

创建测试/训练集

我们需要将数据集拆分为**train_test_split**。

缩放特征

最后,我们借助**MinMax Scaler**缩放函数。


定义CNN(卷积神经网络)

与传统的神经网络相比,CNN使用图像的像素上的过滤器来学习详细的模式而不是全局模式。要创建CNN,我们必须定义

  1. **卷积层:**将多个过滤器应用于特征图。卷积之后,我们需要使用一个中继激活函数来向网络添加非线性。
  2. **池化层:** Convention之后的下一步是降低最大特征的采样率。目的是减少特征图的移动性,以防止过度拟合并提高计算速度。最大池化是一种传统技术,它将特征图拆分为子字段并仅保留最大值。
  3. **完全连接层:**过去层的所有神经元都与其他下一个层相关联。 CNN已根据卷积层的特征对标签进行分类,并通过任何池化层减少。

CNN架构

  • **卷积层:**它应用14个5x5过滤器(提取5x5像素子区域),
  • **池化层:**这将执行最大池化,使用2x2过滤器和步幅为2(指定池化的区域不重叠)。
  • **卷积层:**它应用36个5x5过滤器,并具有ReLU激活函数
  • **池化层:**再次执行最大池化,使用2x2过滤器和步幅为2。
  • **1,764个神经元,** dropout正则化率为0.4(其中任何给定元素在训练中被丢弃的概率为0.4)
  • **密集层(Logits层):**有十个神经元,每个神经元对应一个数字目标类(0-9)。

在创建CNN中使用的重要模块

  1. Conv2d ()。构造一个二维卷积层,带有过滤器数量、过滤器内核大小、填充和激活函数等参数。
  2. max_pooling2d ()。使用最大池化算法构造二维池化层。
  3. Dense ()。构造一个具有隐藏层和单元的密集层

我们可以定义一个函数来构建CNN。

让我们详细了解如何在函数中包装所有内容之前构建每个构建模块。

步骤 2:输入层

我们需要定义一个具有数据形状的张量。为此,我们可以使用**模块tf.reshape**。在此模块中,我们需要声明要重塑的张量,并确定张量的形状。第一个参数是数据的特征,它在函数的参数中定义。

图片具有宽度、高度和通道。 **MNIST**数据集是尺寸为**28x28**的单色图片。我们将批处理大小设置为-1,使其采用特征["x"]的形状。优点是可以调整批处理大小到超参数。如果批处理大小为7,则张量将馈送**5,488**个值(**28 * 28 * 7**)。

步骤 3:卷积层

第一个卷积层有18个过滤器,内核大小为7x7,且具有相等填充。相同的填充使输出张量和输入张量都具有相同的宽度和高度。 TensorFlow将在行和列中添加零以确保相同的大小。

我们使用Relu激活函数。输出大小将为[28, 28和14]。

步骤 4:池化层

卷积之后的下一步是池化计算。池化计算将减少数据的扩展。我们可以使用大小为3x3和步幅为2的模块max_pooling2d。我们使用上一层作为输入。输出大小可以是[batch_size,14,14和15]。

步骤 5:池化层和第二卷积层

第二个CNN恰好有32个过滤器,输出大小为[batch_size,14,14,32]。池化层的大小与前面相同,输出形状为[batch_size,14,14和18]。

步骤6:完全连接(密集)层

我们必须定义完全连接的层。特征图必须先压缩,然后才能与密集层组合。我们可以使用大小为**7*7*36**的模块重塑。

密集层将连接**1764**个神经元。我们添加一个Relu激活函数,并可以添加一个Relu激活函数。我们添加一个dropout正则化项,其速率为0.3,这意味着30%的权重将为0。dropout仅在训练阶段进行。如果模型需要训练或评估,则**cnn_model_fn()**具有一个参数模式来声明。

步骤 7:Logits层

最后,我们定义具有模型预测的最后一层。输出形状等于批处理大小12,等于该层中图像的总数。

我们可以创建一个包含类和每个类可能性的字典。如果logit层,该模块使用tf.argmax()返回最大值。 softmax函数返回每个类的概率。

我们只想在模式设置为预测时返回字典预测。我们添加这些代码以显示预测。

下一步包括计算模型的损失。可以使用以下代码轻松计算损失

最后一步是优化模型,即找到权重的最佳值。为此,我们使用学习率为0.001的梯度下降优化器。目的是减少损失。

我们已经完成了CNN。但是,我们希望在评估模式期间显示性能指标。多类模型的性能指标是准确性指标。 TensorFlow配备了一个具有两个参数(标签和预测值)的准确性模型。

我们可以创建我们的第一个CNN,并且我们准备好将所有内容包装在一个函数中以使用它,并训练和评估该模型。

CNN需要花费很多时间进行训练,因此,我们创建一个日志记录钩子,以每**50**次迭代存储软件层的值。

我们准备评估模型。我们的批处理大小为100,并将数据分为多个部分。请注意,我们将训练步骤设置为18000,这可能需要花费大量时间来训练。

现在,该模型已经过训练,我们可以对其进行评估并轻松打印结果。


借助该体系结构,我们获得了97%的准确度。我们可以更改体系结构,批处理大小和迭代次数以提高准确性。架构,批处理大小和迭代次数以提高准确性。

CNN神经网络的性能远胜于ANN或逻辑回归。在有关人工神经网络的教程中,我们的准确度为96%,这在CNN中较低。 CNN在速度计算和准确性方面,在广泛的图像集中表现令人印象深刻。

要构建CNN,我们需要遵循以下六个步骤

1) 输入层

此步骤重置数据。大小等于像素数的平方根。例如,如果图片有156个像素,则该数字为26x26。我们需要指定图像是否包含颜色。如果是,则对于RGB-,我们的大小为3到3,否则为1。

2) 卷积层

我们需要创建一致的层。我们应用各种过滤器来学习网络的重要特征。我们定义内核的大小和过滤器的体积。

3) 池化层

在第三步中,我们添加一个池化层。此层减小输入的大小。它通过获取子矩阵的最大值来实现。

4) 添加卷积层和池化层

在此步骤中,我们可以根据需要添加尽可能多的池化层。它使用具有20多个硬层的Google架构。

5) 密集层

步骤5展平先前的内容以形成完全连接的层。在此步骤中,我们可以使用不同的激活函数并添加dropout效果。

6) Logit层

最后一步是预测。