使用 TensorFlow Hub 对电影评论进行文本分类

tensorflow-header

此笔记本(notebook)使用评论文本将影评分为积极(positive)消极(nagetive)两类。这是一个二元(binary)或者二分类问题,一种重要且应用广泛的机器学习问题。

本教程演示了使用 Tensorflow Hub 和 Keras 进行迁移学习的基本应用。

我们将使用包含 Internet Movie Database 中的 50,000 条电影评论文本的 IMDB 数据集。先将这些评论分为两组,其中 25,000 条用于训练,另外 25,000 条用于测试。训练组和测试组是均衡的,也就是说其中包含相等数量的正面评价和负面评价。

此笔记本使用 tf.keras(一个在 TensorFlow 中用于构建和训练模型的高级 API)和 tensorflow_hub(一个用于在单行代码中从 TFHub 加载训练模型的库)。有关使用 tf.keras 的更高级的文本分类教程,请参阅 MLCC 文本分类指南

下载 IMDB 数据集

IMDB 评论或 TensorFlow Datasets 上提供了 IMDB 数据集。以下代码可将 IMDB 数据集下载到您的机器(或 Colab 运行时)上:

探索数据

我们花一点时间来了解数据的格式。每个样本都是一个代表电影评论的句子和一个相应的标签。句子未经过任何预处理。标签是一个整数值(0 或 1),其中 0 表示负面评价,1 表示正面评价。

我们来打印下前十个样本。

我们再打印下前十个标签。

构建模型

神经网络由堆叠的层创建而成,这需要从三个主要方面来进行体系结构决策:

  • 如何表示文本?
  • 在模型中使用多少个层?
  • 为每个层使用多少个隐藏单元

本示例中,输入数据由句子组成。预测的标签为 0 或 1。

表示文本的一种方式是将句子转换为嵌入向量。使用一个预训练文本嵌入向量作为首层,这样做有三个优点:

  • 不必担心文本预处理
  • 可以从迁移学习中受益
  • 嵌入向量具有固定大小,更易于处理

在本示例中,您使用来自 TensorFlow Hub 的 预训练文本嵌入向量模型,名称为 google/nnlm-en-dim50/2

本教程中还可以使用来自 TFHub 的许多其他预训练文本嵌入向量:

还有很多!在 TFHub 上查找更多文本嵌入向量模型

让我们首先创建一个使用 Tensorflow Hub 模型嵌入(embed)语句的Keras层,并在几个输入样本中进行尝试。请注意无论输入文本的长度如何,嵌入(embeddings)输出的形状都是:(num_examples, embedding_dimension)

现在让我们构建完整模型:

层按顺序堆叠以构建分类器:

  1. 第一层是 TensorFlow Hub 层。该层使用预训练的 SavedModel 将句子映射到其嵌入向量。您使用的预训练文本嵌入向量模型 (google/nnlm-en-dim50/2) 可将句子拆分为词例,嵌入每个词例,然后组合嵌入向量。生成的维度是:(num_examples, embedding_dimension)。对于此 NNLM 模型,embedding_dimension 为 50。
  2. 该定长输出向量通过一个有 16 个隐层单元的全连接层(Dense)进行管道传输。
  3. 最后一层与单个输出结点紧密相连。

我们来编译模型。

损失函数与优化器

一个模型需要一个损失函数和一个优化器来训练。由于这是一个二元分类问题,且模型输出 logits(具有线性激活的单一单元层),因此,我们将使用 binary_crossentropy 损失函数。

这并非损失函数的唯一选择,例如,您还可以选择 mean_squared_error。但是,一般来说,binary_crossentropy 更适合处理概率问题,它可以测量概率分布之间的“距离”,或者在我们的用例中,是指真实分布与预测值之间的差距。

稍后,当您探索回归问题(例如,预测房屋价格)时,您将看到如何使用另一个称为均方误差的损失函数。

现在,配置模型来使用优化器和损失函数:

训练模型

使用包含 512 个样本的 mini-batch 对模型进行 10 个周期的训练,也就是在 x_train 和 y_train 张量中对所有样本进行 10 次迭代。在训练时,监测模型在验证集的 10,000 个样本上的损失和准确率:

评估模型

我们来看一下模型的性能如何。将返回两个值。损失值(一个表示误差的数字,值越低越好)与准确率。

这种相当简单的方法可以达到约 87% 的准确率。使用更高级的方法,模型的准确率应该会接近 95%。