提交 98fd2b31 编写于 作者: W wizardforcel

2020-09-09 18:40:53

上级 8f859418
......@@ -440,12 +440,12 @@ print(decoded.shape)
公式是参数数量 = 过滤器数量 x 内核大小 x 上一层的深度 + 过滤器数量(用于偏差):
* input_1:这是一个占位符,没有可训练的参数
* conv2d:过滤器数量`= 32`,内核大小`= 3 * 3 = 9`,上一层的深度`= 1`,因此`32 * 9 + 32 = 320`
* max_pooling2d:最大池化层没有可训练的参数。
* conv2d_1:过滤器数`= 32`,内核大小`= 3 * 3 = 9`,上一层的深度`= 14`,因此`32 * 9 * 32 + 32 = 9,248`
* conv_2d_2,conv2d_3:与 conv2d_1 相同
* conv2d_4`1 * 9 * 32 + 1 = 289`
* `input_1`:这是一个占位符,没有可训练的参数
* `conv2d`:过滤器数量`= 32`,内核大小`= 3 * 3 = 9`,上一层的深度`= 1`,因此`32 * 9 + 32 = 320`
* `max_pooling2d`:最大池化层没有可训练的参数。
* `conv2d_1`:过滤器数`= 32`,内核大小`= 3 * 3 = 9`,上一层的深度`= 14`,因此`32 * 9 * 32 + 32 = 9,248`
* `conv_2d_2``conv2d_3`:与`conv2d_1`相同
* `conv2d_4``1 * 9 * 32 + 1 = 289`
# 模型实例化,编译和训练
......
......@@ -7,11 +7,11 @@
* 快速绘图–使用 TensorFlow 进行图像分类
* 使用 TensorFlow 的 CIFAR 10 图像分类
在第一部分中,我们将使用在前几章中学到的技术开发 TensorFlow 2 模型以进行图像识别,尤其是第 2 章, “Keras,TensorFlow 2 的高级 API”。 这将使我们能够看到如何使用 TensorFlow 2 将所有相关技术结合在一起来创建,训练和评估完整的模型。我们将利用 Quick Draw! Google 提供的图片数据集可帮助您解决此问题。
在第一部分中,我们将使用在前几章中学到的技术开发 TensorFlow 2 模型以进行图像识别,尤其是第 2 章, “Keras,TensorFlow 2 的高级 API”。 这将使我们能够看到如何使用 TensorFlow 2 将所有相关技术结合在一起来创建,训练和评估完整的模型。我们将利用 Google 提供的 QuickDraw 图片数据集可帮助您解决此问题。
# 快速绘图–使用 TensorFlow 进行图像分类
我们将使用从 Google Quick Draw 拍摄的图像! 数据集。 这是一个公开的开放源代码,它包含 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)中的所有格式。
在这里,我们将使用已存储为`.npy`文件的图像。 `.npy`文件的公共数据集托管在[这个页面](https://console.cloud.google.com/storage/browser/quickdraw_dataset/full/numpy_bitmap?pli=1)上。 从这里可以一次下载一组。 要使用不同的图像运行此示例,请从数据目录中删除图像文件,然后将所需的图像下载到存储库中的同一目录中。 该程序从文件名中读取标签。
......@@ -22,7 +22,7 @@
* 建立模型
* 训练和测试模型
* 保存,加载和重新测试模型
* 使用.h5 格式保存和加载 NumPy 图像数据
* 使用`.h5`格式保存和加载 NumPy 图像数据
* 加载预训练的模型
* 使用预先训练的模型
......@@ -123,7 +123,7 @@ for file in filenames:
x_train, x_test, y_train, y_test = train_test_split(x_all, y_all, test_size=0.2, random_state=42)
```
由于我们将使用卷积神经网络(`convNet`)对快速抽奖进行分类! 图像,接下来要做的是将`x_train``x_test`重塑为 28 x 28 x 1 图像,它们开始出现时的样子,其中前两个维度是图像的高度和宽度(以像素为单位),第三个维度是每个像素的灰度。 我们还将建立`input_shape`,并将其用于`convNet`的第一层:
由于我们将使用卷积神经网络(`convNet`)对快速抽奖进行分类! 图像,接下来要做的是将`x_train``x_test`重塑为`28 x 28 x 1`图像,它们开始出现时的样子,其中前两个维度是图像的高度和宽度(以像素为单位),第三个维度是每个像素的灰度。 我们还将建立`input_shape`,并将其用于`convNet`的第一层:
```py
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
......@@ -148,7 +148,7 @@ x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_siz
现在,我们准备创建`convNet`模型。
有两个卷积层(具有 ReLU 激活),每个卷积层都插入 maxpooling 和 dropout 层,然后是一个将卷积层的输出展平为一维的层。 在这些层之后是密集的(完全连接的)一维层(同样具有 ReLU 激活),最后的辍学层,最后是具有 10 个单元的 softmax 层。 softmax 层中每个输出单元的激活给出了该图像是 10 张图像之一的可能性。 这种 ANN 架构有足够的实验空间。
有两个卷积层(具有 ReLU 激活),每个卷积层都插入最大池化和丢弃层,然后是一个将卷积层的输出展平为一维的层。 在这些层之后是密集的(完全连接的)一维层(同样具有 ReLU 激活),最后的辍学层,最后是具有 10 个单元的 softmax 层。 softmax 层中每个输出单元的激活给出了该图像是 10 张图像之一的可能性。 这种 ANN 架构有足够的实验空间。
然后使用分类交叉熵的损失来编译模型:
......@@ -365,7 +365,7 @@ with tf.device('/cpu:0'):
具有 10 个类别的 CIFAR 10 图像数据集是 8000 万个微型图像数据集的标记子集。 这些图像由 Alex Krizhevsky,Vinod Nair 和 Geoffrey Hinton 收集。 有关此数据集的完整详细信息,请访问[这里](https://www.cs.toronto.edu/~kriz/cifar.html)
在 10 个类别中,总共有 60,000 个 32 x 32 彩色图像,包括 50,000 个训练图像和 10,000 个测试图像。
在 10 个类别中,总共有 60,000 个`32 x 32`彩色图像,包括 50,000 个训练图像和 10,000 个测试图像。
类别如下:
......@@ -453,7 +453,7 @@ show_images(x_test[:number_of_images*number_of_images])
请注意,图像在原始数据集中故意很小。
现在,我们可以将图像投射到浮动对象上,并将其范围更改为[0,1]
现在,我们可以将图像投射到浮动对象上,并将其范围更改为`[0, 1]`
```py
x_train = x_train.astype('float32')/255
......@@ -652,7 +652,7 @@ deer dog
# 摘要
本章分为两个部分。 在第一部分中,我们研究了快速抽奖! 来自 Google 的数据集。 我们介绍了它,然后看到了如何将其加载到内存中。 这很简单,因为 Google 善意地将数据集作为一组`.npy`文件提供,这些文件可以直接加载到 NumPy 数组中。 接下来,我们将数据分为训练,验证和测试集。 创建`ConvNet`模型后,我们对数据进行了训练并进行了测试。 在测试中,经过 25 个纪元,该模型的准确率刚好超过 90%,我们注意到,通过进一步调整模型,可能会改善这一精度。 最后,我们看到了如何保存经过训练的模型,然后如何重新加载它并将其用于进一步的推断。
本章分为两个部分。 在第一部分中,我们研究了来自 Google 的数据集 QuickDraw。 我们介绍了它,然后看到了如何将其加载到内存中。 这很简单,因为 Google 善意地将数据集作为一组`.npy`文件提供,这些文件可以直接加载到 NumPy 数组中。 接下来,我们将数据分为训练,验证和测试集。 创建`ConvNet`模型后,我们对数据进行了训练并进行了测试。 在测试中,经过 25 个纪元,该模型的准确率刚好超过 90%,我们注意到,通过进一步调整模型,可能会改善这一精度。 最后,我们看到了如何保存经过训练的模型,然后如何重新加载它并将其用于进一步的推断。
在第二部分中,我们训练了一个模型来识别 CIFAR 10 图像数据集中的图像。 该数据集包含 10 类图像,是用于测试体系结构和进行超参数研究的流行数据集。 我们的准确度刚刚超过 81%。
......
......@@ -65,7 +65,7 @@ style_path = './tmp/nst/zebra.jpg' # zebra:Yathin S Krishnappa, https://creative
# 预处理图像
下一个功能只需稍作预处理即可加载图像。 `Image.open()`是所谓的惰性操作。 该函数找到文件并将其打开以进行读取,但是实际上直到从您尝试对其进行处理或加载数据以来,才从文件中读取图像数据。 下一组三行会调整图像的大小,以便任一方向的最大尺寸为 512(`max_dimension`)像素。 例如,如果图像为 1,024 x 768,则`scale`将为 0.5(512 / 1,024),并且这将应用于图像的两个尺寸,从而将图像大小调整为 512 x384`Image.ANTIALIAS`参数保留最佳图像质量。 接下来,使用`img_to_array()`调用(`tensorflow.keras.preprocessing`的方法)将 PIL 图像转换为 NumPy 数组。
下一个功能只需稍作预处理即可加载图像。 `Image.open()`是所谓的惰性操作。 该函数找到文件并将其打开以进行读取,但是实际上直到从您尝试对其进行处理或加载数据以来,才从文件中读取图像数据。 下一组三行会调整图像的大小,以便任一方向的最大尺寸为 512(`max_dimension`)像素。 例如,如果图像为`1,024 x 768`,则`scale`将为 0.5(`512 / 1,024`),并且这将应用于图像的两个尺寸,从而将图像大小调整为`512 x 384``Image.ANTIALIAS`参数保留最佳图像质量。 接下来,使用`img_to_array()`调用(`tensorflow.keras.preprocessing`的方法)将 PIL 图像转换为 NumPy 数组。
最后,为了与以后的使用兼容,图像需要沿零轴的批次尺寸(由于图像是彩色的,因此共给出了四个尺寸)。 这可以通过调用`np.expand_dims()`实现:
......
# 使用 TensorFlow 2 的循环神经网络
包括 ConvNet(CNN)在内的许多神经网络体系结构的主要缺点之一是它们不允许处理顺序数据。 换句话说,一个完整的功能(例如图像)必须一次全部呈现。 因此,输入是固定长度张量,而输出必须是固定长度张量。 先前特征的输出值也不会以任何方式影响当前特征。 同样,所有输入值(和输出值)都应视为彼此独立。 例如,在我们的`fashion_mnist`模型(第 4 章“使用 TensorFlow 2的有监督机器学习”)中,每个输入时尚图像都独立于并且完全不了解先前图像。
包括卷积网络(CNN)在内的许多神经网络体系结构的主要缺点之一是它们不允许处理顺序数据。 换句话说,一个完整的功能(例如图像)必须一次全部呈现。 因此,输入是固定长度张量,而输出必须是固定长度张量。 先前特征的输出值也不会以任何方式影响当前特征。 同样,所有输入值(和输出值)都应视为彼此独立。 例如,在我们的`fashion_mnist`模型(第 4 章“使用 TensorFlow 2的有监督机器学习”)中,每个输入时尚图像都独立于并且完全不了解先前图像。
**循环神经网络****RNN**)克服了这个问题,并使许多新的应用成为可能。
......@@ -35,7 +35,7 @@
出现术语**循环**是因为此类模型对序列的每个元素执行相同的计算,其中每个输出都依赖于先前的输出。 从理论上讲,每个输出都取决于所有先前的输出项,但实际上,RNN 仅限于回顾少量步骤。 这种布置等效于具有存储器的 RNN,该存储器可以利用先前的计算结果。
RNN 用于顺序输入值,例如时间序列,音频,视频,语音,文本,财务和天气数据。 它们在消费产品中的使用示例包括 Apple 的 Siri,Google 的 Translate 和亚马逊的 Alexa。
RNN 用于顺序输入值,例如时间序列,音频,视频,语音,文本,财务和天气数据。 它们在消费产品中的使用示例包括 Apple 的 Siri,Google 翻译和亚马逊的 Alexa。
将传统前馈网络与 RNN 进行比较的示意图如下:
......@@ -72,7 +72,7 @@ RNN 在称为**沿时间反向传播**(**BPTT**)的过程中通过反向传
# RNN 的应用
在此应用程序中,我们将看到如何使用基于字符的循环神经网络创建文本。 更改要使用的文本的语料库很容易(请参见下面的示例); 在这里,我们将使用查尔斯·狄更斯(Charles Dickens)的小说《期望》。 我们将在此文本上训练网络,以便如果我们给它一个字符序列,例如`thousan`,它将产生序列中的下一个字符`d`。 此过程可以继续进行,可以通过在不断演变的序列上反复调用模型来创建更长的文本序列。
在此应用程序中,我们将看到如何使用基于字符的循环神经网络创建文本。 更改要使用的文本的语料库很容易(请参见下面的示例); 在这里,我们将使用查尔斯·狄更斯(Charles Dickens)的小说《伟大的期望》。 我们将在此文本上训练网络,以便如果我们给它一个字符序列,例如`thousan`,它将产生序列中的下一个字符`d`。 此过程可以继续进行,可以通过在不断演变的序列上反复调用模型来创建更长的文本序列。
这是训练模型之前创建的文本的示例:
......@@ -83,7 +83,7 @@ Next Char Predictions:
"dUFdZ!mig())'(ZIon“4g&HZ”@\nWGWtlinnqQY*dGJ7ioU'6(vLKL&cJ29LG'lQW8n-,M!JSVy”cjN;1cH\ndEEeMXhtW$U8Mt&sp"
```
这是一些文本,其中包含`Pip`序列,该序列是在模型经过 0.1 个温度(请参阅下文)进行 100 个时期(约 10 秒/个)的训练后创建的:
这是一些文本,其中包含`Pip`序列,该序列是在模型经过 0.1 个温度(请参阅下文)进行 100 个时期(约 10 秒个)的训练后创建的:
```py
Pip; it was not to be done. I had been a little while I was a look out and the strength of considerable particular by the windows of the rest of his prospering look at the windows of the room wing and the courtyard in the morning was the first time I had been a very much being strictly under the wall of my own person to me that he had done my sister, and I went on with the street common, I should have been a very little for an air of the river by the fire. For the man who was all the time of the money. My dear Herbert, who was a little way to the marshes he had ever seemed to have had once more than once and the more was a ragged hand before I had ever seemed to have him a dreadful loveriement in his head and with a falling to the table, and I went on with his arms, I saw him ever so many times, and we all the courtyard to the fire to be so often to be on some time when I saw his shoulder as if it were a long time in the morning I was a woman and a singer at the tide was remained by the
......
# TensorFlow 估计器和 TensorFlow 集线器
# TensorFlow 估计器和 TensorFlow HUB
本章分为两部分,但是此处的技术是相关的。 首先,我们将研究 TensorFlow 估计器如何为 TensorFlow 提供简单的高级 API,其次,我们将研究 TensorFlow Hub 如何包含可在自己的应用程序中使用的模块。
在本章中,我们将涵盖以下主要主题:
* TensorFlow 估计器
* TensorFlow 集线器
* TensorFlow HUB
# TensorFlow 估计器
`tf.estimator`是 TensorFlow 的高级 API。 它通过提供用于服务模型的直接训练,评估,预测和导出的方法来简化机器学习编程。
估计器为 TensorFlow 开发人员带来了许多优势。 与低级 API 相比,使用 Estimators 开发模型更容易,更直观。 特别是,同一模型可以在本地计算机或分布式多服务器系统上运行。 该模型也不了解其所处的处理器,即 CPU,GPU 或 TPU。 估计器还通过简化模型开发人员共享实现的过程,简化了开发过程,并且由于构建在 Keras 层上,因此使自定义更加简单。
估计器为 TensorFlow 开发人员带来了许多优势。 与低级 API 相比,使用估计器开发模型更容易,更直观。 特别是,同一模型可以在本地计算机或分布式多服务器系统上运行。 该模型也不了解其所处的处理器,即 CPU,GPU 或 TPU。 估计器还通过简化模型开发人员共享实现的过程,简化了开发过程,并且由于构建在 Keras 层上,因此使自定义更加简单。
估计器会处理与 TensorFlow 模型一起使用的所有背景管线。 它们支持安全,分布式的训练循环,用于图形构建,变量初始化,数据加载,异常处理,创建检查点文件,从故障中恢复以及为 TensorBoard 保存摘要。 正如我们将看到的,由于它们创建检查点,因此它们支持在给定数量的步骤之后停止和开始训练。
开发 Estimator 模型的过程分为四个步骤:
开发估计器模型的过程分为四个步骤:
1. 采集数据并创建数据功能
2. 创建功能列
......@@ -35,7 +35,7 @@ import tensorflow as tf
import numpy as np
```
接下来,我们获取并预处理数据。 注意,`tf.keras.datasets`中方便地存在`fashion_mnist`。 数据集中的`x`值采用整数 NumPy 数组的形式,每个元素的范围为 0 到 255,代表 28 x 28 像素时尚图像中每个像素的灰度值。 为了进行培训,必须将这些值转换为 0 到 1 范围内的浮点数。`y`值采用无符号 8 位整数`(uint8)`的形式,并且必须转换为 32 位整数(`int32` ),供估计工具再次使用。
接下来,我们获取并预处理数据。 注意,`tf.keras.datasets`中方便地存在`fashion_mnist`。 数据集中的`x`值采用整数 NumPy 数组的形式,每个元素的范围为 0 到 255,代表`28 x 28`像素时尚图像中每个像素的灰度值。 为了进行培训,必须将这些值转换为 0 到 1 范围内的浮点数。`y`值采用无符号 8 位整数`(uint8)`的形式,并且必须转换为 32 位整数(`int32` ),供估计工具再次使用。
尽管可以用以下方法试验该超参数值,但将学习率设置为一个很小的值:
......@@ -93,7 +93,7 @@ test_input_fn = tf.compat.v1.estimator.inputs.numpy_input_fn(
)
```
接下来,我们建立功能列。 功能列是一种将数据传递给 Estimator 的方法。
接下来,我们建立功能列。 功能列是一种将数据传递给估计器的方法。
功能列功能的签名如下。 `key`是唯一的字符串,是与我们先前在输入函数中指定的字典名称相对应的列名称(有关不同类型的功能列的更多详细信息,请参见[这里](https://www.tensorflow.org/api_docs/python/tf/feature_column)):
......@@ -107,13 +107,13 @@ tf.feature_column.numeric_column(
)
```
在我们的特定功能列中,我们可以看到关键是`"x"`,并且形状就是`fashion_mnist`数据集图像的 28 x 28 像素形状:
在我们的特定功能列中,我们可以看到关键是`"x"`,并且形状就是`fashion_mnist`数据集图像的`28 x 28`像素形状:
```py
feature_columns = [tf.feature_column.numeric_column("x", shape=[28, 28])]
```
接下来,我们实例化我们的 Estimator,它将进行分类。 它将为我们构建一个深度神经网络。 它的签名很长很详细,因此我们将带您参考[这里](https://www.tensorflow.org/api_docs/python/tf/estimator/DNNClassifier),因为我们将主要使用其默认参数。 它的第一个参数是我们刚刚指定的功能,而第二个参数是我们的网络规模。 (输入层和输出层由 Estimator 在后台添加。)`AdamOptimizer`是安全的选择。 `n_classes`对应于我们`fashion_mnist`数据集的`y`标签数量,我们在其中添加了`0.1`的适度`dropout`。 然后,`model_dir`是我们保存模型参数及其图形和检查点的目录。 此目录还用于将检查点重新加载到 Estimator 中以继续训练:
接下来,我们实例化我们的估计器,它将进行分类。 它将为我们构建一个深度神经网络。 它的签名很长很详细,因此我们将带您参考[这里](https://www.tensorflow.org/api_docs/python/tf/estimator/DNNClassifier),因为我们将主要使用其默认参数。 它的第一个参数是我们刚刚指定的功能,而第二个参数是我们的网络规模。 (输入层和输出层由估计器在后台添加。)`AdamOptimizer`是安全的选择。 `n_classes`对应于我们`fashion_mnist`数据集的`y`标签数量,我们在其中添加了`0.1`的适度`dropout`。 然后,`model_dir`是我们保存模型参数及其图形和检查点的目录。 此目录还用于将检查点重新加载到估计器中以继续训练:
```py
# Build 2 layer DNN classifier
......@@ -175,9 +175,9 @@ tensorboard --logdir=./tmp/mnist_modelx
![](img/5b1262f0-e388-4537-ae0f-fe7ee09b7bb9.png)
到此结束我们对时尚 Estimator 分类器的了解。 现在我们来看看 TensorFlow Hub。
到此结束我们对时尚估计器分类器的了解。 现在我们来看看 TensorFlow Hub。
# TensorFlow 集线器
# TensorFlow HUB
TensorFlow Hub 是一个软件库。 其目的是提供可重用的组件(称为模块),这些组件可在开发组件的原始上下文之外的上下文中使用。 所谓模块,是指 TensorFlow 图的一个独立部分及其权重,可以在其他类似任务中重复使用。
......@@ -222,7 +222,7 @@ TensorFlow Hub 是一个软件库。 其目的是提供可重用的组件(称
# 代码
现在,让我们看一下在这些数据上训练的代码。 在程序的顶部,我们有通常的导入,以及可能需要与`pip``tensorflow_hub``pandas``seaborn`一起安装的三个额外的导入。 如前所述,我们将使用`tensorflow_hub`中的模块; 我们还将使用`pandas`的一些 DataFrame 属性和`seaborn`的一些绘制方法:
现在,让我们看一下在这些数据上训练的代码。 在程序的顶部,我们有通常的导入,以及可能需要与`pip``tensorflow_hub``pandas``seaborn`一起安装的三个额外的导入。 如前所述,我们将使用`tensorflow_hub`中的模块; 我们还将使用`pandas`的一些`DataFrame`属性和`seaborn`的一些绘制方法:
```py
import tensorflow as tf
......@@ -254,7 +254,7 @@ optimizer = tf.optimizers.Adagrad(learning_rate=learning_rate)
* `pos`:包含文本文件的集合。 每个文本文件都是正面评价(极性为 1)。
* `neg`:包含文本文件的集合。 每个文本文件都是负面评论(极性为 0)。
情感(分别为 7 到 10 或 1 到 4)记录在文件名中; 例如,文件名为`18_7.txt`的文本文件评论的情感为 7(pos),而文件名为`38_2.txt`的文本文件评论的情感为 2(neg):
情感(分别为 7 到 10 或 1 到 4)记录在文件名中; 例如,文件名为`18_7.txt`的文本文件评论的情感为 7(`pos`),而文件名为`38_2.txt`的文本文件评论的情感为 2(`neg`):
![](img/5b2f5728-0221-484e-b748-dd9191aa5d53.png)
......@@ -262,11 +262,11 @@ IMDb 目录/文件层次结构
我们从调用层次结构中的三个功能开始,这些功能获取并预处理审阅数据。
在第一个函数`load_data(directory)`中,`directory_data`是一个字典,其中加载了`directory`中的数据,该数据作为参数传入并作为 pandas DataFrame 返回。
在第一个函数`load_data(directory)`中,`directory_data`是一个字典,其中加载了`directory`中的数据,该数据作为参数传入并作为 pandas `DataFrame`返回。
`description``sentiment`键初始化`directory_data`字典,然后将它们分配为空列表作为值。
然后,该功能循环遍历`directory`中的每个文件,并且对于每个文本文件,读取其内容(作为电影评论)并将其附加到情感列表中。 然后,它使用正则表达式分析文件名并提取数字情感,如前所示,该数字情感紧随文件名中的下划线(`_`)。 该函数将此数字情感附加到`sentiment`列表中。 当所有`.txt`文件都循环通过后,该函数将返回已转换为 pandas DataFrame 的字典:
然后,该功能循环遍历`directory`中的每个文件,并且对于每个文本文件,读取其内容(作为电影评论)并将其附加到情感列表中。 然后,它使用正则表达式分析文件名并提取数字情感,如前所示,该数字情感紧随文件名中的下划线(`_`)。 该函数将此数字情感附加到`sentiment`列表中。 当所有`.txt`文件都循环通过后,该函数将返回已转换为 pandas `DataFrame`的字典:
```py
# Load all files from a directory into a Pandas DataFrame.
......@@ -281,7 +281,7 @@ def load_data(directory):
return pd.DataFrame.from_dict(directory_data)
```
如我们前面所述,下一个函数`load(directory)`调用`load_data(directory)``pos``neg`子目录创建一个 DataFrame。 它将适当的极性作为额外字段添加到每个 DataFrame。 然后,它返回一个新的 DataFrame,该数据帧由`pos``neg` DataFrame 的串联组成,经过混洗(`sample(frac=1)`),并插入了新的数字索引(因为我们已经对行进行了混排):
如我们前面所述,下一个函数`load(directory)`调用`load_data(directory)``pos``neg`子目录创建一个`DataFrame`。 它将适当的极性作为额外字段添加到每个`DataFrame`。 然后,它返回一个新的`DataFrame`,该数据帧由`pos``neg``DataFrame`的串联组成,经过混洗(`sample(frac=1)`),并插入了新的数字索引(因为我们已经对行进行了混排):
```py
# Merge positive and negative examples, add a polarity column and shuffle.
......@@ -294,7 +294,7 @@ def load(directory):
return pd.concat([positive_df, negative_df]).sample(frac=1).reset_index(drop=True)
```
第三个也是最后一个功能是`acquire_data()`。 如果缓存中不存在该函数,则使用 Keras 实用程序从 Stanford URL 中获取我们所需的文件。 默认情况下,高速缓存是位于`~/.keras/datasets`的目录,如有必要,文件将提取到该位置。 该实用程序将返回到我们的 IMDb 的路径。 然后将其传递给`load_dataset()`的两个调用,以获取火车和测试 DataFrame
第三个也是最后一个功能是`acquire_data()`。 如果缓存中不存在该函数,则使用 Keras 实用程序从 Stanford URL 中获取我们所需的文件。 默认情况下,高速缓存是位于`~/.keras/datasets`的目录,如有必要,文件将提取到该位置。 该实用程序将返回到我们的 IMDb 的路径。 然后将其传递给`load_dataset()`的两个调用,以获取火车和测试`DataFrame`
```py
# Download and process the dataset files.
......@@ -310,7 +310,7 @@ def acquire_data():
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
```
主程序要做的第一件事是通过调用我们刚刚描述的函数来获取训练并测试 pandas DataFrames
主程序要做的第一件事是通过调用我们刚刚描述的函数来获取训练并测试 pandas `DataFrame`
```py
train_df, test_df = acquire_data()
......@@ -318,7 +318,7 @@ train_df, test_df = acquire_data()
此时,`train_df``test_df`包含我们要使用的数据。
在查看下一个片段之前,让我们看一下它的签名。 这是一个 Estimator,它返回用于将 Pandas DataFrame 馈入模型的输入函数:
在查看下一个片段之前,让我们看一下它的签名。 这是一个估计器,它返回用于将 Pandas `DataFrame`馈入模型的输入函数:
```py
tf.compat.v1.estimator.inputs.pandas_input_fn(x, y=None, batch_size=128, num_epochs=1, shuffle=None, queue_capacity=1000, num_threads=1, target_column='target')
......@@ -347,7 +347,7 @@ predict_train_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(train_df,
predict_test_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(test_df, test_df["polarity"], shuffle=False)
```
然后,我们有功能列。 功能列是原始数据和估计器之间的中介。 共有九种功能列类型。 它们根据其类型采用数值或分类数据,然后将数据转换为适用于 Estimator 的格式。 在[这个页面](https://www.tensorflow.org/guide/feature_columns)上有一个出色的描述以及许多示例。
然后,我们有功能列。 功能列是原始数据和估计器之间的中介。 共有九种功能列类型。 它们根据其类型采用数值或分类数据,然后将数据转换为适用于估计器的格式。 在[这个页面](https://www.tensorflow.org/guide/feature_columns)上有一个出色的描述以及许多示例。
请注意,嵌入来自`tf.hub`
......@@ -377,9 +377,9 @@ estimator = tf.estimator.DNNClassifier(
, loss_reduction=tf.compat.v1.losses.Reduction.SUM)
```
我们可以看到,我们将使用具有 500 和 100 个单位的隐藏层的神经网络,我们先前定义的要素列,两个输出类(标签)和 ProximalAdagrad 优化器。
我们可以看到,我们将使用具有 500 和 100 个单位的隐藏层的神经网络,我们先前定义的要素列,两个输出类(标签)和`ProximalAdagrad`优化器。
请注意,与前面的示例一样,由于我们指定了`model_dir`,因此 Estimator 将保存一个检查点和各种模型参数,以便在重新训练时,将从该目录加载模型并对其进行进一步的训练`steps`
请注意,与前面的示例一样,由于我们指定了`model_dir`,因此估计器将保存一个检查点和各种模型参数,以便在重新训练时,将从该目录加载模型并对其进行进一步的训练`steps`
现在,我们可以使用以下代码来训练我们的网络:
......@@ -492,7 +492,7 @@ plt.ylabel("True");
# 摘要
在本章中,我们介绍了用于训练时装数据集的估计器。 我们了解了 Estimators 如何为 TensorFlow 提供简单直观的 API。
在本章中,我们介绍了用于训练时装数据集的估计器。 我们了解了估计器如何为 TensorFlow 提供简单直观的 API。
然后,我们查看了另一个应用程序,这一次是对 IMDb 中电影评论的情感分类。 我们看到了 TensorFlow Hub 如何为我们提供文本嵌入,即单词的向量,这是具有相似含义的单词具有相似向量的地方。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册