提交 1fb42313 编写于 作者: W wizardforcel

2020-12-14 22:55:52

上级 cddd8dec
......@@ -195,11 +195,11 @@ nb_iterations = int(nb_samples / batch_size)
* 批量标准化和 LReLU 激活(当输入值为负时,性能更高;实际上,当`x < 0`时,标准 ReLU 的梯度为零,而 LReLU 的常数较小) 允许稍微修改的渐变)
* 带有`(2, 2)`步幅,相同填充和线性输出的 512 个`4×4`滤波器的 2D 卷积
* 批量标准化和泄漏的 ReLU 激活
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同 填充,以及线性输出
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 128 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)` 相同 填充,以及线性输出
* 具有 128 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 1 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同的 填充,以及双曲正切输出
* 具有 1 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及双曲正切输出
以下代码段显示了生成器的代码:
......@@ -252,14 +252,14 @@ def generator(z, is_training=True):
判别器的 DAG 基于以下对称结构:
* 具有`(2, 2)`步幅的 128`4×4`个滤波器的 2D 卷积,,相同的 填充,以及泄漏的 ReLU 输出
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同 填充,以及线性输出
* 具有`(2, 2)`步幅的 128`4×4`个滤波器的 2D 卷积,相同填充,以及泄漏的 ReLU 输出
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同 填充,以及线性输出
* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 1,024`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同的 填充,以及线性输出
* 具有 1,024`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 1 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)` 有效 填充,以及线性输出(预期输出为 sigmoid,可以表示一个概率,但是我们将直接在损失函数内部执行此变换)
* 具有 1 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)`有效填充,以及线性输出(预期输出为 sigmoid,可以表示一个概率,但是我们将直接在损失函数内部执行此变换)
判别器的代码为,如下所示:
......@@ -435,7 +435,7 @@ DCGAN 生成的样本人脸
对应于 Olivetti 人之一的原始图片
嘴的结构对于两个生成的样本都是相同的,但是从第二个样本来看,我们可以确认已经从其他样本中提取了许多元素(鼻子,眼睛,前额和方向),从而产生了非 现有的人。 即使模型正常工作,也会出现部分模式崩溃,因为某些面孔(具有其相对属性,例如眼镜)比其他面孔更常见。 相反,一些女性面孔(数据集中的少数)已与男性属性合并,从而产生了样本,例如包含所生成样本的图像的第一行的第二个或底部行的第八个。 作为练习,我邀请读者使用不同的参数和其他数据集(包含灰度和 RGB 图像,例如 Cifar-10 或 STL-10)来重新训练模型。
嘴的结构对于两个生成的样本都是相同的,但是从第二个样本来看,我们可以确认已经从其他样本中提取了许多元素(鼻子,眼睛,前额和方向),从而产生了不存在的人。 即使模型正常工作,也会出现部分模式崩溃,因为某些面孔(具有其相对属性,例如眼镜)比其他面孔更常见。 相反,一些女性面孔(数据集中的少数)已与男性属性合并,从而产生了样本,例如包含所生成样本的图像的第一行的第二个或底部行的第八个。 作为练习,我邀请读者使用不同的参数和其他数据集(包含灰度和 RGB 图像,例如 Cifar-10 或 STL-10)来重新训练模型。
The screenshots that are shown in this and other examples in this chapter are often based on random generations; therefore, in order to increase the reproducibility, I suggest setting both the NumPy and TensorFlow random seed equal to `1000`. The commands are: `np.random.seed(1000)` and `tf.set_random_seed(1000)`.
......@@ -502,15 +502,15 @@ height = X_train.shape[2]
现在,我们可以基于 DCGAN 的同一层定义生成器 DAG,如下所示:
* 具有 1,024 个`4×4`滤波器的 2D 卷积,步幅为`(1, 1)` 有效 填充,以及线性输出
* 具有 1,024 个`4×4`滤波器的 2D 卷积,步幅为`(1, 1)`有效填充,以及线性输出
* 批量标准化和 LReLU 激活
* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同 填充,以及线性输出
* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同 填充,以及线性输出
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 128 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同 填充,以及线性输出
* 具有 128 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 1 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同的 填充,以及双曲正切输出
* 具有 1 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及双曲正切输出
该代码显示在以下代码片段中:
......@@ -561,14 +561,14 @@ def generator(z, is_training=True):
评论者的 DAG 基于以下几组:
* 具有`(2, 2)`步幅的 128`4×4`个滤波器的 2D 卷积,,相同的 填充,以及泄漏的 ReLU 输出
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)` 相同的 填充,以及线性输出
* 具有`(2, 2)`步幅的 128`4×4`个滤波器的 2D 卷积,相同填充,以及泄漏的 ReLU 输出
* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同 填充,以及线性输出
* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 1,024`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,相同的 填充,以及线性输出
* 具有 1,024`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`相同填充,以及线性输出
* 批量标准化和泄漏的 ReLU 激活
* 具有 1 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)` 有效 填充和线性输出
* 具有 1 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)`有效填充和线性输出
相应的代码块为,如下所示:
......
......@@ -18,7 +18,7 @@
5. 性别可以编码为数字特征(例如,一键编码); 因此,我们需要考虑两种可能性。 如果在属性之间不存在性别,而其他特征与性别不相关,则聚类结果是完全合理的。 如果存在性别(作为通用聚类方法)是基于样本之间的相似性的,则 50/50 的结果表示性别不是歧视性特征。 换句话说,给定两个随机选择的样本,它们的相似性不受性别影响(或受到轻微影响),因为其他特征占主导。 例如,在这种特殊情况下,平均分数或年龄有较大的差异,因此它们的影响更大。
6. 我们可以预期会有更紧凑的群体,其中每个主要特征的范围都较小。 例如,一个小组可以包含 13-15 岁的学生,并带有所有可能的分数,依此类推。 另外,我们可以观察基于单个特征的细分(例如年龄,平均分数等)。 最终结果取决于向量的数值结构,距离函数,当然还取决于算法。
7. 如果每个客户均由包含其兴趣摘要的特征向量表示(例如,基于他/她购买或看过的产品),我们可以找到集群分配,检查哪些元素可以表征集群(对于 例如书籍,电影,衣服,特定品牌等),并使用这些信息来推荐潜在产品(即类似用户购买的产品)。 该概念基于在相同集群的成员之间共享信息的主要思想,这要归功于它们的相似性。
7. 如果每个客户均由包含其兴趣摘要的特征向量表示(例如,基于他/她购买或看过的产品),我们可以找到集群分配,检查哪些元素可以表征集群(例如书籍,电影,衣服,特定品牌等),并使用这些信息来推荐潜在产品(即类似用户购买的产品)。 该概念基于在相同集群的成员之间共享信息的主要思想,这要归功于它们的相似性。
......
......@@ -23,7 +23,7 @@
自从 2012 年神经网络取得突破以来,当名为 **AlexNet** 的深层 CNN 模型通过大大降低错误率赢得了年度 ImageNet 视觉识别挑战时,许多计算机视觉和自然语言处理领域的研究人员就开始利用这一优势 深度学习模型的强大功能。 基于深度学习的现代对象检测全部基于 CNN,并建立在诸如 AlexNet,Google Inception 或其他流行的 VGG 网络等预先训练的模型之上。 这些 CNN 通常已经训练了数百万个参数,并且可以将输入图像转换为一组功能,这些功能可以进一步用于诸如上一章中涉及的图像分类以及对象检测以及其他与计算机视觉相关的任务 任务
自从 2012 年神经网络取得突破以来,当名为 **AlexNet** 的深层 CNN 模型通过大大降低错误率赢得了年度 ImageNet 视觉识别挑战时,许多计算机视觉和自然语言处理领域的研究人员就开始利用这一优势 深度学习模型的强大功能。 基于深度学习的现代对象检测全部基于 CNN,并建立在诸如 AlexNet,Google Inception 或其他流行的 VGG 网络等预先训练的模型之上。 这些 CNN 通常已经训练了数百万个参数,并且可以将输入图像转换为一组功能,这些功能可以进一步用于诸如上一章中涉及的图像分类以及对象检测以及其他与计算机视觉相关的任务。
2014 年,提出了一种最新的对象检测器,该对象检测器使用称为 RCNN(具有 CNN 特征的区域)的标记对象检测数据集对 AlexNet 进行了训练,与传统的检测方法相比,它在准确性上有了很大的提高。 RCNN 结合了一种称为区域提议的技术,该技术可生成大约 2,000 个可能的区域候选者,并在每个这些区域上运行 CNN 以进行分类和边界框预测。 然后,将这些结果合并以生成检测结果。 RCNN 的训练过程非常复杂,耗时数天,推理速度也很慢,在 GPU 上的图像上花费了将近一分钟。
......@@ -220,7 +220,7 @@ image_np_expanded = np.expand_dims(image_np, axis=0)
在“在 iOS 中使用对象检测模型”部分,我们将了解如何在 iOS 设备上使用相同的模型并绘制相同的检测结果。
您还可以在前面提到的 Tensorflow 检测模型 Zoo 中测试其他预训练模型。 例如,如果使用`faster_rcnn_inception_v2_coco`模型,将`object_detection_tutorial.ipynb`笔记本中的`MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'`替换为`MODEL_NAME = ' faster_rcnn_inception_v2_coco_2017_11_08'`(可从 TensorFlow 检测模型 Zoo 页面的 URL 或`MODEL_NAME = ' faster_rcnn_resnet101_coco_2017_11_08'`中获得),则可以看到类似内容 其他两个基于 Faster RCNN 的模型的检测结果,但是它们花费的时间更长。
您还可以在前面提到的 Tensorflow 检测模型 Zoo 中测试其他预训练模型。 例如,如果使用`faster_rcnn_inception_v2_coco`模型,将`object_detection_tutorial.ipynb`笔记本中的`MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'`替换为`MODEL_NAME = ' faster_rcnn_inception_v2_coco_2017_11_08'`(可从 TensorFlow 检测模型 Zoo 页面的 URL 或`MODEL_NAME = ' faster_rcnn_resnet101_coco_2017_11_08'`中获得),则可以看到类似于其他两个基于 Faster RCNN 的模型的检测结果的内容,但是它们花费的时间更长。
另外,在两个`faster_rcnn`型号上使用`summarize_graph`工具会在输入和输出上生成相同的信息:
......@@ -229,7 +229,7 @@ Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3])
Found 4 possible outputs: (name=detection_boxes, op=Identity) (name=detection_scores, op=Identity) (name=detection_classes, op=Identity) (name=num_detections, op=Identity)
```
通常,与其他大型的基于 Inception 或 Resnet-CNN 的大型模型相比,基于 MobileNet 的模型速度最快,但准确性较低(mAP 值较小)。 顺便说一下,下载的`ssd_mobilenet_v1_coco, faster_rcnn_inception_v2_coco_2017_11_08``faster_rcnn_resnet101_coco_2017_11_08`文件的大小分别为 76MB,149MB 和 593MB。 稍后我们将看到,在移动设备上,基于 MobileNet 的模型(例如`ssd_mobilenet_v1_coco`)运行速度要快得多,有时,大型模型(例如`faster_rcnn_resnet101_coco_2017_11_08`)只会在较旧的 iPhone 上崩溃。 希望您可以使用基于 MobileNet 的模型,经过重新训练的 MobileNet 模型或将来可以提供更高准确性的`ssd_mobilenet`的将来版本解决问题,尽管`ssd_mobilenet`的 v1 已经足够好 许多用例
通常,与其他大型的基于 Inception 或 Resnet-CNN 的大型模型相比,基于 MobileNet 的模型速度最快,但准确性较低(mAP 值较小)。 顺便说一下,下载的`ssd_mobilenet_v1_coco, faster_rcnn_inception_v2_coco_2017_11_08``faster_rcnn_resnet101_coco_2017_11_08`文件的大小分别为 76MB,149MB 和 593MB。 稍后我们将看到,在移动设备上,基于 MobileNet 的模型(例如`ssd_mobilenet_v1_coco`)运行速度要快得多,有时,大型模型(例如`faster_rcnn_resnet101_coco_2017_11_08`)只会在较旧的 iPhone 上崩溃。 希望您可以使用基于 MobileNet 的模型,经过重新训练的 MobileNet 模型或将来可以提供更高准确性的`ssd_mobilenet`的将来版本解决问题,尽管`ssd_mobilenet`的 v1 在许多用例中已经足够好
......@@ -239,7 +239,7 @@ Found 4 possible outputs: (name=detection_boxes, op=Identity) (name=detection_sc
经过预训练的 TensorFlow 对象检测模型当然可以很好地解决某些问题。 但是有时候,您可能需要使用自己的带注释的数据集(在您特别感兴趣的对象或对象部分周围带有边界框)并重新训练现有模型,以便它可以更准确地检测不同的集合 对象类
经过预训练的 TensorFlow 对象检测模型当然可以很好地解决某些问题。 但是有时候,您可能需要使用自己的带注释的数据集(在您特别感兴趣的对象或对象部分周围带有边界框)并重新训练现有模型,以便它可以更准确地检测不同的对象类别集合
我们将使用 TensorFlow 对象检测 API 网站中记录的相同的 Oxford-IIIT Pets 数据集来重新训练本地计算机上的两个现有模型,而不是使用文档中介绍的 Google Cloud。 必要时,我们还将为每个步骤添加说明。 以下是有关如何使用 Oxford Oxford Pets 数据集重新训练 TensorFlow 对象检测模型的分步指南:
......@@ -292,7 +292,7 @@ label_map_path: "object_detection/data/pet_label_map.pbtxt"
}
```
`faster_rcnn_resnet101_pets.config`文件用于指定模型检查点文件的位置,该文​​件包含模型的训练后权重,在步骤 2 中生成的用于训练和验证的 TFRecords 文件以及要分类的 37 类宠物的标签项 被检测到`object_detection/data/pet_label_map.pbtxt`的第一项和最后一项如下:
`faster_rcnn_resnet101_pets.config`文件用于指定模型检查点文件的位置,该文​​件包含模型的训练后权重,在步骤 2 中生成的用于训练和验证的 TFRecords 文件以及要检测的 37 类宠物的标签项`object_detection/data/pet_label_map.pbtxt`的第一项和最后一项如下:
```py
item {
......@@ -472,7 +472,7 @@ tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a
要在您自己的应用程序中使用库,请执行以下操作:
1. 在 Xcode 中,单击“文件 | 新增 | 项目…”,选择“Single View App”,然后输入 TFObjectDetectionAPI 作为产品名称,然后选择 Objective-C 作为 语言(如果您想使用 Swift,请参阅上一章有关如何将 TensorFlow 添加到基于 Swift 的 iOS 应用并进行此处所示的必要更改),然后选择项目的位置并单击“创建”。
1. 在 Xcode 中,单击“文件 | 新增 | 项目…”,选择“Single View App”,然后输入 TFObjectDetectionAPI 作为产品名称,然后选择 Objective-C 作为语言(如果您想使用 Swift,请参阅上一章有关如何将 TensorFlow 添加到基于 Swift 的 iOS 应用并进行此处所示的必要更改),然后选择项目的位置并单击“创建”。
2.`TFObjectDetectionAPI`项目中,单击项目名称,然后在构建设置下,单击`+`并添加用户定义的设置,然后输入`TENSORFLOW_ROOT`作为 TensorFlow 源根的路径(例如`$HOME/tensorflow-1.4`),如图 3.4 所示。 如果您要引用较新的 TensorFlow 来源,此用户定义的设置将在其他设置中使用,以便以后轻松更改项目设置:
![](img/a8474e70-b35d-4585-a9f9-620aa6cff313.png)
......@@ -533,7 +533,7 @@ $(TENSORFLOW_ROOT) $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/prot
现在执行以下步骤以将模型文件,标签文件和代码添加到应用程序,并运行以查看实际的对象检测:
1. 拖放上一节中的三个物体检测模型图`ssd_mobilenet_v1_frozen_inference_graph.pb``faster_rcnn_inceptionv2_frozen_inference_graph.pb``faster_rcnn_resnet101_frozen_inference_graph.pb`,以及`mscoco_label_map.pbtxt`标签映射文件和几个 测试图像发送到`TFObjectDetectionAPI`项目。
1. 拖放上一节中的三个物体检测模型图`ssd_mobilenet_v1_frozen_inference_graph.pb``faster_rcnn_inceptionv2_frozen_inference_graph.pb``faster_rcnn_resnet101_frozen_inference_graph.pb`,以及`mscoco_label_map.pbtxt`标签映射文件和几个测试图像发送到`TFObjectDetectionAPI`项目。
2. 将 TensorFlow iOS 示例简单应用程序或上一章中创建的 iOS 应用程序中的`ios_image_load.mm`及其`.h`文件添加到项目中。
3.[这里](https://github.com/google/protobuf/releases)(在 Mac 上为`protoc-3.4.0-osx-x86_64.zip`文件)下载协议缓冲区版本 3.4.0。 要使用 TensorFlow 1.4 库需要确切的 3.4.0 版本,而更高版本的 TensorFlow 可能需要更高版本的协议缓冲区。
4. 假设下载的文件解压缩到`~/Downloads`目录中,请打开“终端”窗口并运行以下命令:
......@@ -606,7 +606,7 @@ Status run_status = session->Run({{"image_tensor", image_tensor}},
{"detection_boxes", "detection_scores", "detection_classes", "num_detections"}, {}, &outputs);
```
要在检测到的对象上绘制边界框,我们将`outputs`张量向量传递给`DrawTopDetections`,后者使用以下代码解析`outputs`向量以获取四个输出的值,并循环遍历每次检测以获得 边界框值(左,上,右,下)以及检测到的对象 ID 的显示名称,因此您可以编写代码以使用以下名称绘制边界框:
要在检测到的对象上绘制边界框,我们将`outputs`张量向量传递给`DrawTopDetections`,后者使用以下代码解析`outputs`向量以获取四个输出的值,并循环遍历每次检测以获得边界框值(左,上,右,下)以及检测到的对象 ID 的显示名称,因此您可以编写代码以使用以下名称绘制边界框:
```py
auto detection_boxes = outputs[0].flat<float>();
......@@ -659,7 +659,7 @@ num_detections: 100, detection_scores size: 100, detection_classes size: 100, de
TensorFlow Android 示例应用程序具有使用预训练的 YOLO 模型的示例代码,但没有 iOS 示例。 由于 YOLO2 是最快的对象检测模型之一,而且非常准确(请在其网站上查看其与 SSD 模型的 mAP 比较),因此有必要了解一下如何在 iOS 应用中使用它。
YOLO 使用称为 [Darknet](https://pjreddie.com/darknet) 的独特开源神经网络框架来训练其模型。 [还有另一个名为 darkflow 的库](https://github.com/thtrieu/darkflow),该库可以将使用 Darknet 训练的 YOLO 模型的神经网络权重转换为 TensorFlow 图格式,并重新训练预训练的 楷模
YOLO 使用称为 [Darknet](https://pjreddie.com/darknet) 的独特开源神经网络框架来训练其模型。 [还有另一个名为 darkflow 的库](https://github.com/thtrieu/darkflow),该库可以将使用 Darknet 训练的 YOLO 模型的神经网络权重转换为 TensorFlow 图格式,并重新训练预训练的模型
要以 TensorFlow 格式构建 YOLO2 模型,请首先从[这里](https://github.com/thtrieu/darkflow)获取 darkflow。因为它需要 Python3 和 TensorFlow 1.0(Python 2.7 和 TensorFlow 1.4 或更高版本也可能工作),所以我们将使用 Anaconda 来设置一个新的具有 Python3 支持的 TensorFlow 1.0 环境:
......@@ -738,6 +738,6 @@ YoloPostProcess(model, output->flat<float>(), &top_results);
在本章中,我们首先简要概述了各种不同的基于深度学习的对象检测方法。 然后,我们详细介绍了如何使用 TensorFlow 对象检测 API 通过预先训练的模型进行现成的推理,以及如何在 Python 中重新训练预先训练的 TensorFlow 对象检测模型。 我们还提供了有关如何手动构建 TensorFlow iOS 库,使用该库创建新的 iOS 应用以及如何在 iOS 中使用预先存在和经过重新训练的 SSD MobileNet 和 Faster RCNN 模型的详细教程。 最后,我们展示了在您的 iOS 应用中使用另一种强大的对象检测模型 YOLO2 所需要的内容。
在下一章中,这是我们与计算机视觉相关的第三项任务,我们将仔细研究如何在 Python 和 TensorFlow 中训练和构建有趣的深度学习模型,以及如何在 iOS 和 Android 应用程序中使用它来添加 令人赞叹的图像艺术风格。
在下一章中,这是我们与计算机视觉相关的第三项任务,我们将仔细研究如何在 Python 和 TensorFlow 中训练和构建有趣的深度学习模型,以及如何在 iOS 和 Android 应用程序中使用它来添加令人赞叹的图像艺术风格。
......@@ -545,7 +545,7 @@ tensorflow::Status run_status = session->Run({{input_layer, image_tensor}, {styl
尽管 TensorFlow Android 示例应用程序已经具有使用多种样式模型的代码(实际上我们在上一节的 iOS 应用中使用了 Android 示例应用程序中的模型),但示例应用程序中与 TensorFlow 相关的代码却与 超过 600 行的`StylizeActivity.java`文件中包含很多 UI 代码。 您还可以通过 TensorFlow Android 样式转换的 [Codelab](https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html) 进行操作,但是代码 与 TensorFlow Android 示例应用程序大致相同。 由于我们已经使用 TensorFlow 快速样式传输模型实现了 Android 应用程序的简约实现,因此很有趣的是,我们如何仅需更改几行代码就可以拥有一个强大的多样式样式传输应用程序。 这也应该是一种更直观的方法,以了解如何将出色的 TensorFlow 模型添加到现有的 Android 应用中。
尽管 TensorFlow Android 示例应用程序已经具有使用多种样式模型的代码(实际上我们在上一节的 iOS 应用中使用了 Android 示例应用程序中的模型),但示例应用程序中与 TensorFlow 相关的代码却与 超过 600 行的`StylizeActivity.java`文件中包含很多 UI 代码。 您还可以通过 TensorFlow Android 样式转换的 [Codelab](https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html) 进行操作,但是代码与 TensorFlow Android 示例应用程序大致相同。 由于我们已经使用 TensorFlow 快速样式传输模型实现了 Android 应用程序的简约实现,因此很有趣的是,我们如何仅需更改几行代码就可以拥有一个强大的多样式样式传输应用程序。 这也应该是一种更直观的方法,以了解如何将出色的 TensorFlow 模型添加到现有的 Android 应用中。
因此,这就是在我们之前构建的 Android 应用中使用多样式传输模型所需要的:
......
......@@ -191,7 +191,7 @@ def predict_input_fn():
让我们使用 TensorBoard 看看我们能找到什么。 在我们模型的 TensorBoard 视图的 GRAPHS 部分中,您可以看到,如图 7.3 所示,以红色突出显示的`BiasAdd`节点是使用的`ArgMax`操作的输入 计算精度以及 softmax 操作的输入。 我们可以使用`SparseSoftmaxCrossEntropyWithLogits`(图 7.3 仅显示为`SparseSiftnaxCr ...`)操作,也可以仅使用`Dense`/`BiasAdd`作为输出 节点名称,但我们将`ArgMax``Dense`/`BiasAdd`用作`freeze_graph`工具的两个输出节点名称,因此我们可以更轻松地查看 最终密集层的输出以及`ArgMax`结果:
让我们使用 TensorBoard 看看我们能找到什么。 在我们模型的 TensorBoard 视图的 GRAPHS 部分中,您可以看到,如图 7.3 所示,以红色突出显示的`BiasAdd`节点是使用的`ArgMax`操作的输入 计算精度以及 softmax 操作的输入。 我们可以使用`SparseSoftmaxCrossEntropyWithLogits`(图 7.3 仅显示为`SparseSiftnaxCr ...`)操作,也可以仅使用`Dense`/`BiasAdd`作为输出 节点名称,但我们将`ArgMax``Dense`/`BiasAdd`用作`freeze_graph`工具的两个输出节点名称,因此我们可以更轻松地查看最终密集层的输出以及`ArgMax`结果:
![](img/d911bab2-cfc2-41d3-a352-d00db55b1f71.png)
......@@ -232,7 +232,7 @@ strip_unused_nodes(name=Squeeze,type_for_name=int64,shape_for_name="8",name=Resh
现在在 iOS 或 Android 中加载模型,`OneShotIterator`错误将消失。 但是,您可能已经学会了预期,但是会出现一个新错误:`Could not create TensorFlow Graph: Invalid argument: Input 0 of node IsVariableInitialized was passed int64 from global_step:0 incompatible with expected int64_ref.`
我们首先需要了解有关`IsVariableInitialized`的更多信息。 如果我们回到 TensorBoard `GRAPHS`标签,我们会在左侧看到一个`IsVariableInitialized`操作,该操作以红色突出显示并在右侧的信息面板中以`global_step`作为其内容 输入(图 7.6)。
我们首先需要了解有关`IsVariableInitialized`的更多信息。 如果我们回到 TensorBoard `GRAPHS`标签,我们会在左侧看到一个`IsVariableInitialized`操作,该操作以红色突出显示并在右侧的信息面板中以`global_step`作为其输入(图 7.6)。
即使我们不确切知道它的用途,我们也可以确保它与模型推断无关,该模型推断只需要一些输入(图 7.4 和图 7.5)并生成图形分类作为输出(图 7.3)。 :
......@@ -284,7 +284,7 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
要解决以前的 RefSwitch 错误,无论您是否像在第 2 章,“通过迁移学习对图像分类”和第 6 章,“用自然语言描述图像”或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要`INT64`数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅适用于 每个操作都包括在内。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
要解决以前的 RefSwitch 错误,无论您是否像在第 2 章,“通过迁移学习对图像分类”和第 6 章,“用自然语言描述图像”或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要`INT64`数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅包括每个操作的共同数据类型。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
......@@ -636,7 +636,7 @@ void normalizeScreenCoordinates(NSMutableArray *allPoints, float *normalized) {
现在该看看我们如何在 Android 中加载和使用该模型。 在之前的章节中,我们通过使用 Android 应用程序的`build.gradle`文件并添加了一行 `compile 'org.tensorflow:tensorflow-android:+'`仅添加了 TensorFlow 支持。 与 iOS 相比,我们必须构建一个自定义的 TensorFlow 库来修复不同的模型加载或运行错误(例如,在第 3 章,“检测对象及其位置”中,第四章,“变换具有惊人艺术风格的图片”和第五章,“了解简单的语音命令”),Android 的默认 TensorFlow 库对注册的操作和数据类型有更好的支持,这可能是因为 Android 是 Google 的一等公民,而 iOS 是第二名,甚至是第二名。
事实是,当我们处理各种惊人的模型时,我们不得不面对不可避免的问题只是时间问题:我们必须手动为 Android 构建 TensorFlow 库,以修复默认 TensorFlow 库中的一些错误 根本无法应对`No OpKernel was registered to support Op 'RefSwitch' with these attrs.`错误就是这样的错误之一。 对于乐观的开发人员来说,这仅意味着另一种向您的技能组合中添加新技巧的机会。
事实是,当我们处理各种惊人的模型时,我们不得不面对不可避免的问题只是时间问题:我们必须手动为 Android 构建 TensorFlow 库,以修复默认 TensorFlow 库中的一些根本无法应对的错误`No OpKernel was registered to support Op 'RefSwitch' with these attrs.`错误就是这样的错误之一。 对于乐观的开发人员来说,这仅意味着另一种向您的技能组合中添加新技巧的机会。
......@@ -1036,7 +1036,7 @@ private double[] normalizeScreenCoordinates() {
既然您已经了解了训练 Quick Draw 模型的全过程,并在 iOS 和 Android 应用程序中使用了它,那么您当然可以微调训练方法,使其更加准确,并改善移动应用程序的乐趣。
在本章我们不得不结束有趣旅程之前的最后一个提示是,如果您使用错误的 ABI 构建适用于 Android 的 TensorFlow 本机库,您仍然可以从 Android Studio 构建和运行该应用程序,但您将 出现运行时错误`java.lang.RuntimeException: Native TF methods not found; check that the correct native libraries are present in the APK.`,这意味着您的应用程序的`jniLibs`文件夹中没有正确的 TensorFlow 本机库(图 7.9)。 要找出`jniLibs`内特定 ABI 文件夹中是否缺少该文件,可以从`Android Studio | View | Tool Windows`中打开`Device File Explorer`,然后选择设备的`data | app | package | lib`来查看,如图 7.12 所示。 如果您更喜欢命令行,则也可以使用`adb`工具找出来。
在本章我们不得不结束有趣旅程之前的最后一个提示是,如果您使用错误的 ABI 构建适用于 Android 的 TensorFlow 本机库,您仍然可以从 Android Studio 构建和运行该应用程序,但出现运行时错误`java.lang.RuntimeException: Native TF methods not found; check that the correct native libraries are present in the APK.`,这意味着您的应用程序的`jniLibs`文件夹中没有正确的 TensorFlow 本机库(图 7.9)。 要找出`jniLibs`内特定 ABI 文件夹中是否缺少该文件,可以从`Android Studio | View | Tool Windows`中打开`Device File Explorer`,然后选择设备的`data | app | package | lib`来查看,如图 7.12 所示。 如果您更喜欢命令行,则也可以使用`adb`工具找出来。
![](img/16494075-d42a-4b86-a48a-4cb0bc2ec865.png)
......
......@@ -6,7 +6,7 @@
如果在上一章中在移动设备上玩过涂鸦和构建(并运行模型以识别涂鸦),当您在股市上赚钱时会感到很开心,而如果您不认真的话会变得很认真。 一方面,股价是时间序列数据,一系列离散时间数据,而处理时间序列数据的最佳深度学习方法是 RNN,这是我们在前两章中使用的方法。 AurélienGéron 在他的畅销书《Scikit-Learn 和 TensorFlow 机器学习实战》中,建议使用 RNN“分析时间序列数据,例如股票价格,并告诉您何时买卖”。 另一方面,其他人则认为股票的过去表现无法预测其未来收益,因此,随机选择的投资组合的表现与专家精心挑选的股票一样好。 实际上,Keras(在 TensorFlow 和其他几个库之上运行的非常受欢迎的高级深度学习库)的作者 FrançoisChollet 在他的畅销书《Python 深度学习》中表示,使用 RNN。 仅用公开数据来击败市场是“一项非常困难的努力,您可能会浪费时间和资源,而无所作为。”
因此,冒着“可能”浪费我们时间和资源的风险,但是可以肯定的是,我们至少将了解更多有关 RNN 的知识,以及为什么有可能比随机 50% 的策略更好地预测股价,我们将 首先概述如何使用 RNN 进行股票价格预测,然后讨论如何使用 TensorFlow API 构建 RNN 模型来预测股票价格,以及如何使用易于使用的 Keras API 来构建 RNN LSTM 模型 价格预测。 我们将测试这些模型是否可以击败随机的买入或卖出策略。 如果我们对我们的模型感到满意,以提高我们在市场上的领先优势,或者只是出于专有技术的目的,我们将了解如何冻结并准备 TensorFlow 和 Keras 模型以在 iOS 和 Android 应用程序上运行。 如果该模型可以提高我们的机会,那么我们支持该模型的移动应用程序可以在任何时候,无论何时何地做出买或卖决定。 感觉有点不确定和兴奋? 欢迎来到市场。
因此,冒着“可能”浪费我们时间和资源的风险,但是可以肯定的是,我们至少将了解更多有关 RNN 的知识,以及为什么有可能比随机 50% 的策略更好地预测股价,我们将首先概述如何使用 RNN 进行股票价格预测,然后讨论如何使用 TensorFlow API 构建 RNN 模型来预测股票价格,以及如何使用易于使用的 Keras API 来为价格预测构建 RNN LSTM 模型。 我们将测试这些模型是否可以击败随机的买入或卖出策略。 如果我们对我们的模型感到满意,以提高我们在市场上的领先优势,或者只是出于专有技术的目的,我们将了解如何冻结并准备 TensorFlow 和 Keras 模型以在 iOS 和 Android 应用程序上运行。 如果该模型可以提高我们的机会,那么我们支持该模型的移动应用程序可以在任何时候,无论何时何地做出买或卖决定。 感觉有点不确定和兴奋? 欢迎来到市场。
总之,本章将涵盖以下主题:
......@@ -30,7 +30,7 @@
2. 在序列输入中,连接到下一个元素`X2`的另一个 RNN 单元使用`X2`以及先前的输出`y1`, 获得下一个输出`y2`
3. 重复该过程:在时间步长使用 RNN 单元处理输入序列中的`Xi`元素时,先前的输出`y[i-1]`,在时间步`i-1``Xi`一起使用,以在时间步`i`生成新的输出`yi`
因此,在时间步长`i`的每个`yi`输出 都具有有关输入序列中直到时间步长`i`以及包括时间步长`i`的所有元素的信息:`X1, X2, ..., X[i-1]``Xi`。 在 RNN 训练期间,预测价格`y1, y2, ..., y9``y10`的每个时间步长与每个时间步长的真实目标价格进行比较,即`X2, X3, ..., X10``X11`和损失函数因此被定义并用于优化以更新网络参数。 训练完成后,在预测期间,将`X11`用作输入序列的预测,`X1, X2, ..., X10`
因此,在时间步长`i`的每个`yi`输出都具有有关输入序列中直到时间步长`i`以及包括时间步长`i`的所有元素的信息:`X1, X2, ..., X[i-1]``Xi`。 在 RNN 训练期间,预测价格`y1, y2, ..., y9``y10`的每个时间步长与每个时间步长的真实目标价格进行比较,即`X2, X3, ..., X10``X11`和损失函数因此被定义并用于优化以更新网络参数。 训练完成后,在预测期间,将`X11`用作输入序列的预测,`X1, X2, ..., X10`
这就是为什么我们说 RNN 有内存。 RNN 对于处理股票价格数据似乎很有意义,因为直觉是,今天(以及明天和后天等等)的股票价格可能会受其前`N`天的价格影响。
......@@ -46,7 +46,7 @@ LSTM 只是解决 RNN 已知梯度消失问题的一种 RNN,我们在第 6 章
所有这些技术已经实现,并且可以在 TensorFlow 和 Keras API 中轻松访问。
那么,我们如何使用 RNN 和 LSTM 测试股价预测? 我们将在[这个页面](https://www.alphavantage.co)上使用免费的 API 收集特定股票代码的每日股票价格数据,将其解析为训练集和测试集,并在每次输入时提供 对 RNN/LSTM 模型的一批训练输入(每个训练输入有 20 个时间步长,即,连续 20 天的价格),对模型进行训练,然后进行测试以查看模型在测试数据集中的准确性。 我们将同时使用 TensorFlow 和 Keras API 进行测试,并比较常规 RNN 和 LSTM 模型之间的差异。 我们还将测试三个略有不同的序列输入和输出,看看哪个是最好的:
那么,我们如何使用 RNN 和 LSTM 测试股价预测? 我们将在[这个页面](https://www.alphavantage.co)上使用免费的 API 收集特定股票代码的每日股票价格数据,将其解析为训练集和测试集,并每次向 RNN/LSTM 模型提供一批训练输入(每个训练输入有 20 个时间步长,即,连续 20 天的价格),对模型进行训练,然后进行测试以查看模型在测试数据集中的准确性。 我们将同时使用 TensorFlow 和 Keras API 进行测试,并比较常规 RNN 和 LSTM 模型之间的差异。 我们还将测试三个略有不同的序列输入和输出,看看哪个是最好的:
* 根据过去`N`天预测一天的价格
* 根据过去`N`天预测 M 天的价格
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册