使用 Python 和 TensorFlow 创建您的第一个神经网络

vvoennvv 2022-11-08 04:46:51 阅读数:519

PythonTensorflow使用创建第一个

神经网络是许多现代人工智能 (AI) 应用的核心。人工神经网络 (ANN) 是一个松散地基于大脑结构的模型:它由称为神经元的连接元素组成,每个连接都有一个数值权重。卷积神经网络 (CNN) 是一种特殊类型的人工神经网络,可以解决计算机视觉 (CV) 问题,例如图像分类、对象检测和一般识别。

CNN 的主要构建块是卷积层。这些层由提取图像中相关特征的小过滤器组成,每一层都根据前一层的输入提取更多抽象特征——一直到最终结果。这种方法非常有效,以至于最先进的 CNN 在准确识别大集合中不同人的面部方面可以胜过人类。

在本文中,我们将向您展示如何从头开始创建一个非常简单的 CNN 用于图像分类。我们将使用以下工具:

  • Anaconda* Navigator来管理我们的项目
  • 用于开发基础代码的英特尔 Distribution for Python *
  • 英特尔 TensorFlow *优化,用于构建和训练我们的神经网络

我们假设您熟悉 Python 并具备神经网络的基本知识来遵循本指南。

您可以使用以下 Anaconda 命令安装软件包的 Intel 发行版:

Python

我们建议您在工作机器上使用这些工具设置深度学习 (DL) 环境,如 使用 Python 和 Anaconda 构建深度学习环境一文中所述。

你的第一个神经网络

我们将使用 Python 和 TensorFlow 创建一个 CNN,该 CNN 获取一个从 0 到 9 的输入数字的小图像,并输出它是什么数字。这是一个很好的开始用例,将为您理解 TensorFlow 框架的关键原理奠定良好的基础。

我们将使用 Intel Optimization for TensorFlow,它优化了在 Intel 架构上运行时的 TensorFlow 性能。此优化的核心是英特尔 oneAPI 深度神经网络库 (oneDNN),它是一组用于 DL 应用程序的构建块,其中包括卷积层和池化层——任何 CNN 模型的基本组件。该库是英特尔 oneAPI Base Toolkit的一部分,后者是一组库,用于跨多种架构开发高性能 AI、机器学习 (ML) 和其他应用程序。

所有 oneAPI 组件的编程模型是统一的,因此它可以使用相同的代码部署在 CPU、GPU 或 FPGA 上。英特尔继续开发 oneAPI 组件以支持新的处理器并通过利用新的指令集扩展来优化性能。

使用 oneDNN 原语作为核心 TensorFlow 算法的后端实现,可为 DNN 模型提供更高的性能,并确保针对更新的处理器架构优化性能。

让我们开始编码

让我们从简单的 CNN 开始。该神经网络对带有输入数字的图像进行分类。网络的输入将是一个 28 × 28 像素的小灰度图像,输出将是从 0 到 9 的每个数字的概率数组。第一步是构建 CNN 的 TensorFlow 模型。我们将使用Keras API 来完成这项任务,因为在创建您的第一个神经网络时它更容易理解。

在您的 DL 环境中编写并运行以下代码:

Python

代码的前两行为会话开启oneDNN优化,最后两行检查 TensorFlow 框架的版本。请注意,从TensorFlow 2.9开始,oneDNN 优化默认处于启用状态,如果您希望在没有这些优化的情况下测试性能,则必须将其设置为 0。

接下来,使用输入层初始化 CNN 模型:

Python

我们为我们的 CNN 使用了“顺序”模型。该模型具有最简单的结构,具有顺序层,其中一层的输出是下一层的输入。然后,我们将输入层添加到模型中。所有 TensorFlow 模型都需要知道输入数据的类型。在我们的例子中,这是一个具有 28、28 和 1 三个维度的张量。该输入对应于具有一个颜色通道的 28 × 28 像素的图像(灰度图像)。

卷积层

让我们继续编写以下代码:

Python

该代码初始化一个卷积层“Conv2D”并将其放在第一个输入层之后。这个卷积层是我们神经网络的关键元素。它负责从输入图像中提取几何特征,然后由下一层使用。我们创建了具有 32 个大小为 (5, 5) 的内核(或过滤器)的层。接下来的两个参数指定如何将这些过滤器应用于输入图像:strides 指定垂直和水平移动,而 padding 指定是否必须用额外的像素填充输入图像以处理输入数据。

激活层

任何卷积层后面都应该有一个激活层。该层向模型引入了一个激活函数,该函数根据其权重和输入来控制神经元是否会“触发”(提供输出)。近期深度神经网络 (DNN) 最流行的激活函数是整流线性单元(ReLU)。以下代码将激活层添加到我们的模型中:

Python

池化层

DNN 的另一个重要元素是池化操作。该操作的目标是减少将馈送到下一层的数据的空间维度。我们将使用最大池化操作,因为它已被证明在 CNN 模型中对特征图进行下采样是有效的。

Python

添加的 MaxPooling2D 层使用 (4, 4) 的池大小进行初始化。这意味着图层数据输出的空间维度在垂直轴和水平轴上都减少了四倍。因此,最初的 28 × 28 像素图像在第一层之后被缩小为 7 × 7 数字输出,依此类推。

池化操作有两个目的。一是使模型独立于提取的特征位置的微小差异,二是减少后续处理层的数据量,从而使模型更快。

到目前为止可视化我们的模型

现在,我们的模型由四层组成:输入、卷积、激活和池化。在模型构建的任何阶段,我们都可以通过调用 model.summary 方法查看其结构信息。该方法的输出如下图所示:

我们可以看到关于每一层的输出形状的信息。例如,在池化层之后,我们可以看到输出的空间维度从 28 到 7 减少了四倍,正如预期的那样。另一个重要的信息是每一层中可训练参数的数量。我们模型中的卷积层有 832 个这样的参数。可训练参数是层的系数(权重),其值随训练过程调整。它们的数量直接影响训练时间:数量越大,训练过程越长。

扁平和密集层

上面的代码添加了一个“扁平化”层,它将池化层的三维张量(7、7、32)转换为具有 1568 个分量的扁平向量。然后它在模型中添加一个具有 128 个神经元和一个 sigmoid 激活函数的“密集”层。这就是所谓的隐藏全连接层。它位于最后一个分类层之前,其目标是在神经模型的最后部分构建多层感知器 (MLP),因为 MLP 通常是分类神经网络中的最后一个块。

分类层

我们模型的最后一层必须是具有 10 个输出值的分类层:每个数字的概率。我们将使用具有 10 个神经元的密集层和 Softmax 激活函数作为现代分类器模型的常见选择。

版权声明:本文为[vvoennvv]所创,转载请带上原文链接,感谢。 https://blog.csdn.net/vvoennvv/article/details/127741943