提交 66a7087d 编写于 作者: W wizardforcel

2021-01-06 14:42:10

上级 f20b544e
......@@ -13,7 +13,7 @@
# 使用 TensorFlow 编码深度学习模型
我们在“第 5 章”,“神经网络架构和模型”中了解了各种深度学习模型的架构。 在本节中,我们将学习如何使用 TensorFlow / Keras 加载图像,浏览和预处理数据,然后应用三个 CNN 模型(VGG16,ResNet 和 Inception)的预训练权重来预测对象类别。
我们在“第 5 章”,“神经网络架构和模型”中了解了各种深度学习模型的架构。 在本节中,我们将学习如何使用 TensorFlow/Keras 加载图像,浏览和预处理数据,然后应用三个 CNN 模型(VGG16,ResNet 和 Inception)的预训练权重来预测对象类别。
请注意,由于我们不是在构建模型,而是将使用已构建的模型(即具有预先训练的权重的模型)来预测图像类别,因此本部分不需要训练。
......@@ -101,7 +101,7 @@ images = os.listdir(folder_path)
fig = plt.figure(figsize=(8,8))
```
前面的代码指定图像文件夹路径,并定义了图像属性,以便能够在以后的部分中下载图像。 它还将图形尺寸指定为 8 x 8
前面的代码指定图像文件夹路径,并定义了图像属性,以便能够在以后的部分中下载图像。 它还将图形尺寸指定为`8 x 8`
# 使用 TensorFlow Keras 导入多个图像并进行处理的循环功能
......@@ -136,7 +136,7 @@ plt.show()
7. 接下来的几节涉及使用`matplotlib`库进行绘图:
* `fig.add_subplot`具有三个元素:`rows``columns``i` –例如,总共 9 幅图像分为三列三行,`i`术语将从`1`变为[ `1`是第一张图片,`9`是最后一张图片。
* `fig.add_subplot`具有三个元素:`rows``columns``i` –例如,总共 9 幅图像分为三列三行,`i`术语将从`1`变为`9``1`是第一张图片,`9`是最后一张图片。
* `fig.subplots_adjust`在图像之间添加垂直空间。
* `plt.title`将标题添加到每个图像。
......@@ -161,7 +161,7 @@ plt.show()
在上图中,您可以观察到以下内容:
* 每个图形尺寸为 224 x 224,标签的顶部打印有置信度百分比。
* 每个图形尺寸为`224 x 224`,标签的顶部打印有置信度百分比。
* 三种错误的预测:炒锅(预测为钢包),床(预测为工作室沙发)和行李(预测为折叠椅)。
下图显示了这九类的 ResNet 预测输出:
......@@ -170,7 +170,7 @@ plt.show()
在上图中,您可以观察到以下内容:
* 每个图形尺寸为 224 x 224,标签的顶部打印有置信度百分比。
* 每个图形尺寸为`224 x 224`,标签的顶部打印有置信度百分比。
* 有两个错误的预测:炒锅(预测为钢包)和行李(预测为背包)。
下图显示了这九类的初始预测输出:
......@@ -179,7 +179,7 @@ plt.show()
由此,您可以观察到以下内容:
* 每个图形尺寸为 224 x 224,标签的顶部打印有置信度百分比。
* 每个图形尺寸为`224 x 224`,标签的顶部打印有置信度百分比。
* 有两个错误的预测:炒锅(预测为钢包)和床(预测为工作室沙发)。
通过本练习,我们现在了解了如何在不训练单个图像的情况下使用预先训练的模型来预测知名的类对象。 我们之所以这样做,是因为每个图像模型都使用 ImageNet 数据库中的 1,000 个类别进行了训练,并且计算机视觉社区可以使用该模型产生的权重,以供其他模型使用。
......@@ -190,7 +190,7 @@ plt.show()
我们在“第 5 章”,“神经网络架构和模型”中引入了迁移学习的概念,并在“使用 TensorFlow 编写深度学习模型”部分中,演示了如何基于预训练模型预测图像类别。 我们已经观察到,预训练模型在大型数据集上可以获得合理的准确率,但是我们可以通过在自己的数据集上训练模型来对此进行改进。 一种方法是构建整个模型(例如,ResNet)并在我们的数据集上对其进行训练-但是此过程可能需要大量时间才能运行模型,然后为我们自己的数据集优化模型参数。
另一种更有效的方法(称为**迁移学习**)是从基本模型中提取特征向量,而无需在 ImageNet 数据集上训练顶层,然后添加我们的自定义全连接层,包括激活,退出和 softmax,构成我们的最终模型。 我们冻结了基础模型,但是新添加的组件的顶层仍未冻结。 我们在自己的数据集上训练新创建的模型以生成预测。 从大型模型迁移学习的特征图,然后通过微调高阶模型参数在我们自己的数据集上对其进行自定义的整个过程称为迁移学习。 在接下来的几节中,将从“分析和存储数据”开始,说明迁移学习工作流程以及相关的 TensorFlow / Keras 代码。
另一种更有效的方法(称为**迁移学习**)是从基本模型中提取特征向量,而无需在 ImageNet 数据集上训练顶层,然后添加我们的自定义全连接层,包括激活,退出和 softmax,构成我们的最终模型。 我们冻结了基础模型,但是新添加的组件的顶层仍未冻结。 我们在自己的数据集上训练新创建的模型以生成预测。 从大型模型迁移学习的特征图,然后通过微调高阶模型参数在我们自己的数据集上对其进行自定义的整个过程称为迁移学习。 在接下来的几节中,将从“分析和存储数据”开始,说明迁移学习工作流程以及相关的 TensorFlow/Keras 代码。
# 分析和存储数据
......@@ -260,7 +260,7 @@ train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,rota
目录 API 的流程-用于从目录导入数据。 它具有以下参数:
* `Directory`:这是文件夹路径,应设置为存在所有三个类的图像的路径。 在这种情况下,示例为`train`目录的路径。 要获取路径,您可以将文件夹拖到终端,它会向您显示路径,然后可以将其复制并粘贴。
* `Target_size`:将其设置为等于模型拍摄的图像大小,例如,对于 Inception 为 299 x 299,对于 ResNet 和 VGG16 为 224 x 224
* `Target_size`:将其设置为等于模型拍摄的图像大小,例如,对于 Inception 为 299 x 299,对于 ResNet 和 VGG16 为`224 x 224`
* `Color_mode`:将黑白图像设置为`grayscale`,将彩色图像设置为`RGB`
* `Batch_size`:每批图像的数量。
* `class_mode`:如果只有两个类别可以预测,则设置为二进制;否则,请设置为二进制。 如果不是,则设置为`categorical`
......@@ -369,7 +369,7 @@ loss = history.history['loss']
val_loss = history.history['val_loss']
```
以下代码是使用 Keras 和 TensorFlow 绘制模型输出的标准代码。 我们首先定义图形大小(8 x 8),并使用子图函数显示`(2,1,1)``(2,1,2)`。 然后,我们定义标签,限制和标题:
以下代码是使用 Keras 和 TensorFlow 绘制模型输出的标准代码。 我们首先定义图形大小(`8 x 8`),并使用子图函数显示`(2,1,1)``(2,1,2)`。 然后,我们定义标签,限制和标题:
```py
plt.figure(figsize=(8, 8))
......@@ -420,7 +420,7 @@ plt.show()
![](img/34641430-6c28-4ced-8e2e-eda0bcefb882.png)
上图显示了整个图像分类神经网络模型可以分为两个部分:卷积层和顶层。 在全连接层之前的最后一个卷积层是形状的特征向量(`图像数, X, Y, 通道数`),并且被展平(`图像数 * X * Y * 通道数`)以生成 n 维矢量。
上图显示了整个图像分类神经网络模型可以分为两个部分:卷积层和顶层。 在全连接层之前的最后一个卷积层是形状的特征向量(`图像数, X, Y, 通道数`),并且被展平(`图像数 * X * Y * 通道数`)以生成`n`维矢量。
特征向量形状具有四个分量:
......@@ -440,7 +440,7 @@ plt.show()
3. 通过刚刚开发的新模型运行图像,上传图像并找到其特征向量和图像类。
4. 为了节省时间,请仅在与上载图像相对应的目录类中进行搜索。
5. 使用诸如欧几里得距离或余弦相似度的算法进行搜索。
6. 如果余弦相似度> 0.999,则显示搜索结果;否则,显示搜索结果。 如果不是,请使用上传的图像重新训练模型,或者调整模型参数并重新运行该过程。
6. 如果余弦相似度`> 0.999`,则显示搜索结果;否则,显示搜索结果。 如果不是,请使用上传的图像重新训练模型,或者调整模型参数并重新运行该过程。
7. 为了进一步加快搜索速度,请使用生成的边界框检测上载图像内以及搜索图像数据库和目录内对象的位置。
上述流程图包含几个关键组件:
......@@ -600,7 +600,7 @@ TensorFlow `tf.data` API 是一种高效的数据管道,其处理数据的速
* `tf.data.Dataset.list_files`用于创建与模式匹配的所有文件的数据集。
* `tf.strings.splot`基于定界符分割文件路径。
* `tf.image.decode_jpeg`将 JPEG 图像解码为张量(请注意,转换必须没有文件路径)。
* `tf.image.convert_image_dtype`将图像转换为 dtype float 32
* `tf.image.convert_image_dtype`将图像转换为`dtype float32`
[以下链接提供了更新的视觉搜索代码](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter06/Chapter6_Transferlearning_VisualSearch_tfdata_tensor.ipynb)
......@@ -619,11 +619,11 @@ for layer in base_model.layers[:layer_adjust]:
训练花费更多时间,但是模型的准确率接近 100%,而不是 90%。
在总结本章之前,让我们回顾一下训练 CNN 的两个重要概念:准确率和损失性。 Keras 将`y-pred``y-true`定义为模型预测值和地面真实值。 准确率定义为将`y-pred``y-true`进行比较,然后平均差异。 损失项(也称为熵)定义为乘积类别概率与分类指数的负和。 可能还有其他损耗项,例如 rms prop。 通常,如果`accuracy > 0.9``loss < 1`,训练会给出正确的输出。
在总结本章之前,让我们回顾一下训练 CNN 的两个重要概念:准确率和损失性。 Keras 将`y-pred``y-true`定义为模型预测值和地面真实值。 准确率定义为将`y-pred``y-true`进行比较,然后平均差异。 损失项(也称为熵)定义为乘积类别概率与分类指数的负和。 可能还有其他损耗项,例如 RMSProp。 通常,如果`accuracy > 0.9``loss < 1`,训练会给出正确的输出。
# 概要
在本章中,我们学习了如何使用 TensorFlow / Keras 为上一章研究的深度学习模型开发迁移学习代码。 我们学习了如何从包含多个类的目录中导入经过训练的图像,并使用它们来训练模型并进行预测。 然后,我们学习了如何使模型的基础层保持冻结状态,移除顶层并用我们自己的顶层替换它,并使用它来训练结果模型。
在本章中,我们学习了如何使用 TensorFlow/Keras 为上一章研究的深度学习模型开发迁移学习代码。 我们学习了如何从包含多个类的目录中导入经过训练的图像,并使用它们来训练模型并进行预测。 然后,我们学习了如何使模型的基础层保持冻结状态,移除顶层并用我们自己的顶层替换它,并使用它来训练结果模型。
我们研究了视觉搜索的重要性以及如何使用迁移学习来增强视觉搜索方法。 我们的示例包括三种不同类别的家具-我们了解了模型的准确率以及如何改善由此造成的损失。 在本章中,我们还学习了如何使用 TensorFlow `tf.data`输入管道在训练期间更快地处理图像。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册