提交 059f9438 编写于 作者: W wizardforcel

2020-09-05 22:12:45

上级 31f667ba
......@@ -4,13 +4,13 @@
# 这本书是给谁的
读者想知道如何将深度学习应用于计算机视觉问题,例如分类,检测,检索,分割,生成,字幕和视频分类。 读者还希望了解如何在各种约束下(例如更少的数据,不平衡的类别和噪声)获得良好的准确。 然后,读者还想知道如何在各种平台(AWS,Google Cloud,Raspberry Pi 和移动电话)上部署经过训练的模型。 读完本书后,读者应该能够开发出有关人员检测,人脸识别,产品搜索,医学图像分割,图像生成,图像字幕生成,视频分类等问题的代码。
读者想知道如何将深度学习应用于计算机视觉问题,例如分类,检测,检索,分割,生成,字幕和视频分类。 读者还希望了解如何在各种约束下(例如更少的数据,不平衡的类别和噪声)获得良好的准确。 然后,读者还想知道如何在各种平台(AWS,Google Cloud,Raspberry Pi 和移动电话)上部署经过训练的模型。 读完本书后,读者应该能够开发出有关人员检测,人脸识别,产品搜索,医学图像分割,图像生成,图像字幕生成,视频分类等问题的代码。
# 本书涵盖的内容
第 1 章,“入门”介绍了深度学习的基础知识,并使读者熟悉该词汇表。 读者将安装遵循其余各章所必需的软件包。
第 1 章,“入门”介绍了深度学习的基础知识,并使读者熟悉该词汇表。 读者将安装遵循其余各章所必需的包。
第 2 章,“图像分类”讨论图像分类问题,该问题将整个图像标记为图像。 读者将学习图像分类技术,并训练用于宠物分类的深度学习模型。 他们还将学习提高准确的方法,并深入研究各种先进的架构。
第 2 章,“图像分类”讨论图像分类问题,该问题将整个图像标记为图像。 读者将学习图像分类技术,并训练用于宠物分类的深度学习模型。 他们还将学习提高准确的方法,并深入研究各种先进的架构。
第 3 章,“图像检索”涵盖了深层特征和图像检索。 读者将学习获得模型可视化,视觉特征,使用 TensorFlow 进行推理以及服务和使用视觉特征进行产品检索的各种方法。
......@@ -36,7 +36,7 @@
本书中使用了许多文本约定。
`CodeInText`:表示文本中的词,数据库表名称,文件夹名称,文件名,文件扩展名,路径名,伪 URL,用户输入和 Twitter 句柄。 这里是一个示例:“ 请注意,图是用 `summary_writer`编写的。
`CodeInText`:表示文本中的词,数据库表名称,文件夹名称,文件名,文件扩展名,路径名,伪 URL,用户输入和 Twitter 句柄。 这里是一个示例:“ 请注意,图是用 `summary_writer`编写的。
代码块设置如下:
......
......@@ -13,11 +13,11 @@
# 感知机
人工神经元或感知机接受多个输入并执行加权求和以产生输出。 感知机的重量是在训练过程中确定的,并基于训练数据。 以下是感知机的图:
人工神经元或感知机接受多个输入并执行加权求和以产生输出。 感知机的权重是在训练过程中确定的,并基于训练数据。 以下是感知机的图:
![](img/1e292483-bf0f-4474-9ee4-9f18966861b6.png)
如上图所示,对输入进行加权和求和。 然后,对于二进制分类问题,该总和然后通过单位步长函数传递。 感知机只能通过从示例中学习权重来学习简单函数。 学习权重的过程称为训练。 可以通过基于梯度的方法对感知机进行训练,这将在后面的部分中进行介绍。 感知机的输出可以通过 `activation` 函数或 `transfer` 函数传递,这将在下一部分中进行说明。
如上图所示,对输入进行加权和求和。 然后,对于二分类问题,该总和然后通过单位步长函数传递。 感知机只能通过从示例中学习权重来学习简单函数。 学习权重的过程称为训练。 可以通过基于梯度的方法对感知机进行训练,这将在后面的部分中进行介绍。 感知机的输出可以通过 `activation` 函数或 `transfer` 函数传递,这将在下一部分中进行说明。
# 激活函数
......@@ -25,11 +25,11 @@
为了训练神经网络,函数必须是可微的。 以下是一些`activation`函数。
如果您不了解诸如连续性和可分性之类的术语,请不要担心。 在各章中将变得更加清楚。
如果您不了解诸如连续性和可分性之类的术语,请不要担心。 在各章中将变得更加清楚。
# Sigmoid
Sigmoid 可以看作是平滑的阶跃函数,因此可以微分。 Sigmoid 可用于将任何值转换为概率,并可用于二进制分类。 Sigmoid 映射将输入映射到 0 到 1 范围内的值,如下图所示:
Sigmoid 可以看作是平滑的阶跃函数,因此可以微分。 Sigmoid 可用于将任何值转换为概率,并可用于二分类。 Sigmoid 映射将输入映射到 0 到 1 范围内的值,如下图所示:
![](img/f171c6d5-67e5-4e9c-a168-be794c8e444b.png)
......@@ -37,7 +37,7 @@ Sigmoid 可以看作是平滑的阶跃函数,因此可以微分。 Sigmoid 可
# 双曲正切函数
双曲正切函数或 `tanh` 是 Sigmoid 曲线的缩放形式。 像 Sigmoid 一样,它是光滑且可分的。 `tanh`将输入映射到 -1 到 1 的值,如下图所示:
双曲正切函数或 `tanh` 是 Sigmoid 曲线的缩放形式。 像 Sigmoid 一样,它是光滑且可分的。 `tanh`将输入映射到 -1 到 1 的值,如下图所示:
![](img/623bcab3-b4f7-4ce7-b817-a3f1bad2944d.png)
......@@ -55,7 +55,7 @@ ReLu 可以让大量数字通过。 这会使一些神经元陈旧,并且它
ANN 是感知机函数的集合。 感知机连接形成隐藏的层或单元。 隐藏的单元形成了将低层空间中的输入层映射到输出层的非线性基础,这也称为人工神经网络。 ANN 是从输入到输出的映射。 该图是通过将输入与偏差进行加权相加来计算的。 权重和偏置值以及架构称为`model`
训练过程确定这些权重和偏置的值。 在训练开始时,使用随机值初始化模型值。 通过使用损失函数将误差与基本事实进行对比来计算误差。 根据计算出的损耗,在每一步调整权重。 如果无法进一步减少错误,则停止训练。 训练过程会在训练过程中学习特征。 这些特征比原始图像更好地表示。 以下是人工神经网络或多层感知机的示意图:
训练过程确定这些权重和偏置的值。 在训练开始时,使用随机值初始化模型值。 通过使用损失函数将误差与基本事实进行对比来计算误差。 根据计算出的损耗,在每一步调整权重。 如果无法进一步减少误差,则停止训练。 训练过程会在训练过程中学习特征。 这些特征比原始图像更好地表示。 以下是人工神经网络或多层感知机的示意图:
![](img/386212ca-7e62-482c-b6b3-d0d30426ca19.png)
......@@ -63,7 +63,7 @@ ANN 是感知机函数的集合。 感知机连接形成隐藏的层或单元。
# 单热编码
单热编码是在出现分类问题时表示目标变量或类的一种方式。 目标变量可以从字符串标签转换为一键编码的向量。 一个热门向量在目标类别的索引处填充有`1`,但在其他所有地方填充有`0`。 例如,如果目标类别是猫和狗,则可以分别用`[1, 0]``[0, 1]`。 对于 1,000 个类别,单热向量的大小为 1,000 整数,全为零,但有一个`1`。 它不假设目标变量的相似性。 通过在下一节中说明的一键编码和 softmax 的组合,可以在 ANN 中实现多类分类。
单热编码是在出现分类问题时表示目标变量或类的一种方式。 目标变量可以从字符串标签转换为一键编码的向量。 单热向量在目标类别的索引处填充有`1`,但在其他所有地方填充有`0`。 例如,如果目标类别是猫和狗,则可以分别用`[1, 0]``[0, 1]`。 对于 1,000 个类别,单热向量的大小为 1,000 整数,全为零,但有一个`1`。 它不假设目标变量的相似性。 通过在下一节中说明的一键编码和 softmax 的组合,可以在 ANN 中实现多类分类。
# Softmax
......@@ -79,15 +79,15 @@ Softmax 是一种强制神经网络输出 1 之和的方法。因此,`softmax`
# 丢弃法
辍学是规整神经网络以避免 ANN 过度拟合的有效方法。 在训练期间,辍学层通过随机删除隐藏的单元来破坏神经网络,如下图所示:
丢弃法是规整神经网络以避免 ANN 过拟合的有效方法。 在训练期间,丢弃层通过随机删除隐藏的单元来破坏神经网络,如下图所示:
![](img/9eae1f1c-0308-4516-9cda-3e9531220150.png)
请注意如何随机训练神经元。 辍学也是组合多个神经网络的有效方法。 对于每个训练案例,我们随机选择一些隐藏的单元,以便最终为每个案例使用不同的架构。 这是装袋和模型平均的极端情况。 推断期间不应使用辍学层,因为没有必要。
请注意如何随机训练神经元。 丢弃也是组合多个神经网络的有效方法。 对于每个训练案例,我们随机选择一些隐藏的单元,以便最终为每个案例使用不同的架构。 这是装袋和模型平均的极端情况。 推断期间不应使用丢弃层,因为没有必要。
# 批量规范化
批量规范化或批量规范可提高神经网络训练的稳定性和表现。 它将平均值为零且标准差为 1 的层的输出归一化。这减少了过拟合,并使网络训练更快。 这对于训练复杂的神经网络非常有用。
批量规范化或批量规范可提高神经网络训练的稳定性和表现。 它将平均值为零且标准差为 1 的层的输出归一化。这减少了过拟合,并使网络训练更快。 这对于训练复杂的神经网络非常有用。
# L1 和 L2 正则化
......@@ -95,7 +95,7 @@ L1 惩罚权重的绝对值,并趋于使权重为零。 L2 惩罚权重的平
# 训练神经网络
训练 ANN 非常棘手,因为它包含多个要优化的参数。 权重的更新过程称为反向传播。 最小化错误的过程称为优化。 我们将在下一节中详细介绍这两个方面。
训练 ANN 非常棘手,因为它包含多个要优化的参数。 权重的更新过程称为反向传播。 最小化误差的过程称为优化。 我们将在下一节中详细介绍这两个方面。
# 反向传播
......@@ -121,7 +121,7 @@ SGD 与梯度下降相同,区别在于 SGD 每次仅用于部分数据训练
# 玩转 TensorFlow 游乐场
TensorFlow 游乐场是神经网络的交互式可视化。 访问[这里](http://playground.tensorflow.org/),方法是通过更改参数来查看前面提到的术语如何协同工作。 这是操场的屏幕截图:
TensorFlow 游乐场是神经网络的交互式可视化。 访问[这里](http://playground.tensorflow.org/),方法是通过更改参数来查看前面提到的如何协同工作。 这是操场的屏幕截图:
![](img/2a57f080-1ddb-4c9d-b3d0-201bc792caad.png)
......@@ -147,7 +147,7 @@ TensorFlow 游乐场中的仪表板
# 最大池
池化层位于卷积层之间。 合并层通过采样减小了跨层图像的大小。 通过在窗口中选择最大值来完成采样。 窗口中的平均池平均值。 池化还可以作为一种正则化技术来避免过拟合。 在特征的所有通道上进行池化。 合并也可以进行各种步骤。
池化层位于卷积层之间。 合并层通过采样减小了跨层图像的大小。 通过在窗口中选择最大值来完成采样。 窗口中的平均池平均值。 池化还可以作为一种正则化技术来避免过拟合。 在特征的所有通道上进行池化。 合并也可以进行各种步骤。
窗口的大小是 CNN 接收场的量度。 下图显示了最大池化的示例:
......@@ -261,15 +261,15 @@ CUDA 是 NVIDIA 使用 GPU 的并行特性提供的 API 层。 安装此驱动
# CUDA 深度神经网络 - CUDNN
`CUDNN`库为深度学习算法提供了原语。 由于此软件包由 NVIDIA 提供,因此对其硬件进行了高度优化,并且运行速度更快。 该软件包提供了几种用于深度学习的标准例程。 著名的深度学习库(例如`tensorflow``caffe`等)使用这些软件包。 在下一节中,将提供安装`CUDNN`的说明。 您可以从 [NVIDIA 门户网站](https://developer.nvidia.com/rdp/cudnn-download)下载`CUDNN`
`CUDNN`库为深度学习算法提供了原语。 由于此包由 NVIDIA 提供,因此对其硬件进行了高度优化,并且运行速度更快。 该包提供了几种用于深度学习的标准例程。 著名的深度学习库(例如`tensorflow``caffe`等)使用这些包。 在下一节中,将提供安装`CUDNN`的说明。 您可以从 [NVIDIA 门户网站](https://developer.nvidia.com/rdp/cudnn-download)下载`CUDNN`
用户帐户是必需的(免费注册)。
将相关文件复制到`CUDA`文件夹,使其更快地在 GPU 上运行。 我们不会直接使用`CUDA``CUDNN`库。 Tensorflow 使用这些来优化例程在 GP-GPU 上工作。
# 安装软件
# 安装包
训练有素的深度学习模型需要几个库。 我们将安装以下库,并查看在竞争软件包中选择以下软件包的原因:
训练有素的深度学习模型需要几个库。 我们将安装以下库,并查看在竞争包中选择以下包的原因:
* Python 和其他依赖项
* OpenCV
......@@ -278,25 +278,25 @@ CUDA 是 NVIDIA 使用 GPU 的并行特性提供的 API 层。 安装此驱动
# Python
Python 是任何数据科学应用的实际选择。 它拥有最大的社区和图书馆支持生态系统。 用于 Python 的 TensorFlow API 是最完整的,因此,Python 是首选的自然语言。 Python 有两个版本-Python2.x 和 Python3.x。 在本书中,我们将讨论 Python3.x。 这种选择有几个原因:
Python 是任何数据科学应用的实际选择。 它拥有最大的社区和支持生态系统。 用于 Python 的 TensorFlow API 是最完整的,因此,Python 是首选的自然语言。 Python 有两个版本-Python2.x 和 Python3.x。 在本书中,我们将讨论 Python3.x。 这种选择有几个原因:
* 到 2020 年,Python 2.x 的开发将停止,因此,Python3.x 是 Python 的未来
* Python 3.x 避免了原始实现中的许多设计缺陷
* 与普遍的看法相反,Python3.x 具有与 Python 2.x 一样多的数据科学支持库。
在本书中,我们将使用 Python 版本 3。 转到[这里](https://www.python.org/downloads/),然后根据操作系统下载版本 3。 按照下载链接中给出的步骤安装 Python。 安装 Python 后,必须安装 **PIP3**,以方便安装 Python 软件包。 然后通过输入以下命令安装几个 Python 软件包,以便以后可以安装`OpenCV``tensorflow`
在本书中,我们将使用 Python 版本 3。 转到[这里](https://www.python.org/downloads/),然后根据操作系统下载版本 3。 按照下载链接中给出的步骤安装 Python。 安装 Python 后,必须安装 **PIP3**,以方便安装 Python 包。 然后通过输入以下命令安装几个 Python 包,以便以后可以安装`OpenCV``tensorflow`
```py
sudo pip3 install numpy scipy scikit-learn pillow h5py
```
先前安装的软件包的说明如下:
先前安装的包的说明如下:
* `numpy` 是高度优化的数值计算程序包。 它具有强大的 N 维封装数组对象,并且`numpy`库的矩阵运算针对速度进行了高度优化。 图像可以存储为 3 维`numpy`对象。
* `scipy` 有一些用于科学和工程计算的例程。 在本书的后面,我们将使用一些优化程序包。
* `numpy` 是高度优化的数值计算包。 它具有强大的 N 维封装数组对象,并且`numpy`库的矩阵运算针对速度进行了高度优化。 图像可以存储为 3 维`numpy`对象。
* `scipy` 有一些用于科学和工程计算的例程。 在本书的后面,我们将使用一些优化包。
* `scikit-learn` 是一个机器学习库,我们将使用其中的许多辅助函数。
* `Ppillow`对于图像加载和基本操作很有用。
* `H5py`程序包是 HDF5 二进制数据格式的 Pythonic 接口。 这是存储使用 Keras 训练的模型的格式。
* `H5py`包是 HDF5 二进制数据格式的 Pythonic 接口。 这是存储使用 Keras 训练的模型的格式。
# 开放式计算机视觉 - OpenCV
......@@ -310,7 +310,7 @@ sudo apt-get install python-opencv
# TensorFlow 库
`tensorflow`是一个用于开发和部署深度学习模型的开源库。 TensorFlow 使用计算图进行数据流和数值计算。 换句话说,数据或张量流经图,因此名称为`tensorflow`。 该图具有可进行任何数值计算的节点,因此适用于深度学习操作。 它为各种平台和硬件提供了一个 API。 TensorFlow 在后端处理扩展和优化的所有复杂性。 它最初是为在 Google 上进行研究而开发的。 它是最著名的深度学习库,拥有大型社区,并提供用于生产中的可视化和部署的工具。
`tensorflow`是一个用于开发和部署深度学习模型的开源库。 TensorFlow 使用计算图进行数据流和数值计算。 换句话说,数据或张量流经图,因此名称为`tensorflow`。 该图具有可进行任何数值计算的节点,因此适用于深度学习操作。 它为各种平台和硬件提供了一个 API。 TensorFlow 在后端处理扩展和优化的所有复杂性。 它最初是为在 Google 上进行研究而开发的。 它是最著名的深度学习库,拥有大型社区,并提供用于生产中的可视化和部署的工具。
# 安装 TensorFlow
......@@ -370,7 +370,7 @@ sudo pip3 install tensorflow-gpu
Hello, TensorFlow!
```
让我们再看一个示例,以了解会话和图的工作方式。
让我们再看一个示例,以了解会话和图的工作方式。
访问[这里](https://github.com/rajacheers/DeepLearningForComputerVision)获取本书中所有示例的代码。 该代码将根据章节进行组织。 您可以提出问题并在存储库中获得帮助。
......@@ -443,14 +443,14 @@ y = tf.placeholder(tf.float32, name='y')
z = tf.add(x, y, name='sum')
```
请注意,已将参数名称作为占位符和操作的附加参数提供。 这些是我们可视化图形时可以看到的名称。 现在我们可以在 TensorBoard 中使用以下命令将图形写入特定的文件夹:
请注意,已将参数名称作为占位符和操作的附加参数提供。 这些是我们可视化图时可以看到的名称。 现在我们可以在 TensorBoard 中使用以下命令将图写入特定的文件夹:
```py
session = tf.Session()
summary_writer = tf.summary.FileWriter('/tmp/1', session.graph)
```
此命令将图写入磁盘到参数中给定的特定文件夹中。 现在可以使用以下命令调用 Tensorboard:
此命令将图写入磁盘到参数中给定的特定文件夹中。 现在可以使用以下命令调用 Tensorboard:
```py
tensorboard --logdir=/tmp/1
......@@ -486,10 +486,10 @@ sudo apt-get install tensorflow-model-server
# Keras
`Keras`是一个用 Python 编写的用于深度学习的开源库。 它提供了一个简单的界面来使用 TensorFlow 作为后端。 Keras 还可以与 Theano,深度学习 4j 或 CNTK 一起用作后端。 Keras 通过专注于友好性,模块化和可扩展性而设计用于轻松快速地进行实验。 它是一个独立的框架,可以在 CPU 和 GPU 之间无缝运行。 Keras 可以单独安装,也可以使用`tf.keras` API 在 TensorFlow 本身中使用。 在本书中,我们将使用`tf.keras` API。 我们已经看到了安装开发环境所需的库的步骤。 顺利安装 CUDA,CUDNN,OpenCV,TensorFlow 和 Keras 并对以下章节至关重要。
`Keras`是一个用 Python 编写的用于深度学习的开源库。 它提供了一个简单的接口来使用 TensorFlow 作为后端。 Keras 还可以与 Theano,深度学习 4j 或 CNTK 一起用作后端。 Keras 通过专注于友好性,模块化和可扩展性而设计用于轻松快速地进行实验。 它是一个独立的框架,可以在 CPU 和 GPU 之间无缝运行。 Keras 可以单独安装,也可以使用`tf.keras` API 在 TensorFlow 本身中使用。 在本书中,我们将使用`tf.keras` API。 我们已经看到了安装开发环境所需的库的步骤。 顺利安装 CUDA,CUDNN,OpenCV,TensorFlow 和 Keras 并对以下章节至关重要。
# 总结
本章涵盖了深度学习的基础知识。 本章介绍的词汇将在整本书中使用,因此,您可以经常参考本章。 示例还显示了计算机视觉的应用。 还介绍了用于开发环境的各种平台的所有软件包的安装。
本章涵盖了深度学习的基础知识。 本章介绍的词汇将在整本书中使用,因此,您可以经常参考本章。 示例还显示了计算机视觉的应用。 还介绍了用于开发环境的各种平台的所有包的安装。
在下一章中,我们将讨论如何在数据集上使用 Keras 和 TensorFlow 训练分类模型。 我们将研究如何使用更大的模型和其他技术(例如增强和微调)来提高准确性。 然后,我们将看到由世界各地的几个人提出的几种先进模型,它们在比赛中达到了最佳准确性。
\ No newline at end of file
在下一章中,我们将讨论如何在数据集上使用 Keras 和 TensorFlow 训练分类模型。 我们将研究如何使用更大的模型和其他技术(例如增强和微调)来提高准确率。 然后,我们将看到由世界各地的几个人提出的几种先进模型,它们在比赛中达到了最佳准确率。
\ No newline at end of file
此差异已折叠。
......@@ -136,7 +136,7 @@ for filter_idx in range(20):
break
```
优化之后,通过均值减去并调整标准差来完成归一化。 然后,可以按比例缩小滤镜并将其裁剪到其梯度值,如下所示:
优化之后,通过均值减去并调整标准差来完成归一化。 然后,可以按比例缩小滤镜并将其裁剪到其梯度值,如下所示:
```py
if loss_value > 0:
......@@ -212,7 +212,7 @@ with gfile.FastGFile(model_path, 'rb') as f:
graph_defnition.ParseFromString(f.read())
```
会话从图形初始化开始。 然后,将下载的模型的图形定义加载到内存中。 作为预处理步骤,必须从输入中减去`ImageNet`平均值,如下所示。 预处理后的图像随后被馈送到该图,如下所示:
会话从图初始化开始。 然后,将下载的模型的图定义加载到内存中。 作为预处理步骤,必须从输入中减去`ImageNet`平均值,如下所示。 预处理后的图像随后被馈送到该图,如下所示:
```py
input_placeholder = tf.placeholder(np.float32, name='input')
......@@ -220,7 +220,7 @@ imagenet_mean_value = 117.0 preprocessed_input = tf.expand_dims(input_placeholde
tf.import_graph_def(graph_defnition, {'input': preprocessed_input})
```
现在,会话和图已准备好进行推断。 双线性插值需要`resize_image`函数。 可以添加`resize`函数方法,该函数通过 TensorFlow 会话来调整图像的大小,如下所示:
现在,会话和图已准备好进行推断。 双线性插值需要`resize_image`函数。 可以添加`resize`函数方法,该函数通过 TensorFlow 会话来调整图像的大小,如下所示:
```py
def resize_image(image, size):
......@@ -305,7 +305,7 @@ PIL.Image.fromarray(image).save('dream_' + image_name, 'jpeg')
# 对抗性示例
在几个数据集上,图像分类算法已达到人类水平的准确。 但是它们可以被对抗性例子轻易地欺骗。 对抗示例是合成图像,它们使模型无法产生所需的结果。 拍摄任何图像,然后选择不正确的随机目标类别。 可以用噪声修改该图像,[直到网络被 Goodfellow 等人所欺骗](https://arxiv.org/pdf/1412.6572.pdf)。 该模型的对抗攻击示例如下所示:
在几个数据集上,图像分类算法已达到人类水平的准确。 但是它们可以被对抗性例子轻易地欺骗。 对抗示例是合成图像,它们使模型无法产生所需的结果。 拍摄任何图像,然后选择不正确的随机目标类别。 可以用噪声修改该图像,[直到网络被 Goodfellow 等人所欺骗](https://arxiv.org/pdf/1412.6572.pdf)。 该模型的对抗攻击示例如下所示:
![](img/5fc3a7dd-4e49-4215-a821-e026811ca3fd.png)
......@@ -325,7 +325,7 @@ PIL.Image.fromarray(image).save('dream_' + image_name, 'jpeg')
# 导出模型
训练后的模型必须导出并保存。 权重,偏差和图都存储用于推断。 我们将训练 MNIST 模型并将其存储。 首先使用以下代码定义所需的常量:
训练后的模型必须导出并保存。 权重,偏差和图都存储用于推断。 我们将训练 MNIST 模型并将其存储。 首先使用以下代码定义所需的常量:
```py
work_dir = '/tmp' model_version = 9 training_iteration = 1000 input_size = 784 no_classes = 10 batch_size = 100 total_batches = 200
......@@ -364,7 +364,7 @@ for batch_no in range(total_batches):
print(loss_value)
```
定义预测签名,并导出模型。 将模型保存到持久性存储中,以便可以在以后的时间点进行推理。 这将通过反序列化导出数据,并将其存储为其他系统可以理解的格式。 具有不同变量和占位符的多个图可用于导出。 它还支持`signature_defs`资产。 `signature_defs`指定了输入和输出,因为将从外部客户端访问输入和输出。 资产是将用于推理的非图形组件,例如词汇表等。
定义预测签名,并导出模型。 将模型保存到持久性存储中,以便可以在以后的时间点进行推理。 这将通过反序列化导出数据,并将其存储为其他系统可以理解的格式。 具有不同变量和占位符的多个图可用于导出。 它还支持`signature_defs`素材。 `signature_defs`指定了输入和输出,因为将从外部客户端访问输入和输出。 素材是将用于推理的非图组件,例如词汇表等。
分类签名使用对 TensorFlow 分类 API 的访问权限。 输入是强制性的,并且有两个可选输出(预测类别和预测概率),其中至少一个是强制性的。 预测签名提供输入和输出数量的灵活性。 可以定义多个输出并从客户端显式查询。 `signature_def`显示在此处:
......@@ -440,7 +440,7 @@ result.add_done_callback(
_create_rpc_callback())
```
反复调用推理以评估准确,延迟和吞吐量。 推断错误率应该在 90% 左右,并且并发性应该很高。 导出和客户端方法可用于任何模型,以从模型获得结果和特征。 在下一节中,我们将构建检索流水线。
反复调用推理以评估准确,延迟和吞吐量。 推断错误率应该在 90% 左右,并且并发性应该很高。 导出和客户端方法可用于任何模型,以从模型获得结果和特征。 在下一节中,我们将构建检索流水线。
# 基于内容的图像检索
......@@ -452,10 +452,10 @@ result.add_done_callback(
因此,我们训练了一个用于对象分类的模型,并使用该模型中的特征进行检索。 然后,我们通过相同的模型传递查询图像和目标数据库以获得特征。 这些模型也可以称为**编码器**,因为它们对特定任务的图像信息进行编码。 编码器应该能够捕获全局和局部特征。 我们可以使用我们在图像分类一章中研究过的模型,这些模型经过训练可以进行分类任务。 由于强力扫描或线性扫描速度较慢,因此图像搜索可能会花费大量时间。 因此,需要一些用于更快检索的方法。 以下是一些加快匹配速度的方法:
* **局部敏感哈希****LSH**):LSH 将要素投影到其子空间,并可以向候选对象提供列表,并在以后进行精细特征排名。 这也是我们本章前面介绍的降维技术,例如 PCA 和 t-SNE。 它具有较小尺寸的铲斗。
* **局部敏感哈希****LSH**):LSH 将特征投影到其子空间,并可以向候选对象提供列表,并在以后进行精细特征排名。 这也是我们本章前面介绍的降维技术,例如 PCA 和 t-SNE。 它具有较小尺寸的铲斗。
* **多索引哈希**:此方法对特征进行哈希处理,就像信鸽拟合一样,可以使其更快。 它使用汉明距离来加快计算速度。 汉明距离不过是以二进制表示的数字的位置差异的数量。
这些方法更快,需要更少的内存,但要权衡准确。 这些方法也没有捕获语义上的差异。 可以根据查询对匹配结果进行重新排名以获得更好的结果。 重新排序可以通过对返回的目标图像重新排序来改善结果。 重新排序可以使用以下技术之一:
这些方法更快,需要更少的内存,但要权衡准确。 这些方法也没有捕获语义上的差异。 可以根据查询对匹配结果进行重新排名以获得更好的结果。 重新排序可以通过对返回的目标图像重新排序来改善结果。 重新排序可以使用以下技术之一:
* **几何验证**:此方法将几何图形和目标图像与仅返回相似几何图形的目标图像进行匹配。
* **查询扩展**:这将扩展目标图像列表并详尽搜索它们。
......@@ -473,7 +473,7 @@ result.add_done_callback(
# 提取图像的瓶颈特征
瓶颈要素是在预分类层中计算的值。 在本节中,我们将看到如何使用 TensorFlow 从预训练的模型中提取瓶颈特征。 首先,使用以下代码导入所需的库:
瓶颈特征是在预分类层中计算的值。 在本节中,我们将看到如何使用 TensorFlow 从预训练的模型中提取瓶颈特征。 首先,使用以下代码导入所需的库:
```py
import os
......@@ -482,7 +482,7 @@ from tensorflow.python.platform import gfile
import tarfile
```
然后,我们需要下载带有图定义及其权重的预训练模型。 TensorFlow 已使用初始架构在`ImageNet`数据集上训练了一个模型,并提供了该模型。 我们将使用以下代码下载该模型并将其解压缩到本地文件夹中:
然后,我们需要下载带有图定义及其权重的预训练模型。 TensorFlow 已使用初始架构在`ImageNet`数据集上训练了一个模型,并提供了该模型。 我们将使用以下代码下载该模型并将其解压缩到本地文件夹中:
```py
model_url = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz' file_name = model_url.split('/')[-1]
......@@ -493,7 +493,7 @@ if not os.path.exists(file_path):
tarfile.open(file_path, 'r:gz').extractall(work_dir)
```
仅当模型不存在时,这会创建一个文件夹并下载模型。 如果重复执行代码,则不会每次都下载模型。 该图**协议缓冲区****protobuf**)格式存储在文件中。 必须将其读取为字符串,然后传递给`tf.GraphDef()`对象以将其带入内存:
仅当模型不存在时,这会创建一个文件夹并下载模型。 如果重复执行代码,则不会每次都下载模型。 该图以**协议缓冲区****protobuf**)格式存储在文件中。 必须将其读取为字符串,然后传递给`tf.GraphDef()`对象以将其带入内存:
```py
model_path = os.path.join(work_dir, 'classify_image_graph_def.pb')
......@@ -502,7 +502,7 @@ with gfile.FastGFile(model_path, 'rb') as f:
graph_defnition.ParseFromString(f.read())
```
在初始模型中,瓶颈层名为`pool_3/_reshape:0`,并且该层的尺寸为 2,048。 输入的占位符名称为`DecodeJpeg/contents:0`,调整大小张量名称为`ResizeBilinear:0`。 我们可以使用`tf.import_graph_def`和所需的返回张量导入图定义,以进行进一步的操作:
在初始模型中,瓶颈层名为`pool_3/_reshape:0`,并且该层的尺寸为 2,048。 输入的占位符名称为`DecodeJpeg/contents:0`,调整大小张量名称为`ResizeBilinear:0`。 我们可以使用`tf.import_graph_def`和所需的返回张量导入图定义,以进行进一步的操作:
```py
bottleneck, image, resized_input = (
......@@ -555,7 +555,7 @@ print(target_feature)
# 计算查询图像与目标数据库之间的相似度
NumPy 的`linalg.norm`可用于计算**欧几里德距离**。 可以通过计算要素之间的欧几里得距离来计算查询图像与目标数据库之间的相似度,如下所示:
NumPy 的`linalg.norm`可用于计算**欧几里德距离**。 可以通过计算特征之间的欧几里得距离来计算查询图像与目标数据库之间的相似度,如下所示:
```py
dist = np.linalg.norm(np.asarray(query_feature) - np.asarray(target_feature))
......@@ -593,7 +593,7 @@ def create_annoy(target_features):
create_annoy(target_features)
```
创建索引需要要素的尺寸。 然后将项目添加到索引并构建树。 树木的数量越多,在时间和空间复杂度之间进行权衡的结果将越准确。 可以创建索引并将其加载到内存中。 可以查询 ANNOY,如下所示:
创建索引需要特征的尺寸。 然后将项目添加到索引并构建树。 树木的数量越多,在时间和空间复杂度之间进行权衡的结果将越准确。 可以创建索引并将其加载到内存中。 可以查询 ANNOY,如下所示:
```py
annoy_index = AnnoyIndex(10)
......@@ -603,7 +603,7 @@ matches = annoy_index.get_nns_by_vector(query_feature, 20)
匹配项列表可用于检索图像详细信息。 项目的索引将被返回。
请访问[这里](https://github.com/spotify/annoy)以获取`ANNOY`的完整实现,以及其在准确和速度方面与其他近似最近邻算法的基准比较。
请访问[这里](https://github.com/spotify/annoy)以获取`ANNOY`的完整实现,以及其在准确和速度方面与其他近似最近邻算法的基准比较。
# ANNOY 的优点
......@@ -618,7 +618,7 @@ matches = annoy_index.get_nns_by_vector(query_feature, 20)
![](img/2cc688ac-9e9f-447e-b46e-295eea60e0e9.png)
**瓶颈**层是尺寸减小的中间层。 瓶颈层的左侧称为**编码器**,右侧称为**解码器**。 编码器通常减小数据的尺寸,而解码器增大尺寸。 编码器和解码器的这种组合称为自编码器。 整个网络都经过重建错误训练。 从理论上讲,可以存储瓶颈层,并可以通过解码器网络重建原始数据。 如下所示,这可以减小尺寸并易于编程。 使用以下代码定义卷积,解卷积和全连接层:
**瓶颈**层是尺寸减小的中间层。 瓶颈层的左侧称为**编码器**,右侧称为**解码器**。 编码器通常减小数据的尺寸,而解码器增大尺寸。 编码器和解码器的这种组合称为自编码器。 整个网络都经过重建误差训练。 从理论上讲,可以存储瓶颈层,并可以通过解码器网络重建原始数据。 如下所示,这可以减小尺寸并易于编程。 使用以下代码定义卷积,解卷积和全连接层:
```py
def fully_connected_layer(input_layer, units):
......@@ -783,10 +783,10 @@ Tensorboard 说明了输出图
![](img/fcaa79e6-c455-46a6-8d49-1788aa7be7b6.png)
您会注意到,去噪自编码器在消除噪声方面做得非常出色。 您可以在测试图像上运行它,并可以看到质量得到保持。 对于更复杂的数据集,可以使用卷积神经网络以获得更好的结果。 该示例展示了计算机视觉深度学习的强大功能,因为它是在无监督的情况下进行训练的。
您会注意到,去噪自编码器在消除噪声方面做得非常出色。 您可以在测试图像上运行它,并可以看到质量得到保持。 对于更复杂的数据集,可以使用卷积神经网络以获得更好的结果。 该示例展示了计算机视觉深度学习的强大功能,因为它是在无监督的情况下进行训练的。
# 总结
在本章中,您学习了如何从图像中提取特征并将其用于 CBIR。 您还学习了如何使用 TensorFlow Serving 来推断图像特征。 我们看到了如何利用近似最近邻或更快的匹配而不是线性扫描。 您了解了散列如何仍可以改善结果。 引入了自编码器的概念,我们看到了如何训练较小的特征向量以进行搜索。 还显示了使用自编码器进行图像降噪的示例。 我们看到了使用基于位的比较的可能性,该比较可以将其扩展到数十亿张图像。
在下一章中,我们将看到如何训练对象检测问题的模型。 我们将利用开源模型来获得良好的准确性,并了解其背后的所有算法。 最后,我们将使用所有想法来训练行人检测模型。
\ No newline at end of file
在下一章中,我们将看到如何训练对象检测问题的模型。 我们将利用开源模型来获得良好的准确率,并了解其背后的所有算法。 最后,我们将使用所有想法来训练行人检测模型。
\ No newline at end of file
......@@ -11,7 +11,7 @@
# 检测图像中的对象
近年来,对象检测在应用和研究方面都出现了爆炸式增长。 对象检测是计算机视觉中的重要问题。 与图像分类任务相似,更深的网络在检测方面表现出更好的表现。 目前,这些技术的准确非常好。 因此,它被用于许多应用中。
近年来,对象检测在应用和研究方面都出现了爆炸式增长。 对象检测是计算机视觉中的重要问题。 与图像分类任务相似,更深的网络在检测方面表现出更好的表现。 目前,这些技术的准确非常好。 因此,它被用于许多应用中。
图像分类将图像标记为一个整体。 除了标记对象外,找到对象的位置也称为**对象定位**。 通常,对象的位置由直角坐标定义。 在图像中使用直角坐标查找多个对象称为检测。 这是对象检测的示例:
......@@ -26,34 +26,34 @@
# 探索数据集
可用于对象定位和检测的数据集很多。 在本节中,我们将探索研究社区用来评估法的数据集。 有些数据集带有不同数量的对象,这些对象中标注的范围从 20 到 200 不等,这使得对象检测变得困难。 与其他数据集(每个图像仅包含一个对象)相比,某些数据集在一个图像中包含的对象太多。 接下来,我们将详细查看数据集。
可用于对象定位和检测的数据集很多。 在本节中,我们将探索研究社区用来评估法的数据集。 有些数据集带有不同数量的对象,这些对象中标注的范围从 20 到 200 不等,这使得对象检测变得困难。 与其他数据集(每个图像仅包含一个对象)相比,某些数据集在一个图像中包含的对象太多。 接下来,我们将详细查看数据集。
# ImageNet 数据集
ImageNet 具有用于评估分类,定位和检测任务的数据。 第 2 章,“图像分类”详细讨论了分类数据集。 与分类数据类似,定位任务有 1,000 个类别。 准确是根据前五次检测得出的。 所有图像中至少会有一个边界框。 有 470,000 张图像的检测问题有 200 个对象,每个图像平均有 1.1 个对象。
ImageNet 具有用于评估分类,定位和检测任务的数据。 第 2 章,“图像分类”详细讨论了分类数据集。 与分类数据类似,定位任务有 1,000 个类别。 准确是根据前五次检测得出的。 所有图像中至少会有一个边界框。 有 470,000 张图像的检测问题有 200 个对象,每个图像平均有 1.1 个对象。
# PASCAL VOC 挑战
PASCAL VOC 挑战赛于 2005 年至 2012 年进行。该挑战赛被认为是对象检测技术的基准。 数据集中有 20 个类别。 该数据集包含用于训练和验证的 11,530 张图像,以及针对兴趣区域的 27,450 条注释。 以下是数据集中存在的二十个类:
PASCAL VOC 挑战赛于 2005 年至 2012 年进行。该挑战赛被认为是对象检测技术的基准。 数据集中有 20 个类别。 该数据集包含用于训练和验证的 11,530 张图像,以及针对兴趣区域的 27,450 条标注。 以下是数据集中存在的二十个类:
* 人: 人
* 动物: 鸟,猫,牛,狗,马,绵羊
* 车辆: 飞机,自行车,轮船,公共汽车,汽车,摩托车,火车
* 车辆: 飞机,自行车,轮船,公共汽车,汽车,摩托车,训练
* 室内: 水壶,椅子,餐桌,盆栽,沙发,电视/显示器
您可以从[这里](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar)下载数据集。 每个图像平均有 2.4 个对象。
# COCO 对象检测挑战
**上下文中的通用对象****COCO**)数据集具有 200,000 张图像,其中 80 个类别的注释超过 500,000 个。 它是最广泛的公开可用的对象检测数据库。 下图显示了数据集中存在的对象的列表:
**上下文中的通用对象****COCO**)数据集具有 200,000 张图像,其中 80 个类别的标注超过 500,000 个。 它是最广泛的公开可用的对象检测数据库。 下图显示了数据集中存在的对象的列表:
![](img/277bcdb3-8b17-4c4a-829a-e79e857a354c.png)
每个图像的平均对象数为 7.2。 这些是对象检测挑战的著名数据集。 接下来,我们将学习如何针对这些数据集评估法。
每个图像的平均对象数为 7.2。 这些是对象检测挑战的著名数据集。 接下来,我们将学习如何针对这些数据集评估法。
# 使用指标评估数据集
指标对于深度学习任务中的理解至关重要。 由于人工注释,对象检测和定位的度量是特殊的。 人类可能已经注释了一个名为**真实情况**的框。 真实性不一定是绝对真理。 此外,盒子的像素可能因人而异。 因此,算法很难检测到人类绘制的确切边界框。 **交并比****IoU**)用于评估定位任务。 **平均精确度平均值****mAP**)用于评估检测任务。 我们将在下一部分中看到指标的描述。
指标对于深度学习任务中的理解至关重要。 由于人工标注,对象检测和定位的度量是特殊的。 人类可能已经标注了一个名为**真实情况**的框。 真实性不一定是绝对真理。 此外,盒子的像素可能因人而异。 因此,算法很难检测到人类绘制的确切边界框。 **交并比****IoU**)用于评估定位任务。 **平均精确度平均值****mAP**)用于评估检测任务。 我们将在下一部分中看到指标的描述。
# 交并比
......@@ -96,7 +96,7 @@ def calculate_iou(gt_bb, pred_bb):
# 平均精度均值
mAP 用于评估检测算法。 mAP 度量是检测到的边界框的精度和召回率的乘积。 mAP 值的范围是 0 到 100。数字越大,则越好。 可以通过分别为每个类别计算**平均精度****AP**),然后计算该类别的平均值来计算 mAP。 仅当 mAP 高于 0.5 时,检测结果才被视为真正的阳性。 通过绘制每个类别的绘制精度/召回曲线,可以合并来自测试图像的所有检测。 曲线下的最终区域可用于算法比较。 mAP 是衡量网络灵敏度的一种很好的方法,同时不会引发很多错误警报。 我们已经了解了数据集的评估法。 接下来,我们将研究定位任务的算法。
mAP 用于评估检测算法。 mAP 度量是检测到的边界框的精度和召回率的乘积。 mAP 值的范围是 0 到 100。数字越大,则越好。 可以通过分别为每个类别计算**平均精度****AP**),然后计算该类别的平均值来计算 mAP。 仅当 mAP 高于 0.5 时,检测结果才被视为真正的阳性。 通过绘制每个类别的绘制精度/召回曲线,可以合并来自测试图像的所有检测。 曲线下的最终区域可用于算法比较。 mAP 是衡量网络灵敏度的一种很好的方法,同时不会引发很多错误警报。 我们已经了解了数据集的评估法。 接下来,我们将研究定位任务的算法。
# 定位算法
......@@ -117,7 +117,7 @@ mAP 用于评估检测算法。 mAP 度量是检测到的边界框的精度和
比例空间是使用各种大小的图像的概念。 图像会缩小为较小的尺寸,因此可以在相同尺寸的窗口中检测到较大的对象。 可以使用减小的尺寸将图像调整为某些尺寸。 通过删除替代像素或插值来调整图像大小可能会留下一些伪像。 因此,图像被平滑并迭代调整大小。 通过平滑和调整大小获得的图像是比例空间。
窗口在每个刻度上滑动以定位对象。 运行多个比例相当于使用更大的窗口运行图像。 在多个规模上运行的计算复杂度很高。 可以通过以准确为代价进行快速移动来加快定位速度。 复杂性使解决方案无法在生产中使用。 滑动窗口的思想可以通过完全卷积的滑动窗口实现而变得高效。
窗口在每个刻度上滑动以定位对象。 运行多个比例相当于使用更大的窗口运行图像。 在多个规模上运行的计算复杂度很高。 可以通过以准确为代价进行快速移动来加快定位速度。 复杂性使解决方案无法在生产中使用。 滑动窗口的思想可以通过完全卷积的滑动窗口实现而变得高效。
# 将全连接层训练为卷积层
......@@ -149,7 +149,7 @@ logits = tf.reshape(logits, [-1, 10])
思考定位的一种基本方法是将问题建模为回归问题。 边界框是四个数字,因此可以通过回归设置以直接方式进行预测。 我们还需要预测标签,这是一个分类问题。
有不同的参数化可用于定义边界框。 边界框通常有四个数字。 表示形式之一是坐标的中心以及边界框的高度和宽度。 通过删除全连接层并用回归编码器替换它,可以使用预训练的模型。 必须使用 L2 损失对回归进行正则化,而 L2 损失在异常值方面表现不佳。 L1 的损失比 L1 好。 用平滑化的正则化交换回归更好。 对模型进行微调可提供良好的准确性,而对整个网络进行训练只会带来微不足道的表现改善。 在训练时间和准确性之间进行权衡。 接下来,我们将看到使用卷积网络进行回归的不同应用。
有不同的参数化可用于定义边界框。 边界框通常有四个数字。 表示形式之一是坐标的中心以及边界框的高度和宽度。 通过删除全连接层并用回归编码器替换它,可以使用预训练的模型。 必须使用 L2 损失对回归进行正则化,而 L2 损失在异常值方面表现不佳。 L1 的损失比 L1 好。 用平滑化的正则化交换回归更好。 对模型进行微调可提供良好的准确率,而对整个网络进行训练只会带来微不足道的表现改善。 在训练时间和准确率之间进行权衡。 接下来,我们将看到使用卷积网络进行回归的不同应用。
# 将回归应用于其他问题
......@@ -207,7 +207,7 @@ Girshick 等人提出的 [Fast R-CNN](https://arxiv.org/pdf/1504.08083.pdf) 方
# Faster R-CNN
Ren 等人提出了 [Faster R-CNN](https://arxiv.org/pdf/1506.01497.pdf)。 Faster R-CNN 和 Fast R-CNN 方法之间的区别在于,Faster R-CNN 使用诸如 VGG 和 Inception 等架构的 CNN 特征来提案而不是选择性搜索。 CNN 特征进一步通过区域提议网络传递。 滑动窗口通过具有潜在边界框和分数的要素传递,并输出一些直观的长宽比,模型输出边界框和分数:
Ren 等人提出了 [Faster R-CNN](https://arxiv.org/pdf/1506.01497.pdf)。 Faster R-CNN 和 Fast R-CNN 方法之间的区别在于,Faster R-CNN 使用诸如 VGG 和 Inception 等架构的 CNN 特征来提案而不是选择性搜索。 CNN 特征进一步通过区域提议网络传递。 滑动窗口通过具有潜在边界框和分数的特征传递,并输出一些直观的长宽比,模型输出边界框和分数:
![](img/ea103e8f-b553-4d9d-89cd-077888fb7db0.png)
......@@ -217,7 +217,7 @@ Ren 等人提出了 [Faster R-CNN](https://arxiv.org/pdf/1506.01497.pdf)。 Fast
# 单发多框探测器
SSD(单发多框)是所有方法中最快的。 此方法同时预测对象并找到边界框。 在训练期间,可能会有很多负面因素,因此很难否定地挖掘班级失衡。 CNN 的输出具有各种大小的特征。 这些被传递到`3x3`卷积过滤器以预测边界框。
SSD(单发多框)是所有方法中最快的。 此方法同时预测对象并找到边界框。 在训练期间,可能会有很多负面因素,因此很难否定地挖掘类别失衡。 CNN 的输出具有各种大小的特征。 这些被传递到`3x3`卷积过滤器以预测边界框。
此步骤将预测对象和边界框:
......@@ -229,7 +229,7 @@ SSD(单发多框)是所有方法中最快的。 此方法同时预测对象
# 对象检测 API
Google 发布了经过预先训练的模型,并在`COCO`数据集上对各种算法进行了训练,以供公众使用。 该 API 建立在 TensorFlow 之上,旨在用于构建,训练和部署对象检测模型。 这些 API 支持对象检测和定位任务。 预训练模型的可用性可对新数据进行微调,从而加快训练速度。 这些不同的模型在速度和准确之间进行权衡。
Google 发布了经过预先训练的模型,并在`COCO`数据集上对各种算法进行了训练,以供公众使用。 该 API 建立在 TensorFlow 之上,旨在用于构建,训练和部署对象检测模型。 这些 API 支持对象检测和定位任务。 预训练模型的可用性可对新数据进行微调,从而加快训练速度。 这些不同的模型在速度和准确之间进行权衡。
# 安装与配置
......@@ -305,7 +305,7 @@ tar -xzvf ssd_mobilenet_v1_coco_11_06_2017.tar.gz
`Chapter04`文件夹中将包含各种文件,这些文件在此处列出:
* 这是图的原始定义-`graph.pbtxt`
* 这是图的原始定义-`graph.pbtxt`
* 图的权重已冻结,可以用于推断-`frozen_inference_graph.pb`
* 检查点文件
* `model.ckpt.data-00000-of-00001`
......@@ -320,14 +320,14 @@ tar -xzvf ssd_mobilenet_v1_coco_11_06_2017.tar.gz
# Pet 数据集的数据准备
本示例使用`Oxford-IIIT Pet`数据集。 使用这些命令从`Chapter04`目录下载图像和注释
本示例使用`Oxford-IIIT Pet`数据集。 使用这些命令从`Chapter04`目录下载图像和标注
```py
wget http://www.robots.ox.ac.uk/~vgg/data/pets/daimg.tar.gz
wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz
```
提取图像和注释,如下所示:
提取图像和标注,如下所示:
```py
tar -xvf images.tar.gz
......@@ -375,7 +375,7 @@ eval_input_reader: {
}
```
保存`config`文件。 文件中有各种参数会影响模型的准确
保存`config`文件。 文件中有各种参数会影响模型的准确
# 训练模型
......@@ -390,9 +390,9 @@ PYTHONPATH=.:./slim/. python object_detection/train.py \
训练将从大约 140 的损失开始,并将持续减少。 训练将永远进行,必须使用`Ctrl + C`命令手动将其终止。 训练期间创建的检查点可在以后用于推理。
# 使用 TensorBoard 监控损失和准确
# 使用 TensorBoard 监控损失和准确
训练损失和准确可以使用 TensorBoard 进行监视。 使用以下命令运行 TensorBoard:
训练损失和准确可以使用 TensorBoard 进行监视。 使用以下命令运行 TensorBoard:
```py
tensorboard --logdir=/home/ubuntu/Chapter04
......
......@@ -58,7 +58,7 @@
# 数据集
第 4 章,“对象检测”中提到的`PASCAL``COCO`数据集也可以用于分割任务。 注释是不同的,因为它们是按像素标记的。 新算法通常以`COCO`数据集为基准。 `COCO`还具有诸如草,墙和天空之类的东西数据集。 像素精度属性可用作评估算法的指标。
第 4 章,“对象检测”中提到的`PASCAL``COCO`数据集也可以用于分割任务。 标注是不同的,因为它们是按像素标记的。 新算法通常以`COCO`数据集为基准。 `COCO`还具有诸如草,墙和天空之类的东西数据集。 像素精度属性可用作评估计法的指标。
除了上面提到的那些以外,在医学影像和卫星影像领域还有其他几个数据集。 这里提供了指向其中一些链接的供您参考:
......@@ -72,7 +72,7 @@
* <https://www.iarpa.gov/challenges/fmow.html>
* <https://www.kaggle.com/c/planet-understanding-the-amazon-from-space>
为分割任务创建训练数据非常昂贵。 有在线工具可用于注释数据集。 麻省理工学院(**MIT**)提供的 **LabelMe** 移动应用非常适合注释,可以从[这里](http://labelme.csail.mit.edu/Release3.0)下载。
为分割任务创建训练数据非常昂贵。 有在线工具可用于标注数据集。 麻省理工学院(**MIT**)提供的 **LabelMe** 移动应用非常适合标注,可以从[这里](http://labelme.csail.mit.edu/Release3.0)下载。
# 语义分割算法
......@@ -88,7 +88,7 @@
# SegNet 架构
**SegNet** 具有编码器和解码器方法。 编码器具有各种卷积层,而解码器具有各种解卷积层。 SegNet 改进了 FCN 产生的粗略输出。 因此,它的内存占用较少。 当特征尺寸减小时,通过反卷积将其再次上采样至图像大小,从而反转了卷积效果。 反卷积学习用于上采样的参数。 由于池层中信息的丢失,这种架构的输出将很粗糙。
**SegNet** 具有编码器和解码器方法。 编码器具有各种卷积层,而解码器具有各种解卷积层。 SegNet 改进了 FCN 产生的粗略输出。 因此,它的内存占用较少。 当特征尺寸减小时,通过反卷积将其再次上采样至图像大小,从而反转了卷积效果。 反卷积学习用于上采样的参数。 由于池层中的信息丢失,这种架构的输出将很粗糙。
![](img/0bca20d8-04c9-48cb-8029-e8af3258c09f.png)
......@@ -237,7 +237,7 @@ RefiNet 使用编码器,然后使用解码器。 CNN 的编码器输出。 解
# PSPnet
[Zhoa 等人介绍的 PSPnet 中使用了全局内容](https://arxiv.org/pdf/1612.01105.pdf)。 方法是增加池化层的内核大小。 汇集以金字塔的方式进行。 金字塔同时覆盖图像的各个部分和大小。 架构之间存在损失,因此无法进行适当的监管。
[Zhoa 等人介绍的 PSPnet 中使用了全局内容](https://arxiv.org/pdf/1612.01105.pdf)。 方法是增加池化层的内核大小。 池化以金字塔的方式进行。 金字塔同时覆盖图像的各个部分和大小。 架构之间存在损失,因此无法进行适当的监管。
![](img/1a1c9433-d75c-4c5d-add8-1a1c9fc9ec8b.png)
......@@ -263,7 +263,7 @@ RefiNet 使用编码器,然后使用解码器。 CNN 的编码器输出。 解
经 Chen 等人许可复制。
我们已经看到了几种架构可以使用深度学习提高图像分割的准确。 接下来,我们将看到在医学成像中的应用。
我们已经看到了几种架构可以使用深度学习提高图像分割的准确。 接下来,我们将看到在医学成像中的应用。
# 超神经分割
......
# 六、相似性学习
在本章中,我们将学习相似性学习并学习相似性学习中使用的各种损失函数。 当每个班级的数据集都很小时,相似性学习对我们很有用。 我们将了解可用于人脸分析的不同数据集,并建立用于人脸识别,界标检测的模型。 我们将在本章介绍以下主题:
在本章中,我们将学习相似性学习并学习相似性学习中使用的各种损失函数。 当每个类别的数据集都很小时,相似性学习对我们很有用。 我们将了解可用于人脸分析的不同数据集,并建立用于人脸识别,界标检测的模型。 我们将在本章介绍以下主题:
* 相似性学习的不同算法
* 用于相似度学习的各种损失函数
......@@ -70,7 +70,7 @@ right_bottleneck = get_model(right_input)
dense_layer_bottleneck = tf.concat([left_bottleneck, right_bottleneck], 1)
```
接下来,添加一个辍学层,并从级联层中计算出对率。 然后,该过程类似于任何其他网络,如下所示:
接下来,添加一个丢弃层,并从级联层中计算出对率。 然后,该过程类似于任何其他网络,如下所示:
```py
dropout_bool = tf.placeholder(tf.bool)
......@@ -195,7 +195,7 @@ def mine_triplets(anchor, targets, negative_samples):
# DeepNet 模型
DeepNet 模型用于学习用于人脸验证任务(例如 FaceNet)的人脸嵌入。 这是对上一部分中讨论的 FaceNet 方法的改进。 它需要对同一张脸进行多次裁剪,并通过多个编码器才能获得更好的嵌入效果。 与 FaceNet 相比,此方法具有更高的准确,但需要更多时间进行处理。 人脸裁切在相同区域进行,并通过其各自的编码器。 然后将所有层连接起来以进行三元组损失的训练。
DeepNet 模型用于学习用于人脸验证任务(例如 FaceNet)的人脸嵌入。 这是对上一部分中讨论的 FaceNet 方法的改进。 它需要对同一张脸进行多次裁剪,并通过多个编码器才能获得更好的嵌入效果。 与 FaceNet 相比,此方法具有更高的准确,但需要更多时间进行处理。 人脸裁切在相同区域进行,并通过其各自的编码器。 然后将所有层连接起来以进行三元组损失的训练。
# DeepRank
......@@ -250,18 +250,18 @@ Wang 等人提出的 [DeepRank](https://users.eecs.northwestern.edu/~jwa368/pdfs
# 人脸标志和属性
人脸标志是人脸的空间点。 空间点对应于各种人脸特征的位置,例如眼睛,眉毛,鼻子,嘴巴和下巴。 点数可能会从 5 到 78 不等,具体取决于注释。 人脸界标也称为**基准点****人脸关键点****人脸姿势**。 人脸标志具有许多应用,如下所示:
人脸标志是人脸的空间点。 空间点对应于各种人脸特征的位置,例如眼睛,眉毛,鼻子,嘴巴和下巴。 点数可能会从 5 到 78 不等,具体取决于标注。 人脸界标也称为**基准点****人脸关键点****人脸姿势**。 人脸标志具有许多应用,如下所示:
* 更好地进行人脸验证或识别的人脸对齐
* 跟踪视频中的人脸
* 测量人脸表情或情感
* 有助于诊断疾病
接下来,我们将看到一些带有基准点注释的数据库。
接下来,我们将看到一些带有基准点标注的数据库。
# 多任务人脸标志(MTFL)数据集
`MTFL`数据集由 Zhang 等人提出。 并带有五个人脸标志以及性别,微笑,眼镜和头部姿势注释。 数据库中存在 12,995 张人脸。 可以从[这里](http://mmlab.ie.cuhk.edu.hk/projects/TCDCN/data/MTFL.zip)下载`MTFL`
`MTFL`数据集由 Zhang 等人提出。 并带有五个人脸标志以及性别,微笑,眼镜和头部姿势标注。 数据库中存在 12,995 张人脸。 可以从[这里](http://mmlab.ie.cuhk.edu.hk/projects/TCDCN/data/MTFL.zip)下载`MTFL`
这是`MTFL`中存在的图像的示例:
......@@ -269,7 +269,7 @@ Wang 等人提出的 [DeepRank](https://users.eecs.northwestern.edu/~jwa368/pdfs
由张等人提出。 并转载自[这里](http://mmlab.ie.cuhk.edu.hk/projects/TCDCN/img/1.jpg)
人脸在年龄,照度,情感等方面有很多变化。 **头部姿势**是人脸方向的角度,以度为单位。 眼镜,微笑,性别属性等都用二进制标签注释
人脸在年龄,照度,情感等方面有很多变化。 **头部姿势**是人脸方向的角度,以度为单位。 眼镜,微笑,性别属性等都用二元标签标注
# Kaggle 关键点数据集
......@@ -283,7 +283,7 @@ Zhang 等人提出的`MAFL`数据集。 带有 5 种具有 40 种不同人脸属
由 Liu 等人提出。 并转载自[这里](http://mmlab.ie.cuhk.edu.hk/projects/celeba/overview.png)
注释的属性包括尖头,带子,小胡子,卷发,戴帽子等。 这些图像也包含在`CelebA`数据集中,稍后将详细讨论。
标注的属性包括尖头,带子,小胡子,卷发,戴帽子等。 这些图像也包含在`CelebA`数据集中,稍后将详细讨论。
# 学习人脸关键点
......@@ -407,7 +407,7 @@ for batch_no in range(total_batches):
# 野生(LFW)数据集中的带标签的人脸
`LFW`数据集包含 13,233 张人脸和 5,749 位独特的人,被视为评估人脸验证数据集的标准数据集。 精度度量可用于评估法。 可以在[这个链接](http://vis-www.cs.umass.edu/lfw/)中访问数据集。
`LFW`数据集包含 13,233 张人脸和 5,749 位独特的人,被视为评估人脸验证数据集的标准数据集。 精度度量可用于评估法。 可以在[这个链接](http://vis-www.cs.umass.edu/lfw/)中访问数据集。
# YouTube 人脸数据集
......@@ -415,11 +415,11 @@ YouTube `faces`数据集包含 3,425 个视频剪辑,其中包含 1,595 个独
# CelebFaces 属性数据集(CelebA)
`CelebA` 数据集带有人物身份以及 5 个人脸标志和 40 个属性的注释。 数据库中有 10,177 位独特的人,拥有 202,599 张人脸图像。 它是可用于人脸验证,检测,界标和属性识别问题的大型数据集之一。 图像具有带有各种注释的良好人脸变化。 可以在[这个链接](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)中访问数据集。
`CelebA` 数据集带有人物身份以及 5 个人脸标志和 40 个属性的标注。 数据库中有 10,177 位独特的人,拥有 202,599 张人脸图像。 它是可用于人脸验证,检测,界标和属性识别问题的大型数据集之一。 图像具有带有各种标注的良好人脸变化。 可以在[这个链接](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)中访问数据集。
# CASIA 网络人脸数据库
`CASIA`数据集带有 1 个 0,575 个独特的人注释,总共有 494,414 张图像。 该数据集可以从[这个链接](http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html)获得。 这是可用于人脸验证和识别问题的第二大公共数据集。
`CASIA`数据集带有 10,575 个独特的带标注人脸,总共有 494,414 张图像。 该数据集可以从[这个链接](http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html)获得。 这是可用于人脸验证和识别问题的第二大公共数据集。
# VGGFace2 数据集
......
......@@ -62,7 +62,7 @@
复制自 Isola 等人
带有标签的图可以转换为逼真的图像以用于创意目的。 黑白图像可以转换为彩色图像。 这样的翻译对于照片编辑应用,为旧电影着色,服装设计等非常有用。
带有标签的图可以转换为逼真的图像以用于创意目的。 黑白图像可以转换为彩色图像。 这样的翻译对于照片编辑应用,为旧电影着色,服装设计等非常有用。
# 文本到图像的生成
......@@ -296,7 +296,7 @@ Current loss value: 3.66387653351
# 使用 Gram 矩阵的样式损失
创建具有原始图像内容的图像后,我们将看到如何仅使用样式创建图像。 样式可以认为是图像颜色和纹理的混合。 为此,我们将定义样式失。 首先,我们将覆盖图像并将其转换为数组,如以下代码所示:
创建具有原始图像内容的图像后,我们将看到如何仅使用样式创建图像。 样式可以认为是图像颜色和纹理的混合。 为此,我们将定义样式失。 首先,我们将覆盖图像并将其转换为数组,如以下代码所示:
```py
style_image = Image.open(work_dir + 'starry_night.png')
......@@ -334,7 +334,7 @@ layers_model = Model(model.input, layers)
targs = [K.variable(o) for o in layers_model.predict(style_arr)]
```
使用 **Gram 矩阵**计算样式损失。 革兰氏矩阵是矩阵及其转置的乘积。 激活值可以简单地转置和相乘。 然后将此矩阵用于计算样式和随机图像之间的误差。 矩阵会丢失位置信息,但会保留纹理信息。 我们将使用以下代码定义 Gram 矩阵:
使用 **Gram 矩阵**计算样式损失。 革兰氏矩阵是矩阵及其转置的乘积。 激活值可以简单地转置和相乘。 然后将此矩阵用于计算样式和随机图像之间的误差。 Gram 矩阵会丢失位置信息,但会保留纹理信息。 我们将使用以下代码定义 Gram 矩阵:
```py
def grammian_matrix(matrix):
......@@ -552,7 +552,7 @@ def dense_layer(input_layer,
return layer
```
现在,我们将定义一个生成器,该生成器将噪声作为输入并变为图像。 发生器由几个全连接层组成,然后是转置卷积层以对噪声进行上采样。 最后,提出了卷积层以使噪声成为单个通道。 每层之间都有批量归一化层,以使梯度平滑流动。 我们将使用以下代码定义生成器:
现在,我们将定义一个生成器,该生成器将噪声作为输入并变为图像。 生成器由几个全连接层组成,然后是转置卷积层以对噪声进行上采样。 最后,提出了卷积层以使噪声成为单个通道。 每层之间都有批量归一化层,以使梯度平滑流动。 我们将使用以下代码定义生成器:
```py
def get_generator(input_noise, is_training=True):
......
# 九、视频分类
在本章中,我们将看到如何训练视频数据的深度学习模型。 我们将开始按帧对视频进行分类。 然后,我们将使用时间信息以获得更好的准确。 稍后,我们将图像的应用扩展到视频,包括姿势估计,字幕和生成视频。
在本章中,我们将看到如何训练视频数据的深度学习模型。 我们将开始按帧对视频进行分类。 然后,我们将使用时间信息以获得更好的准确。 稍后,我们将图像的应用扩展到视频,包括姿势估计,字幕和生成视频。
在本章中,我们将涵盖的以下主题:
......@@ -32,7 +32,7 @@
[来源](http://crcv.ucf.edu/data/UCF101/Number%20of%20Videos%202.jpg)
所有 101 个动作都分为五种类型的动作,如下所示:人与对象的交互,身体动作,人与人的交互,演奏乐器和运动。 数据集和注释可从[这里](http://crcv.ucf.edu/data/UCF101.php)下载。
所有 101 个动作都分为五种类型的动作,如下所示:人与对象的交互,身体动作,人与人的交互,演奏乐器和运动。 数据集和标注可从[这里](http://crcv.ucf.edu/data/UCF101.php)下载。
接下来,我们将了解 YouTube-8M 数据集。
......@@ -57,7 +57,7 @@
还有更多的数据集可用于视频分类问题。 以下是更多数据集的详细信息:
* **Sports-1M**:拥有 1,133,158 个具有 487 个课程的视频。 注释是自动完成的。 [数据集可以从以下位置下载](http://cs.stanford.edu/people/karpathy/deepvideo/)
* **Sports-1M**:拥有 1,133,158 个具有 487 个类别的视频。 标注是自动完成的。 [数据集可以从以下位置下载](http://cs.stanford.edu/people/karpathy/deepvideo/)
* **UCF-11****佛罗里达大学-11**):拥有 1,600 部视频,包含 11 动作。 视频的速度为 29.97 fps(每秒帧数)。 数据集可以与`UCF101`一起下载。
* **HMDB-51****人体运动数据库-51**):包含 5,100 个具有 51 个动作的视频。 [数据集在这里](http://serre-lab.clps.brown.edu/resource/hmdb-a-large-human-motion-database)
* **Hollywood2**:拥有 12 个动作的 1,707 个视频。 [数据集在这里](http://www.di.ens.fr/~laptev/actions/hollywood2)
......@@ -90,7 +90,7 @@ frame_no = 0 while True:
* 在整个视频上训练 **3D 卷积**网络。 3D 卷积是 2D 卷积的扩展; 我们将在以下各节中详细了解 3D 卷积的工作原理。
* 使用视频的**光流**可以进一步提高精度。 光流是对象运动的模式,我们将在接下来的部分中详细介绍。
我们将看到几种算法,它们在各种计算复杂性上都具有良好的准确。 可以通过将数据集转换为帧并将其子采样为相同的长度来准备它。 一些预处理会有所帮助,例如减去 Imagenet 的均值。
我们将看到几种算法,它们在各种计算复杂性上都具有良好的准确。 可以通过将数据集转换为帧并将其子采样为相同的长度来准备它。 一些预处理会有所帮助,例如减去 Imagenet 的均值。
# 为视频分类融合并行 CNN
......@@ -124,7 +124,7 @@ logits = dense_layer(dense_layer_bottleneck, no_classes)
转自 Karpathy 等人
可以在不同的时间观看视频,而不是通过固定大小的剪辑。 在前面的图像中介绍了连接时间信息的三种方式。 后期融合需要更长的时间框架,而早期融合则需要几个帧。 慢速融合将后期融合和早期融合结合在一起,可获得良好效果。 该模型在`Sports1M`数据集上进行了训练,该数据集具有 487 个类别,并达到了 50% 的准确。 将同一模型应用于`UCF101`时,可达到 60% 的精度。
可以在不同的时间观看视频,而不是通过固定大小的剪辑。 在前面的图像中介绍了连接时间信息的三种方式。 后期融合需要更长的时间框架,而早期融合则需要几个帧。 慢速融合将后期融合和早期融合结合在一起,可获得良好效果。 该模型在`Sports1M`数据集上进行了训练,该数据集具有 487 个类别,并达到了 50% 的准确。 将同一模型应用于`UCF101`时,可达到 60% 的精度。
# 长时间视频的分类
......@@ -287,7 +287,7 @@ net.compile(loss=tf.keras.losses.categorical_crossentropy,
转自 Sharma 等人。
每个 **LSTM** 堆栈都会预测位置和标签。 每个堆栈具有三个 **LSTM****LSTM** 堆栈的输入是卷积特征立方体和位置。 位置概率是注意权重。 注意的使用提高了准确性以及可视化预测的方法。
每个 **LSTM** 栈都会预测位置和标签。 每个栈具有三个 **LSTM****LSTM** 栈的输入是卷积特征立方体和位置。 位置概率是注意权重。 注意的使用提高了准确率以及可视化预测的方法。
我们已经看到了各种视频分类方法。 接下来,我们将学习视频中的其他应用。
......@@ -299,7 +299,7 @@ net.compile(loss=tf.keras.losses.categorical_crossentropy,
人体姿势估计是视频数据的重要应用,可以改善其他任务,例如动作识别。 首先,让我们看一下可用于姿势估计的数据集的描述:
* **PosesInTheWild** 数据集:包含 30 个带有人体姿势注释的视频。 [数据集在这里](https://lear.inrialpes.fr/research/posesinthewild/)。 该数据集带有人类上半身关节的注释
* **PosesInTheWild** 数据集:包含 30 个带有人体姿势标注的视频。 [数据集在这里](https://lear.inrialpes.fr/research/posesinthewild/)。 该数据集带有人类上半身关节的标注
* **电影院中标记的帧****FLIC**):从 30 部电影中获得的人体姿势数据集,[可在以下位置找到](https://bensapp.github.io/flic-dataset.html)
[Pfister 等人](https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Pfister_Flowing_ConvNets_for_ICCV_2015_paper.pdf)提出了一种预测视频中人体姿势的方法。 以下是回归人体姿势的流水线:
......@@ -336,7 +336,7 @@ net.compile(loss=tf.keras.losses.categorical_crossentropy,
* **微软研究 - 视频转文本****MSR-VTT**)具有 200,000 个视频剪辑和句子对。 [可以从以下网站获取更多详细信息](https://www.microsoft.com/en-us/research/publication/msr-vtt-a-large-video-description-dataset-for-bridging-video-and-language/)
* **MPII 电影描述语料库****MPII-MD**[可以从以下网站获取](https://www.mpi-inf.mpg.de/departments/computer-vision-and-multimodal-computing/research/vision-and-language/mpii-movie-description-dataset)。 它有 68,000 个句子和 94 部电影。
* **蒙特利尔视频注释数据集****M-VAD**[可从以下网站获得](https://mila.quebec/en/publications/public-datasets/m-vad/)。它有 49,000 个剪辑。
* **蒙特利尔视频标注数据集****M-VAD**[可从以下网站获得](https://mila.quebec/en/publications/public-datasets/m-vad/)。它有 49,000 个剪辑。
* **YouTube2Text** 包含 1,970 个视频,包含 80,000 个描述。
[姚等人](https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Yao_Describing_Videos_by_ICCV_2015_paper.pdf)提出了一种为视频添加字幕的方法。 经过训练以进行动作识别的 3D 卷积网络用于提取局部时间特征。 然后在特征上使用注意力机制以使用 RNN 生成文本。 该过程如下所示:
......
......@@ -12,7 +12,7 @@
# 模型表现
性能对于深度学习模型的训练和部署都很重要。 由于大数据或大模型架构,训练通常需要更多时间。 结果模型可能更大,因此在 RAM 受限的移动设备中使用时会出现问题。 更多的计算时间导致更多的基础架构成本。 推理时间在视频应用中至关重要。 由于前面提到了性能的重要性,因此在本节中,我们将研究提高性能的技术。 降低模型复杂度是一个简单的选择,但会导致精度降低。 在这里,我们将重点介绍一些方法,这些方法可以提高性能,而准确却没有明显的下降。 在下一节中,我们将讨论量化选项。
性能对于深度学习模型的训练和部署都很重要。 由于大数据或大模型架构,训练通常需要更多时间。 结果模型可能更大,因此在 RAM 受限的移动设备中使用时会出现问题。 更多的计算时间导致更多的基础架构成本。 推理时间在视频应用中至关重要。 由于前面提到了性能的重要性,因此在本节中,我们将研究提高性能的技术。 降低模型复杂度是一个简单的选择,但会导致精度降低。 在这里,我们将重点介绍一些方法,这些方法可以提高性能,而准确却没有明显的下降。 在下一节中,我们将讨论量化选项。
# 量化模型
......@@ -64,7 +64,7 @@ MobileNets 已显示,可以在移动和嵌入式设备上使用的精度有所
# AWS
Amazon Web Services(AWS)将支持扩展到基于 TensorFlow 的模型的开发和部署。 在 [Amazon](https://aws.amazon.com/) 上注册 AWS,然后选择 **Amazon 机器映像****AMI**)之一。 AMI 是安装了所有必需软件的计算机的映像。 您不必担心安装软件包。 **AWS 提供了深度学习 AMI****DLAMI**),以简化训练和部署深度学习模型。 有几种选择。 在这里,我们将使用 Conda,因为它带有运行 TensorFlow 所需的几个软件包。 Python 有两个选项:版本 2 和版本 3。以下代码将在 CUDA 8 的 Python 3 上使用 Keras 2 激活 TensorFlow:
Amazon Web Services(AWS)将支持扩展到基于 TensorFlow 的模型的开发和部署。 在 [Amazon](https://aws.amazon.com/) 上注册 AWS,然后选择 **Amazon 机器映像****AMI**)之一。 AMI 是安装了所有必需软件的计算机的映像。 您不必担心安装包。 **AWS 提供了深度学习 AMI****DLAMI**),以简化训练和部署深度学习模型。 有几种选择。 在这里,我们将使用 Conda,因为它带有运行 TensorFlow 所需的几个包。 Python 有两个选项:版本 2 和版本 3。以下代码将在 CUDA 8 的 Python 3 上使用 Keras 2 激活 TensorFlow:
```py
source activate tensorflow_p36
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册