— 安装
现在 Keras 已安装在我们的系统上,我们可以开始使用 Keras 实现第一个简单的神经网络训练场景。稍后我们将实现一个成熟的卷积神经网络,但让我们按顺序开始。
打开train_simple_nn.py文件并将以下代码粘贴到其中:
我们来看看脚本中使用的工具:
– matplotlib:Python 的现成包。在第 3 行中,我们连接“Agg”后端,它允许您将图形保存到磁盘。
— sklearn:scikit-learn 库将帮助我们对标签进行二值化,将数据划分为训练和测试样本,并在终端中生成训练报告。
– keras:TensorFlow 和其他深度学习后端的高级前端。
– imutils:具有便利功能的包,路径模块将用于生成图像文件的路径列表。
– numpy:用于在 Python 中处理数字的包。如果您安装了 OpenCV 和 scikit-learn,那么您已经拥有 NumPy 作为它们的依赖包。
– cv2:这是 OpenCV。目前,即使您通常使用 OpenCV 3 或更高版本,您也需要使用版本 2。
其他一切都已内置到您的 Python 中。
现在您已经了解每个导入的用途以及我们将使用它们执行哪些任务。
让我们使用 argparse 解析 命令行参数 :
我们的脚本将使用 Python 的内置 argparse 模块在运行时动态处理命令行输入。我们有 4 个命令行参数:
–dataset:磁盘上一组图像的路径。
–model:我们的模型将被序列化并写入磁盘。该参数包含模型输出文件的路径。
–label-bin:数据集标签被序列化到磁盘,以便可以在其他脚本中调用它们。这是输出二值化标签文件的路径。
–plot:训练图输出文件的路径。我们将查看此图来检查我们的数据是否欠拟合或过拟合。
有了数据集信息,让我们加载图像和类标签:
我们在这里:
我们初始化数据 ( data ) 和标签的列表(第 35 行和第 36 行)。稍后这些将是 NumPy 数组。
随机打乱imagePaths(第 39-41 行)。paths.list_images函数将在我们对数据集目录中的所有输入图像进行排序和洗牌之前找到它们的路径。让我们将种子设置为一个常量值,以便可以重现随机重新排序。
我们开始循环遍历数据集中的所有imagePath (第 44 行)。
这种对可用性的关注不仅可以提高生产力,还可以鼓励员工进行数据驱动的决策。然而,专业数据库的开发和维护面临挑战,需要大量投资。组织必须评估 特殊数据库 其特定需求、潜在投资回报以及数据库提供商的专业知识。此外,随着技术的发展,需要不断更新。
对于每个imagePath:
a) 将图像image加载到内存中(第48行)。
b) 将其大小调整为32×32像素(不考虑纵横比)并对其进行平滑(展平)(第 49 行)。正确调整图像大小非常重要,因为这对于该神经网络是必要的。每个神经网络都需要不同的图像分辨率,因此请记住这一点。数据平滑可以轻松地将原始像素强度传递到输入层中的神经元。稍后您将看到,对于 VGGNet,我们将立即将所有数据输入网络,因为它是一个卷积网络。但在这个例子中,我们目前正在考虑一个简单的非卷积网络。
c) 将修改后的图像添加到数据数组中(第 50 行)
d) 从其路径中提取图像类标签(第 54 行)并将其添加到其他标签(第 55 行)。标签列表包含与数据数组中的每个图像相对应的类。
现在我们可以轻松地将数组操作应用于我们的数据和标签:
在第 58 行中,我们将像素强度从整数范围 [0, 255] 映射到连续实数范围 [0, 1](正常的预处理步骤)。
我们还将标签转换为 NumPy 数组(第 59 行)。
3. 训练和测试样本的创建
现在我们已经从磁盘加载了数据,我们需要将其分为训练集和测试集:
通常,大部分数据分配用于训练,大约 20-30% 用于测试。 Scikit-learn 提供了一个方便的函数train_test_split,它将为我们分割数据。
trainX和testX是图像, trainY和testY是对应的标签。
我们的类标签当前表示为字符串,但 Keras 会假设:
标签被编码为整数。
对这些标签执行 One-Hot 编码,导致每个标签都 美国手机号码列表 表示为向量而不是整数。
要执行此编码,您可以使用scikit-learn 中的LabelBinarizer类:
在第 70 行,我们初始化LabelBinarizer对象。
fit_transform调用查找testY中的所有唯一类标签,然后将它们转换为 One-Hot Encoding 标签。
.transform调用仅执行一个 One-Hot Encoding 步骤 – 一组唯一的可能类标签已由fit_transform调用定义。
例子:
4. 定义Keras模型架构
下一步是使用 Keras 定义神经网络的架构。我们将 使用可靠的飞机地面支持设备的重要性 使用一个具有一个输入层、一个输出层和两个隐藏层的网络:
由于我们的模型非常简单,因此我们将直接在此脚本中定义它(通常您必须为模型架构创建一个单独的类)。
输入层和第一个隐藏层在第 76 行定义
input_shape将为3072,因为平滑后的输入图像中有 32x32x3=3072 个像素。第一个隐藏层将有1024 个节点。
第二个隐藏层有512 个节点(第 77 行)。
最后,输出层中的节点数量(第 78 行)将等于可能的类标签的数量 – 在我们的例子中,输出层将具有三个节点,每个节点对应一个类标签(“猫”、“狗”) ,和“熊猫。