提交 265a1758 编写于 作者: W wizardforcel

2020-09-10 21:53:52

上级 bf2c9cec
...@@ -18,7 +18,7 @@ TensorFlow 是 Python 中最受欢迎的机器学习框架之一。 通过这本 ...@@ -18,7 +18,7 @@ TensorFlow 是 Python 中最受欢迎的机器学习框架之一。 通过这本
第 4 章,“TensorFlow 2 和监督机器学习”,描述了在涉及线性回归的两种情况下使用 TensorFlow 的示例,在这些情况下,特征映射到具有连续值的已知标签,从而可以进行预测看不见的特征。 第 4 章,“TensorFlow 2 和监督机器学习”,描述了在涉及线性回归的两种情况下使用 TensorFlow 的示例,在这些情况下,特征映射到具有连续值的已知标签,从而可以进行预测看不见的特征。
第 5 章,“TensorFlow 2 和无监督学习”着眼于自编码器在无监督学习中的两种应用:首先用于压缩数据;其次用于压缩数据。 第二,用于降噪,换句话说,去除图像中的噪声。 第 5 章,“TensorFlow 2 和无监督学习”着眼于自编码器在无监督学习中的两种应用:首先用于压缩数据;其次用于压缩数据。 第二,用于降噪,换句话说,去除图像中的噪声。
第 6 章,“使用 TensorFlow 2 识别图像”,首先查看 Google Quick Draw 1 图像数据集,其次查看 CIFAR 10 图像数据集。 第 6 章,“使用 TensorFlow 2 识别图像”,首先查看 Google Quick Draw 1 图像数据集,其次查看 CIFAR 10 图像数据集。
......
...@@ -11,7 +11,7 @@ image1 = tf.zeros([7, 28, 28, 3]) # example-within-batch by height by width by ...@@ -11,7 +11,7 @@ image1 = tf.zeros([7, 28, 28, 3]) # example-within-batch by height by width by
``` ```
尽管 TensorFlow 通常可以用于许多数值计算领域,尤其是机器学习,但其主要研究和开发领域是**深层神经网络****DNN**)的应用,它已在语音和声音识别等不同领域使用,例如,在如今广泛使用的声控助手中; 基于文本的应用程序,例如语言翻译器; 图像识别,例如系外行星搜寻,癌症检测和诊断; 以及时间序列应用程序(例如推荐系统)。 尽管 TensorFlow 通常可以用于许多数值计算领域,尤其是机器学习,但其主要研究和开发领域是**深层神经网络****DNN**)的应用,它已在语音和声音识别等不同领域使用,例如,在如今广泛使用的声控助手中; 基于文本的应用,例如语言翻译器; 图像识别,例如系外行星搜寻,癌症检测和诊断; 以及时间序列应用(例如推荐系统)。
在本章中,我们将讨论以下内容: 在本章中,我们将讨论以下内容:
...@@ -20,11 +20,11 @@ image1 = tf.zeros([7, 28, 28, 3]) # example-within-batch by height by width by ...@@ -20,11 +20,11 @@ image1 = tf.zeros([7, 28, 28, 3]) # example-within-batch by height by width by
* 内务和急切的操作 * 内务和急切的操作
* 提供有用的 TensorFlow 操作 * 提供有用的 TensorFlow 操作
# 审视现代 TensorFlow 生态系统 # 现代 TensorFlow 生态系统
让我们讨论**急切执行**。 TensorFlow 的第一个化身包括构造由操作和张量组成的计算图,随后必须在 Google 所谓的会话中对其进行评估(这称为声明性编程)。 这仍然是编写 TensorFlow 程序的常用方法。 但是,急于执行的功能(以研究形式从版本 1.5 开始可用,并从版本 1.7 被烘焙到 TensorFlow 中)需要立即评估操作,结果是可以将张量像 NumPy 数组一样对待(这被称为命令式编程)。 让我们讨论**急切执行**。 TensorFlow 的第一个化身包括构造由操作和张量组成的计算图,随后必须在 Google 所谓的会话中对其进行评估(这称为声明性编程)。 这仍然是编写 TensorFlow 程序的常用方法。 但是,急于执行的功能(以研究形式从版本 1.5 开始可用,并从版本 1.7 被烘焙到 TensorFlow 中)需要立即评估操作,结果是可以将张量像 NumPy 数组一样对待(这被称为命令式编程)。
谷歌表示,急切执行是研究和开发的首选方法,但计算图对于服务 TensorFlow 生产应用程序将是首选。 谷歌表示,急切执行是研究和开发的首选方法,但计算图对于服务 TensorFlow 生产应用将是首选。
`tf.data`是一种 API,可让您从更简单,可重复使用的部件中构建复杂的数据输入管道。 最高级别的抽象是`Dataset`,它既包含张量的嵌套结构元素,又包含作用于这些元素的转换计划。 有以下几种类: `tf.data`是一种 API,可让您从更简单,可重复使用的部件中构建复杂的数据输入管道。 最高级别的抽象是`Dataset`,它既包含张量的嵌套结构元素,又包含作用于这些元素的转换计划。 有以下几种类:
...@@ -49,7 +49,7 @@ image1 = tf.zeros([7, 28, 28, 3]) # example-within-batch by height by width by ...@@ -49,7 +49,7 @@ image1 = tf.zeros([7, 28, 28, 3]) # example-within-batch by height by width by
**TensorBoard** 是一套可视化工具,支持对 TensorFlow 程序的理解,调试和优化。 它与急切和图形执行环境兼容。 您可以在训练期间使用 TensorBoard 可视化模型的各种指标。 **TensorBoard** 是一套可视化工具,支持对 TensorFlow 程序的理解,调试和优化。 它与急切和图形执行环境兼容。 您可以在训练期间使用 TensorBoard 可视化模型的各种指标。
TensorFlow 的一项最新开发(在撰写本文时仍处于实验形式)将 TensorFlow 直接集成到 Swift 编程语言中。 Swift 中的 TensorFlow 应用程序是使用命令性代码编写的,即命令急切地(在运行时)执行的代码。 Swift 编译器会自动将此源代码转换为一个 TensorFlow 图,然后在 CPU,GPU 和 TPU 上以 TensorFlow Sessions 的全部性能执行此编译后的代码。 TensorFlow 的一项最新开发(在撰写本文时仍处于实验形式)将 TensorFlow 直接集成到 Swift 编程语言中。 Swift 中的 TensorFlow 应用是使用命令性代码编写的,即命令急切地(在运行时)执行的代码。 Swift 编译器会自动将此源代码转换为一个 TensorFlow 图,然后在 CPU,GPU 和 TPU 上以 TensorFlow Sessions 的全部性能执行此编译后的代码。
在本书中,我们将重点介绍那些使用 Python 3.6 和 TensorFlow 2.0.0 alpha 版本启动和运行 TensorFlow 的 TensorFlow 工具。 特别是,我们将使用急切的执行而不是计算图,并且将尽可能利用`tf.keras`的功能来构建网络,因为这是研究和实验的现代方法。 在本书中,我们将重点介绍那些使用 Python 3.6 和 TensorFlow 2.0.0 alpha 版本启动和运行 TensorFlow 的 TensorFlow 工具。 特别是,我们将使用急切的执行而不是计算图,并且将尽可能利用`tf.keras`的功能来构建网络,因为这是研究和实验的现代方法。
...@@ -73,7 +73,7 @@ TensorFlow 有两种不同的版本-一个用于在 CPU 上执行,另一个用 ...@@ -73,7 +73,7 @@ TensorFlow 有两种不同的版本-一个用于在 CPU 上执行,另一个用
安装后,您可以从命令终端检查 TensorFlow 的安装。 [这个页面](http://www.laurencemoroney.com/tensorflow-to-gpu-or-not-to-gpu/)有执行此操作,以及安装 TensorFlow 的夜间版本(其中包含所有最新更新)的说明。 安装后,您可以从命令终端检查 TensorFlow 的安装。 [这个页面](http://www.laurencemoroney.com/tensorflow-to-gpu-or-not-to-gpu/)有执行此操作,以及安装 TensorFlow 的夜间版本(其中包含所有最新更新)的说明。
# 内务和急切的操作 # 急切的操作
我们将首先介绍如何导入 TensorFlow,然后介绍 TensorFlow 编码风格,以及如何进行一些基本的整理工作。 之后,我们将看一些基本的 TensorFlow 操作。 您可以为这些代码片段创建 Jupyter 笔记本,也可以使用自己喜欢的 IDE 创建源代码。 该代码在 GitHub 存储库中都可用。 我们将首先介绍如何导入 TensorFlow,然后介绍 TensorFlow 编码风格,以及如何进行一些基本的整理工作。 之后,我们将看一些基本的 TensorFlow 操作。 您可以为这些代码片段创建 Jupyter 笔记本,也可以使用自己喜欢的 IDE 创建源代码。 该代码在 GitHub 存储库中都可用。
...@@ -90,9 +90,9 @@ print("Keras version: {}".format(tf.keras.__version__)) ...@@ -90,9 +90,9 @@ print("Keras version: {}".format(tf.keras.__version__))
# TensorFlow 的编码风格约定 # TensorFlow 的编码风格约定
对于 Python 应用程序,Google 遵守 PEP8 标准约定。 特别是,他们将 CamelCase 用于类(例如`hub.LatestModuleExporter`),将`snake_case`用于功能,方法和属性(例如`tf.math.squared_difference`)。 Google 还遵守《Google Python 风格指南》,该指南可在[这个页面](https://github.com/google/styleguide/blob/gh-pages/pyguide.md)中找到。 对于 Python 应用,Google 遵守 PEP8 标准约定。 特别是,他们将 CamelCase 用于类(例如`hub.LatestModuleExporter`),将`snake_case`用于功能,方法和属性(例如`tf.math.squared_difference`)。 Google 还遵守《Google Python 风格指南》,该指南可在[这个页面](https://github.com/google/styleguide/blob/gh-pages/pyguide.md)中找到。
# 使用急切执行 # 使用急切执行
急切执行是 TensorFlow 2 中的默认设置,因此不需要特殊设置。 急切执行是 TensorFlow 2 中的默认设置,因此不需要特殊设置。
...@@ -522,7 +522,7 @@ tf.reduce_mean(input_tensor=numbers) ...@@ -522,7 +522,7 @@ tf.reduce_mean(input_tensor=numbers)
<tf.Tensor: id=272, shape=(), dtype=float32, numpy=4.75> <tf.Tensor: id=272, shape=(), dtype=float32, numpy=4.75>
``` ```
# 找出各列的均值 # 各列的均值
用以下方法找到各列的均值(即减少行数): 用以下方法找到各列的均值(即减少行数):
...@@ -549,7 +549,7 @@ tf.reduce_mean(input_tensor=numbers, axis=0) # [ (4\. + 7\. )/2 , (5\. + 3.)/2 ] ...@@ -549,7 +549,7 @@ tf.reduce_mean(input_tensor=numbers, axis=0) # [ (4\. + 7\. )/2 , (5\. + 3.)/2 ]
array([[5.5, 4.]]) (1 row, 2 columns) array([[5.5, 4.]]) (1 row, 2 columns)
``` ```
# 找出各行的均值 # 各行的均值
使用以下方法找到各行的均值(即减少列数): 使用以下方法找到各行的均值(即减少列数):
...@@ -813,7 +813,7 @@ assert f1(x,y).numpy() == f2(x,y).numpy() ...@@ -813,7 +813,7 @@ assert f1(x,y).numpy() == f2(x,y).numpy()
断言通过,因此没有输出。 断言通过,因此没有输出。
# 摘要 # 总结
在本章中,我们通过查看一些说明一些基本操作的代码片段开始熟悉 TensorFlow。 我们对现代 TensorFlow 生态系统以及如何安装 TensorFlow 进行了概述。 我们还研究了一些管家操作,一些急切操作以及各种 TensorFlow 操作,这些操作在本书的其余部分中将是有用的。 在 [www.youtube.com/watch?v=k5c-vg4rjBw](https://www.youtube.com/watch?v=k5c-vg4rjBw) 上对 TensorFlow 2 进行了出色的介绍。 在本章中,我们通过查看一些说明一些基本操作的代码片段开始熟悉 TensorFlow。 我们对现代 TensorFlow 生态系统以及如何安装 TensorFlow 进行了概述。 我们还研究了一些管家操作,一些急切操作以及各种 TensorFlow 操作,这些操作在本书的其余部分中将是有用的。 在 [www.youtube.com/watch?v=k5c-vg4rjBw](https://www.youtube.com/watch?v=k5c-vg4rjBw) 上对 TensorFlow 2 进行了出色的介绍。
......
...@@ -128,7 +128,7 @@ const ...@@ -128,7 +128,7 @@ const
<tf.Tensor 'Const:0' shape=(2, 2) dtype=float16> <tf.Tensor 'Const:0' shape=(2, 2) dtype=float16>
``` ```
# 数据类型 # Keras 数据类型
Keras **数据类型**`dtypes`)与 TensorFlow Python 数据类型相同,如下表所示: Keras **数据类型**`dtypes`)与 TensorFlow Python 数据类型相同,如下表所示:
...@@ -150,7 +150,7 @@ Keras **数据类型**(`dtypes`)与 TensorFlow Python 数据类型相同, ...@@ -150,7 +150,7 @@ Keras **数据类型**(`dtypes`)与 TensorFlow Python 数据类型相同,
| `tf.qint32` | 量化运算中使用的 32 位有符号整数 | | `tf.qint32` | 量化运算中使用的 32 位有符号整数 |
| `tf.quint8` | 量化运算中使用的 8 位无符号整数 | | `tf.quint8` | 量化运算中使用的 8 位无符号整数 |
# 模型 # Keras 模型
Keras 基于神经网络模型的概念。 主要模型称为**序列**,是层的线性堆栈。 还有一个使用 Keras 函数式 API 的系统。 Keras 基于神经网络模型的概念。 主要模型称为**序列**,是层的线性堆栈。 还有一个使用 Keras 函数式 API 的系统。
...@@ -451,7 +451,7 @@ model.save_weights('./model_weights.h5') ...@@ -451,7 +451,7 @@ model.save_weights('./model_weights.h5')
model.load_weights('./model_weights.h5') model.load_weights('./model_weights.h5')
``` ```
# 数据集 # Keras 数据集
可从 Keras 中获得以下数据集:`boston_housing``cifar10``cifar100``fashion_mnist``imdb``mnist``reuters` 可从 Keras 中获得以下数据集:`boston_housing``cifar10``cifar100``fashion_mnist``imdb``mnist``reuters`
...@@ -463,7 +463,7 @@ model.load_weights('./model_weights.h5') ...@@ -463,7 +463,7 @@ model.load_weights('./model_weights.h5')
可以在[这个页面](https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/datasets/)中找到更多详细信息。 可以在[这个页面](https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/datasets/)中找到更多详细信息。
# 摘要 # 总结
在本章中,我们使用通用注释和见解探索了 Keras API,然后以四种不同的方式表示相同的基本体系结构,以训练`mnist`数据集。 在本章中,我们使用通用注释和见解探索了 Keras API,然后以四种不同的方式表示相同的基本体系结构,以训练`mnist`数据集。
......
...@@ -102,7 +102,7 @@ for e in range(epochs): ...@@ -102,7 +102,7 @@ for e in range(epochs):
CSV 文件是一种非常流行的数据存储方法。 TensorFlow 2 包含灵活的方法来处理它们。 这里的主要方法是`tf.data.experimental.CsvDataset` CSV 文件是一种非常流行的数据存储方法。 TensorFlow 2 包含灵活的方法来处理它们。 这里的主要方法是`tf.data.experimental.CsvDataset`
# CSV 例 1 # CSV 例 1
使用以下参数,我们的数据集将由`filename`文件每一行中的两项组成,均为浮点类型,忽略文件的第一行,并使用第 1 列和第 2 列(当然,列编号为 ,从 0 开始): 使用以下参数,我们的数据集将由`filename`文件每一行中的两项组成,均为浮点类型,忽略文件的第一行,并使用第 1 列和第 2 列(当然,列编号为 ,从 0 开始):
...@@ -114,7 +114,7 @@ for item in dataset: ...@@ -114,7 +114,7 @@ for item in dataset:
print(item) print(item)
``` ```
# CSV 例 2 # CSV 例 2
在此示例中,使用以下参数,我们的数据集将包含一个必需的浮点数,一个默认值为`0.0`的可选浮点和一个`int`,其中 CSV 文件中没有标题,而只有列 1 ,2 和 3 被导入: 在此示例中,使用以下参数,我们的数据集将包含一个必需的浮点数,一个默认值为`0.0`的可选浮点和一个`int`,其中 CSV 文件中没有标题,而只有列 1 ,2 和 3 被导入:
...@@ -127,7 +127,7 @@ for item in dataset: ...@@ -127,7 +127,7 @@ for item in dataset:
print(item) print(item)
``` ```
# CSV 例 3 # CSV 例 3
对于最后一个示例,我们的`dataset`将由两个必需的浮点数和一个必需的字符串组成,其中 CSV 文件具有`header`变量: 对于最后一个示例,我们的`dataset`将由两个必需的浮点数和一个必需的字符串组成,其中 CSV 文件具有`header`变量:
...@@ -385,7 +385,7 @@ tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', da ...@@ -385,7 +385,7 @@ tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', da
layer = tf.keras.maxPooling2D() layer = tf.keras.maxPooling2D()
``` ```
# 批次归一化层和退出 # 批量归一化层和丢弃
**批量归一化**是一个接受输入并输出相同数量的输出的层,其中激活的平均值和单位方差为零,因为这对学习有益。 批量标准化规范了激活,使它们既不会变得很小也不会爆炸性地变大,这两种情况都阻止了网络的学习。 **批量归一化**是一个接受输入并输出相同数量的输出的层,其中激活的平均值和单位方差为零,因为这对学习有益。 批量标准化规范了激活,使它们既不会变得很小也不会爆炸性地变大,这两种情况都阻止了网络的学习。
...@@ -433,13 +433,13 @@ model2.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax)) ...@@ -433,13 +433,13 @@ model2.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))
这将添加具有 10 个神经元的密集 softmax 层,其中神经元的激活总数为 1。 这将添加具有 10 个神经元的密集 softmax 层,其中神经元的激活总数为 1。
接下来,我们将进一步讨论激活功能 接下来,我们将进一步讨论激活函数
# 激活功能 # 激活函数
重要的是要注意,神经网络具有非线性激活函数,即应用于神经元加权输入之和的函数。 除了平凡的神经网络模型外,线性激活单元无法将输入层映射到输出层。 重要的是要注意,神经网络具有非线性激活函数,即应用于神经元加权输入之和的函数。 除了平凡的神经网络模型外,线性激活单元无法将输入层映射到输出层。
有许多常用的激活功能,包括 Sigmoid,tanh,ReLU 和泄漏的 ReLU。 一个很好的总结,以及这些功能的图表,[可以在这里找到](https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6) 有许多常用的激活函数,包括 Sigmoid,tanh,ReLU 和泄漏的 ReLU。 一个很好的总结,以及这些功能的图表,[可以在这里找到](https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6)
# 建立模型 # 建立模型
...@@ -526,7 +526,7 @@ print(weight3_grad.numpy()) #6.0 ...@@ -526,7 +526,7 @@ print(weight3_grad.numpy()) #6.0
请注意,这两个函数可以很好地区分,这是反向传播所要求的。 请注意,这两个函数可以很好地区分,这是反向传播所要求的。
# 摘要 # 总结
在本章中,我们研究了许多支持神经网络创建和使用的技术。 在本章中,我们研究了许多支持神经网络创建和使用的技术。
......
...@@ -601,7 +601,7 @@ print("Accuracy = ",accuracy,"%") ...@@ -601,7 +601,7 @@ print("Accuracy = ",accuracy,"%")
如果您自己输入代码,或运行提供的笔记本电脑,则将看到准确率为 96.7%,只有一个`iris versicolor`被误分类为`iris virginica`(测试索引为 25)。 如果您自己输入代码,或运行提供的笔记本电脑,则将看到准确率为 96.7%,只有一个`iris versicolor`被误分类为`iris virginica`(测试索引为 25)。
# 摘要 # 总结
在本章中,我们看到了在涉及线性回归的两种情况下使用 TensorFlow 的示例。 其中将特征映射到具有连续值的已知标签,从而可以对看不见的特征进行预测。 我们还看到了逻辑回归的一个示例,更好地描述为分类,其中将要素映射到分类标签,再次允许对看不见的要素进行预测。 最后,我们研究了用于分类的 KNN 算法。 在本章中,我们看到了在涉及线性回归的两种情况下使用 TensorFlow 的示例。 其中将特征映射到具有连续值的已知标签,从而可以对看不见的特征进行预测。 我们还看到了逻辑回归的一个示例,更好地描述为分类,其中将要素映射到分类标签,再次允许对看不见的要素进行预测。 最后,我们研究了用于分类的 KNN 算法。
......
...@@ -2,21 +2,21 @@ ...@@ -2,21 +2,21 @@
在本章中,我们将研究使用 TensorFlow 2 进行无监督学习。无监督学习的目的是在数据中发现以前未标记数据点的模式或关系; 因此,我们只有功能。 这与监督式学习形成对比,在监督式学习中,我们既提供了功能及其标签,又希望预测以前未见过的新功能的标签。 在无监督学习中,我们想找出我们的数据是否存在基础结构。 例如,可以在不事先了解其结构的情况下以任何方式对其进行分组或组织吗? 这被称为**聚类**。 例如,亚马逊在其推荐系统中使用无监督学习来建议您以书本方式可能购买的商品,例如,通过识别以前购买的商品类别来提出建议。 在本章中,我们将研究使用 TensorFlow 2 进行无监督学习。无监督学习的目的是在数据中发现以前未标记数据点的模式或关系; 因此,我们只有功能。 这与监督式学习形成对比,在监督式学习中,我们既提供了功能及其标签,又希望预测以前未见过的新功能的标签。 在无监督学习中,我们想找出我们的数据是否存在基础结构。 例如,可以在不事先了解其结构的情况下以任何方式对其进行分组或组织吗? 这被称为**聚类**。 例如,亚马逊在其推荐系统中使用无监督学习来建议您以书本方式可能购买的商品,例如,通过识别以前购买的商品类别来提出建议。
无监督学习的另一种用途是在数据压缩技术中,其中数据中的模式可以用更少的内存表示,而不会损害数据的结构或完整性。 在本章中,我们将研究两个自编码器,以及如何将它们用于压缩数据以及如何消除图像中的噪声。 无监督学习的另一种用途是在数据压缩技术中,其中数据中的模式可以用更少的内存表示,而不会损害数据的结构或完整性。 在本章中,我们将研究两个自编码器,以及如何将它们用于压缩数据以及如何消除图像中的噪声。
在本章中,我们将深入探讨自编码器。 在本章中,我们将深入探讨自编码器。
# 汽车编码器 # 编码器
编码是一种使用 ANN 实现的数据压缩和解压缩算法。 由于它是学习算法的无监督形式,因此我们知道只需要未标记的数据。 它的工作方式是通过强制输入通过瓶颈(即,宽度小于原始输入的一层或多层)来生成输入的压缩版本。 要重建输入(即解压缩),我们可以逆向处理。 我们使用反向传播在中间层中创建输入的表示形式,并重新创建输入作为表示形式的输出。 自编码是一种使用 ANN 实现的数据压缩和解压缩算法。 由于它是学习算法的无监督形式,因此我们知道只需要未标记的数据。 它的工作方式是通过强制输入通过瓶颈(即,宽度小于原始输入的一层或多层)来生成输入的压缩版本。 要重建输入(即解压缩),我们可以逆向处理。 我们使用反向传播在中间层中创建输入的表示形式,并重新创建输入作为表示形式的输出。
编码是有损的,也就是说,与原始输入相比,解压缩后的输出将变差。 这与 MP3 和 JPEG 压缩格式相似。 自编码是有损的,也就是说,与原始输入相比,解压缩后的输出将变差。 这与 MP3 和 JPEG 压缩格式相似。
动编码是特定于数据的,也就是说,只有与它们经过训练的数据相似的数据才可以正确压缩。 例如,训练有素的自动编码器在汽车图片上的表现会很差,这是因为其学习到的功能将是汽车特有的。 编码是特定于数据的,也就是说,只有与它们经过训练的数据相似的数据才可以正确压缩。 例如,训练有素的自编码器在汽车图片上的表现会很差,这是因为其学习到的功能将是汽车特有的。
# 一个简单的自编码器 # 一个简单的自编码器
让我们编写一个非常简单的自编码器,该编码器仅使用一层 ANN。 首先,像往常一样,让我们​​从导入开始,如下所示: 让我们编写一个非常简单的自编码器,该编码器仅使用一层 ANN。 首先,像往常一样,让我们​​从导入开始,如下所示:
```py ```py
from tensorflow.keras.layers import Input, Dense from tensorflow.keras.layers import Input, Dense
...@@ -33,7 +33,7 @@ import matplotlib.pyplot as plt ...@@ -33,7 +33,7 @@ import matplotlib.pyplot as plt
# 预处理数据 # 预处理数据
然后,我们加载数据。 对于此应用程序,我们将使用`fashion_mnist`数据集,该数据集旨在替代著名的 MNIST 数据集。 本节末尾有这些图像的示例。 每个数据项(图像中的像素)都是 0 到 255 之间的无符号整数,因此我们首先将其转换为`float32`,然后将其缩放为零至一的范围,以使其适合以后的学习过程: 然后,我们加载数据。 对于此应用,我们将使用`fashion_mnist`数据集,该数据集旨在替代著名的 MNIST 数据集。 本节末尾有这些图像的示例。 每个数据项(图像中的像素)都是 0 到 255 之间的无符号整数,因此我们首先将其转换为`float32`,然后将其缩放为零至一的范围,以使其适合以后的学习过程:
```py ```py
(x_train, _), (x_test, _) = fashion_mnist.load_data() # we don't need the labels (x_train, _), (x_test, _) = fashion_mnist.load_data() # we don't need the labels
...@@ -75,7 +75,7 @@ image_dim = 784 # this is the size of our input image, 784 ...@@ -75,7 +75,7 @@ image_dim = 784 # this is the size of our input image, 784
encoding_dim = 32 # this is the length of our encoded items.Compression of factor=784/32=24.5 encoding_dim = 32 # this is the length of our encoded items.Compression of factor=784/32=24.5
``` ```
接下来,我们构建单层编码器和自编码器模型,如下所示: 接下来,我们构建单层编码器和自编码器模型,如下所示:
```py ```py
input_image = Input(shape=(image_dim, )) # the input placeholder input_image = Input(shape=(image_dim, )) # the input placeholder
...@@ -100,7 +100,7 @@ decoder_layer = autoencoder.layers[-1]# retrieve the last layer of the autoencod ...@@ -100,7 +100,7 @@ decoder_layer = autoencoder.layers[-1]# retrieve the last layer of the autoencod
decoder = Model(encoded_input, decoder_layer(encoded_input))# create the decoder model decoder = Model(encoded_input, decoder_layer(encoded_input))# create the decoder model
``` ```
接下来,我们可以编译我们的自编码器。 由于数据几乎是二进制的,因此选择了`binary_crossentropy`损耗,因此,我们可以最小化每个像素的二进制交叉熵: 接下来,我们可以编译我们的自编码器。 由于数据几乎是二进制的,因此选择了`binary_crossentropy`损耗,因此,我们可以最小化每个像素的二进制交叉熵:
```py ```py
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
...@@ -218,15 +218,15 @@ plt.show() ...@@ -218,15 +218,15 @@ plt.show()
![](img/a271f6c6-dc36-446e-a527-44d5edf655be.png) ![](img/a271f6c6-dc36-446e-a527-44d5edf655be.png)
这可能与原始版本略有不同。 接下来,我们将看一下自动编码的应用程序 这可能与原始版本略有不同。 接下来,我们将看一下自编码的应用
# 自动编码器应用程序–去噪 # 自编码器应用–去噪
动编码器的一个很好的应用是去噪:去除图像(噪声)中小的随机伪像的过程。 我们将用多层卷积码代替简单的一层自动编码器。 编码器的一个很好的应用是去噪:去除图像(噪声)中小的随机伪像的过程。 我们将用多层卷积码代替简单的一层自编码器。
我们将人造噪声添加到我们的时装中,然后将其消除。 我们还将借此机会研究使用 TensorBoard 来检查一些网络训练指标。 我们将人造噪声添加到我们的时装中,然后将其消除。 我们还将借此机会研究使用 TensorBoard 来检查一些网络训练指标。
# 建立 # 构建模型
我们最初的进口包括我们的卷积网络的进口。 我们最初的进口包括我们的卷积网络的进口。
...@@ -311,7 +311,7 @@ train_x_noisy = np.clip(train_x_noisy, 0., 1.) ...@@ -311,7 +311,7 @@ train_x_noisy = np.clip(train_x_noisy, 0., 1.)
test_x_noisy = np.clip(test_x_noisy, 0., 1.) test_x_noisy = np.clip(test_x_noisy, 0., 1.)
``` ```
# 嘈杂的图像 # 噪声图像
下面的代码从测试集中打印出一些嘈杂的图像。 注意如何调整图像的显示形状: 下面的代码从测试集中打印出一些嘈杂的图像。 注意如何调整图像的显示形状:
...@@ -430,7 +430,7 @@ print(decoded.shape) ...@@ -430,7 +430,7 @@ print(decoded.shape)
因此,您可以看到解码层如何逆转编码层的过程。 因此,您可以看到解码层如何逆转编码层的过程。
# 型号汇总 # 模型摘要
这是我们模型的摘要: 这是我们模型的摘要:
...@@ -470,7 +470,7 @@ keras.callbacks.TensorBoard( ...@@ -470,7 +470,7 @@ keras.callbacks.TensorBoard(
tb = [TensorBoard(log_dir='./tmp/tb', write_graph=True)] tb = [TensorBoard(log_dir='./tmp/tb', write_graph=True)]
``` ```
接下来,我们使用`.fit()`方法训练自编码器。 以下代码是其签名: 接下来,我们使用`.fit()`方法训练自编码器。 以下代码是其签名:
```py ```py
fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_freq=1) fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_freq=1)
...@@ -528,10 +528,10 @@ tensorboard --logdir=./tmp/tb ...@@ -528,10 +528,10 @@ tensorboard --logdir=./tmp/tb
![](img/beed13e6-2d68-4db6-bd11-1d4fe2ea089d.png) ![](img/beed13e6-2d68-4db6-bd11-1d4fe2ea089d.png)
到此结束我们对自编码器的研究。 到此结束我们对自编码器的研究。
# 摘要 # 总结
在本章中,我们研究了自编码器在无监督学习中的两种应用:首先用于压缩数据,其次用于降噪,这意味着从图像中去除噪声。 在本章中,我们研究了自编码器在无监督学习中的两种应用:首先用于压缩数据,其次用于降噪,这意味着从图像中去除噪声。
在下一章中,我们将研究如何在图像处理和识别中使用神经网络。 在下一章中,我们将研究如何在图像处理和识别中使用神经网络。
\ No newline at end of file
...@@ -4,12 +4,12 @@ ...@@ -4,12 +4,12 @@
在本章中,我们将涵盖以下主要主题: 在本章中,我们将涵盖以下主要主题:
* 快速绘图–使用 TensorFlow 进行图像分类 * QuickDraw – 使用 TensorFlow 进行图像分类
* 使用 TensorFlow 的 CIFAR 10 图像分类 * 使用 TensorFlow 的 CIFAR 10 图像分类
在第一部分中,我们将使用在前几章中学到的技术开发 TensorFlow 2 模型以进行图像识别,尤其是第 2 章, “Keras,TensorFlow 2 的高级 API”。 这将使我们能够看到如何使用 TensorFlow 2 将所有相关技术结合在一起来创建,训练和评估完整的模型。我们将利用 Google 提供的 QuickDraw 图片数据集可帮助您解决此问题。 在第一部分中,我们将使用在前几章中学到的技术开发 TensorFlow 2 模型以进行图像识别,尤其是第 2 章, “Keras,TensorFlow 2 的高级 API”。 这将使我们能够看到如何使用 TensorFlow 2 将所有相关技术结合在一起来创建,训练和评估完整的模型。我们将利用 Google 提供的 QuickDraw 图片数据集可帮助您解决此问题。
# 快速绘图–使用 TensorFlow 进行图像分类 # QuickDraw – 使用 TensorFlow 进行图像分类
我们将使用从 Google QuickDraw 拍摄的图像数据集。 这是一个公开的开放源代码,它包含 345 个类别的 5000 万张图像的数据集,所有这些图像都是由参与挑战的 1500 万名用户在 20 秒或更短的时间内绘制的。 我们将训练 10 个类别的 10,000 张图像,其中一些被选择为相似图像,以便我们可以测试模型的区分能力。 您可以在[这个页面](https://quickdraw.withgoogle.com/data)上查看这些图像的示例。 这些图片有多种格式,请参见[这个页面](https://github.com/googlecreativelab/quickdraw-dataset)中的所有格式。 我们将使用从 Google QuickDraw 拍摄的图像数据集。 这是一个公开的开放源代码,它包含 345 个类别的 5000 万张图像的数据集,所有这些图像都是由参与挑战的 1500 万名用户在 20 秒或更短的时间内绘制的。 我们将训练 10 个类别的 10,000 张图像,其中一些被选择为相似图像,以便我们可以测试模型的区分能力。 您可以在[这个页面](https://quickdraw.withgoogle.com/data)上查看这些图像的示例。 这些图片有多种格式,请参见[这个页面](https://github.com/googlecreativelab/quickdraw-dataset)中的所有格式。
...@@ -271,7 +271,7 @@ for i in range(20): ...@@ -271,7 +271,7 @@ for i in range(20):
print("-------------------------") print("-------------------------")
``` ```
# 使用.h5 格式保存和加载 NumPy 图像数据 # 使用`.h5`格式保存和加载 NumPy 图像数据
如果需要保存先前程序中的培训和测试数据,则可以使用以下代码: 如果需要保存先前程序中的培训和测试数据,则可以使用以下代码:
...@@ -377,7 +377,7 @@ labels = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship ...@@ -377,7 +377,7 @@ labels = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship
![](img/477a48fd-96b7-4311-a7ac-a7760a1626da.png) ![](img/477a48fd-96b7-4311-a7ac-a7760a1626da.png)
# 应用程序 # 应用
首先,以下是设置所需的导入: 首先,以下是设置所需的导入:
...@@ -473,7 +473,7 @@ y_test = tf.keras.utils.to_categorical(y_test, number_of_classes) ...@@ -473,7 +473,7 @@ y_test = tf.keras.utils.to_categorical(y_test, number_of_classes)
model.add(Activation('elu')) model.add(Activation('elu'))
``` ```
`elu`激活功能代表指数线性单位。 在[这个页面](https://sefiks.com/2018/01/02/elu-as-a-neural-networks-activation-function/)中有很好的描述。 `elu`激活函数代表指数线性单位。 在[这个页面](https://sefiks.com/2018/01/02/elu-as-a-neural-networks-activation-function/)中有很好的描述。
注意,我们正在使用具有卷积层,`BatchNormalization`和 MaxPooling 层的顺序模型。 倒数第二层使结构变平,最后一层使用 softmax 激活,因此我们预测的类将显示为具有最高激活的输出神经元: 注意,我们正在使用具有卷积层,`BatchNormalization`和 MaxPooling 层的顺序模型。 倒数第二层使结构变平,最后一层使用 softmax 激活,因此我们预测的类将显示为具有最高激活的输出神经元:
...@@ -650,7 +650,7 @@ deer dog ...@@ -650,7 +650,7 @@ deer dog
到此结束了我们对 CIFAR 10 图像数据集的了解。 到此结束了我们对 CIFAR 10 图像数据集的了解。
# 摘要 # 总结
本章分为两个部分。 在第一部分中,我们研究了来自 Google 的数据集 QuickDraw。 我们介绍了它,然后看到了如何将其加载到内存中。 这很简单,因为 Google 善意地将数据集作为一组`.npy`文件提供,这些文件可以直接加载到 NumPy 数组中。 接下来,我们将数据分为训练,验证和测试集。 创建`ConvNet`模型后,我们对数据进行了训练并进行了测试。 在测试中,经过 25 个纪元,该模型的准确率刚好超过 90%,我们注意到,通过进一步调整模型,可能会改善这一精度。 最后,我们看到了如何保存经过训练的模型,然后如何重新加载它并将其用于进一步的推断。 本章分为两个部分。 在第一部分中,我们研究了来自 Google 的数据集 QuickDraw。 我们介绍了它,然后看到了如何将其加载到内存中。 这很简单,因为 Google 善意地将数据集作为一组`.npy`文件提供,这些文件可以直接加载到 NumPy 数组中。 接下来,我们将数据分为训练,验证和测试集。 创建`ConvNet`模型后,我们对数据进行了训练并进行了测试。 在测试中,经过 25 个纪元,该模型的准确率刚好超过 90%,我们注意到,通过进一步调整模型,可能会改善这一精度。 最后,我们看到了如何保存经过训练的模型,然后如何重新加载它并将其用于进一步的推断。
......
# 七、TensorFlow 2 和神经风格迁移 # 七、TensorFlow 2 和神经风格迁移
神经风格转换是一种使用神经网络将一幅图像的艺术风格施加到另一幅图像的内容上的技术,因此最终得到的是两种图像的混合体。 您开始使用的图像称为**内容图像**。 您在内容图像上加上风格的图像称为**风格参考图像**。 Google 将转换后的图像称为**输入图像**,这似乎令人困惑(输入是从两个不同来源获取输入的意思); 让我们将其称为**混合图像**。 因此,混合图像是具有风格参考图像风格的内容图像。 神经风格迁移是一种使用神经网络将一幅图像的艺术风格施加到另一幅图像的内容上的技术,因此最终得到的是两种图像的混合体。 您开始使用的图像称为**内容图像**。 您在内容图像上加上风格的图像称为**风格参考图像**。 Google 将转换后的图像称为**输入图像**,这似乎令人困惑(输入是从两个不同来源获取输入的意思); 让我们将其称为**混合图像**。 因此,混合图像是具有风格参考图像风格的内容图像。
神经风格迁移通过定义两个损失函数来工作-一个描述两个图像的内容之间的差异,另一个描述两个图像之间的风格差异。 神经风格迁移通过定义两个损失函数来工作-一个描述两个图像的内容之间的差异,另一个描述两个图像之间的风格差异。
...@@ -16,15 +16,15 @@ ...@@ -16,15 +16,15 @@
在本章中,我们将介绍以下主题: 在本章中,我们将介绍以下主题:
* 置导入 * 置导入
* 预处理图像 * 预处理图像
* 查看原始图像 * 查看原始图像
* 使用 VGG19 架构 * 使用 VGG19 架构
* 建立模型 * 建立模型
* 计算损失 * 计算损失
* 执行风格转换 * 执行风格迁移
# 置导入 # 置导入
要对您自己的图像使用此实现,您需要将这些图像保存在下载的存储库的`./tmp/nst`目录中,然后编辑`content_path``style_path`路径,如以下代码所示。 要对您自己的图像使用此实现,您需要将这些图像保存在下载的存储库的`./tmp/nst`目录中,然后编辑`content_path``style_path`路径,如以下代码所示。
...@@ -194,7 +194,7 @@ number_of_style_layers = len(style_layers) ...@@ -194,7 +194,7 @@ number_of_style_layers = len(style_layers)
# 建立模型 # 建立模型
现在,接下来是一系列功能,这些功能最终导致执行风格转换`run_style_transfer()`)的主要功能。 现在,接下来是一系列功能,这些功能最终导致执行风格迁移`run_style_transfer()`)的主要功能。
此序列中的第一个函数`get_model()`创建我们将要使用的模型。 此序列中的第一个函数`get_model()`创建我们将要使用的模型。
...@@ -323,7 +323,7 @@ def compute_grads(config): ...@@ -323,7 +323,7 @@ def compute_grads(config):
import IPython.display import IPython.display
``` ```
# 执行风格转换 # 执行风格迁移
执行`style_transfer`的功能很长,因此我们将分节介绍。 其签名如下: 执行`style_transfer`的功能很长,因此我们将分节介绍。 其签名如下:
...@@ -510,8 +510,8 @@ def show_results(best_image, content_path, style_path, show_large_final=True): ...@@ -510,8 +510,8 @@ def show_results(best_image, content_path, style_path, show_large_final=True):
show_results(best_image, content_path, style_path) show_results(best_image, content_path, style_path)
``` ```
# 摘要 # 总结
到此结束我们对神经风格转换的研究。 我们看到了如何拍摄内容图像和风格图像并生成混合图像。 我们使用训练有素的 VGG19 模型中的图层来完成此任务。 到此结束我们对神经风格迁移的研究。 我们看到了如何拍摄内容图像和风格图像并生成混合图像。 我们使用训练有素的 VGG19 模型中的图层来完成此任务。
在下一章中,我们将研究循环神经网络。 这些网络可以处理顺序的输入值,并且输入值和输出值中的一个或两个具有可变长度。 在下一章中,我们将研究循环神经网络。 这些网络可以处理顺序的输入值,并且输入值和输出值中的一个或两个具有可变长度。
\ No newline at end of file
...@@ -25,13 +25,13 @@ ...@@ -25,13 +25,13 @@
* 普通前馈网络,固定尺寸的输入和固定尺寸的输出,例如图像分类 * 普通前馈网络,固定尺寸的输入和固定尺寸的输出,例如图像分类
* 序列输出,例如,拍摄一张图像并输出一组用于标识图像中项目的单词的图像字幕 * 序列输出,例如,拍摄一张图像并输出一组用于标识图像中项目的单词的图像字幕
* 序列输入,例如情感识别(如我们的 IMDb 应用程序),其中句子被分为正面情感或负面情感 * 序列输入,例如情感识别(如我们的 IMDb 应用),其中句子被分为正面情感或负面情感
* 序列输入和输出,例如机器翻译,其中 RNN 接受英语句子并将其翻译为法语输出 * 序列输入和输出,例如机器翻译,其中 RNN 接受英语句子并将其翻译为法语输出
* 逐帧同步输入和输出的序列,例如,类似于视频分类的两者 * 逐帧同步输入和输出的序列,例如,类似于视频分类的两者
# 循环架构 # 循环架构
因此,需要一种新的体系结构来处理顺序到达的数据,并且其输入值和输出值中的一个或两个具有可变长度,例如,语言翻译应用程序中句子中的单词。 在这种情况下,模型的输入和输出都具有不同的长度,就像之前的第四种模式一样。 同样,为了预测给定当前词的后续词,还需要知道先前的词。 这种新的神经网络架构称为 RNN,专门设计用于处理顺序数据。 因此,需要一种新的体系结构来处理顺序到达的数据,并且其输入值和输出值中的一个或两个具有可变长度,例如,语言翻译应用中句子中的单词。 在这种情况下,模型的输入和输出都具有不同的长度,就像之前的第四种模式一样。 同样,为了预测给定当前词的后续词,还需要知道先前的词。 这种新的神经网络架构称为 RNN,专门设计用于处理顺序数据。
出现术语**循环**是因为此类模型对序列的每个元素执行相同的计算,其中每个输出都依赖于先前的输出。 从理论上讲,每个输出都取决于所有先前的输出项,但实际上,RNN 仅限于回顾少量步骤。 这种布置等效于具有存储器的 RNN,该存储器可以利用先前的计算结果。 出现术语**循环**是因为此类模型对序列的每个元素执行相同的计算,其中每个输出都依赖于先前的输出。 从理论上讲,每个输出都取决于所有先前的输出项,但实际上,RNN 仅限于回顾少量步骤。 这种布置等效于具有存储器的 RNN,该存储器可以利用先前的计算结果。
...@@ -72,7 +72,7 @@ RNN 在称为**沿时间反向传播**(**BPTT**)的过程中通过反向传 ...@@ -72,7 +72,7 @@ RNN 在称为**沿时间反向传播**(**BPTT**)的过程中通过反向传
# RNN 的应用 # RNN 的应用
在此应用程序中,我们将看到如何使用基于字符的循环神经网络创建文本。 更改要使用的文本的语料库很容易(请参见下面的示例); 在这里,我们将使用查尔斯·狄更斯(Charles Dickens)的小说《伟大的期望》。 我们将在此文本上训练网络,以便如果我们给它一个字符序列,例如`thousan`,它将产生序列中的下一个字符`d`。 此过程可以继续进行,可以通过在不断演变的序列上反复调用模型来创建更长的文本序列。 在此应用中,我们将看到如何使用基于字符的循环神经网络创建文本。 更改要使用的文本的语料库很容易(请参见下面的示例); 在这里,我们将使用查尔斯·狄更斯(Charles Dickens)的小说《伟大的期望》。 我们将在此文本上训练网络,以便如果我们给它一个字符序列,例如`thousan`,它将产生序列中的下一个字符`d`。 此过程可以继续进行,可以通过在不断演变的序列上反复调用模型来创建更长的文本序列。
这是训练模型之前创建的文本的示例: 这是训练模型之前创建的文本的示例:
...@@ -95,7 +95,7 @@ Pip; it was not to be done. I had been a little while I was a look out and the s ...@@ -95,7 +95,7 @@ Pip; it was not to be done. I had been a little while I was a look out and the s
# 我们的 RNN 示例的代码 # 我们的 RNN 示例的代码
此应用程序基于 Google 根据 Apache 2 许可提供的应用程序 此应用基于 Google 根据 Apache 2 许可提供的应用
像往常一样,我们会将代码分解成片段,然后将您引到存储库中获取许可证和完整的工作版本。 首先,我们有模块导入,如下所示: 像往常一样,我们会将代码分解成片段,然后将您引到存储库中获取许可证和完整的工作版本。 首先,我们有模块导入,如下所示:
...@@ -654,7 +654,7 @@ ago. “Yes, de ...@@ -654,7 +654,7 @@ ago. “Yes, de
`Loss = 0.6166`; 该模型现在似乎已正确配对了语音标记,并且没有无意义的单词。 `Loss = 0.6166`; 该模型现在似乎已正确配对了语音标记,并且没有无意义的单词。
# 摘要 # 总结
这样就结束了我们对 RNN 的研究。 在本章中,我们首先讨论了 RNN 的一般原理,然后介绍了如何获取和准备一些供模型使用的文本,并指出在此处使用替代文本源很简单。 然后,我们看到了如何创建和实例化我们的模型。 然后,我们训练了模型并使用它从起始字符串中产生文本,并注意到网络已了解到单词是文本的单位以及如何拼写各种各样的单词(有点像文本作者的风格), 几个非单词。 这样就结束了我们对 RNN 的研究。 在本章中,我们首先讨论了 RNN 的一般原理,然后介绍了如何获取和准备一些供模型使用的文本,并指出在此处使用替代文本源很简单。 然后,我们看到了如何创建和实例化我们的模型。 然后,我们训练了模型并使用它从起始字符串中产生文本,并注意到网络已了解到单词是文本的单位以及如何拼写各种各样的单词(有点像文本作者的风格), 几个非单词。
......
# 九、TensorFlow 估计器和 TensorFlow HUB # 九、TensorFlow 估计器和 TensorFlow HUB
本章分为两部分,但是此处的技术是相关的。 首先,我们将研究 TensorFlow 估计器如何为 TensorFlow 提供简单的高级 API,其次,我们将研究 TensorFlow Hub 如何包含可在自己的应用程序中使用的模块。 本章分为两部分,但是此处的技术是相关的。 首先,我们将研究 TensorFlow 估计器如何为 TensorFlow 提供简单的高级 API,其次,我们将研究 TensorFlow Hub 如何包含可在自己的应用中使用的模块。
在本章中,我们将涵盖以下主要主题: 在本章中,我们将涵盖以下主要主题:
...@@ -183,7 +183,7 @@ TensorFlow Hub 是一个软件库。 其目的是提供可重用的组件(称 ...@@ -183,7 +183,7 @@ TensorFlow Hub 是一个软件库。 其目的是提供可重用的组件(称
# IMDb(电影评论数据库) # IMDb(电影评论数据库)
在本节中,我们将研究一种基于 Google 的应用程序,该应用程序**情感分析**中分析了电影评论的 IMDb 的子集。 该子集由斯坦福大学主持,包含每部电影的评论,以及情感积极性等级为 1 到 4(差)和 7 到 10(好)的情感。 问题在于确定关于每个电影的文本句子中表达的视图的极性,即针对每个评论,以确定它是正面评论还是负面评论。 我们将在 TensorFlow Hub 中使用一个模块,该模块先前已经过训练以生成单词嵌入。 在本节中,我们将研究一种基于 Google 的应用,该应用**情感分析**中分析了电影评论的 IMDb 的子集。 该子集由斯坦福大学主持,包含每部电影的评论,以及情感积极性等级为 1 到 4(差)和 7 到 10(好)的情感。 问题在于确定关于每个电影的文本句子中表达的视图的极性,即针对每个评论,以确定它是正面评论还是负面评论。 我们将在 TensorFlow Hub 中使用一个模块,该模块先前已经过训练以生成单词嵌入。
词嵌入是数字的向量,因此具有相似含义的词也具有类似的向量。 这是监督学习的示例,因为评论的训练集将使用 IMDB 数据库提供的阳性值来训练模型。 然后,我们将在测试集上使用经过训练的模型,并查看其预测与 IMDB 数据库中存储的预测相比如何,从而为我们提供了一种准确度度量。 词嵌入是数字的向量,因此具有相似含义的词也具有类似的向量。 这是监督学习的示例,因为评论的训练集将使用 IMDB 数据库提供的阳性值来训练模型。 然后,我们将在测试集上使用经过训练的模型,并查看其预测与 IMDB 数据库中存储的预测相比如何,从而为我们提供了一种准确度度量。
...@@ -490,10 +490,10 @@ plt.ylabel("True"); ...@@ -490,10 +490,10 @@ plt.ylabel("True");
到此结束我们对 IMDb 情感分析的研究。 到此结束我们对 IMDb 情感分析的研究。
# 摘要 # 总结
在本章中,我们介绍了用于训练时装数据集的估计器。 我们了解了估计器如何为 TensorFlow 提供简单直观的 API。 在本章中,我们介绍了用于训练时装数据集的估计器。 我们了解了估计器如何为 TensorFlow 提供简单直观的 API。
然后,我们查看了另一个应用程序,这一次是对 IMDb 中电影评论的情感分类。 我们看到了 TensorFlow Hub 如何为我们提供文本嵌入,即单词的向量,这是具有相似含义的单词具有相似向量的地方。 然后,我们查看了另一个应用,这一次是对 IMDb 中电影评论的情感分类。 我们看到了 TensorFlow Hub 如何为我们提供文本嵌入,即单词的向量,这是具有相似含义的单词具有相似向量的地方。
在本书中,我们看到了 TensorFlow 2.0 alpha 的概述。 在本书中,我们看到了 TensorFlow 2.0 alpha 的概述。
\ No newline at end of file
# 第 2 部分:TensorFlow 2.00 Alpha 中的监督和无监督学习 # 第 2 部分:TensorFlow 2.00 Alpha 中的监督和无监督学习
在本节中,我们将首先看到 TensorFlow 在监督机器学习中的许多应用,包括线性回归,逻辑回归和聚类。 然后,我们将研究无监督学习,特别是应用于数据压缩和去噪的自编码。 在本节中,我们将首先看到 TensorFlow 在监督机器学习中的许多应用,包括线性回归,逻辑回归和聚类。 然后,我们将研究无监督学习,特别是应用于数据压缩和去噪的自编码。
本节包含以下章节: 本节包含以下章节:
......
# 第 3 部分:TensorFlow 2.00 Alpha 的神经网络应用 # 第 3 部分:TensorFlow 2.00 Alpha 的神经网络应用
在本节中,我们将研究许多**人工神经网络****ANN**)应用。 这些包括图像识别,神经风格转换,文本风格生成,时尚识别以及电影评论的 IMDb 数据库的语义分析。 在本节中,我们将研究许多**人工神经网络****ANN**)应用。 这些包括图像识别,神经风格迁移,文本风格生成,时尚识别以及电影评论的 IMDb 数据库的语义分析。
本节包含以下章节: 本节包含以下章节:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册