使用 TensorFlow Lite Model Maker 训练垃圾评论检测模型

1. 准备工作

在此 Codelab 中,提供了使用 TensorFlow 和 TensorFlow Lite Model Maker 创建的代码,您可以进行查看以使用数据集基于垃圾评论来创建模型。Kaggle 上提供了原始数据。这些数据已收集到一个 CSV 文件中,并通过移除损坏的文本、标记、重复字词等进行了清理。让您可以更轻松地专注于模型,而不是文本。

此处提供了您要查看的代码,但我们强烈建议您参考 Colaboratory 中的代码

前提条件

学习内容

  • 如何使用 Colab 安装 TensorFlow Lite Model Maker。
  • 如何将数据从 Colab 服务器下载到您的设备。
  • 如何使用数据加载器。
  • 如何构建模型。

您需要满足的条件

  • Colab 的访问权限

2. 安装 TensorFlow Lite Model Maker

  • 打开 Colab。笔记本中的第一个单元会为您安装 TensorFLow Lite Model Maker:
!pip install -q tflite-model-maker

完成后,请移至下一个单元。

3. 导入代码

下一个单元中包含许多导入项,笔记本中的代码需要使用这些导入项:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

上述代码还会检查您是否运行了 TensorFlow 2.x(这是使用 Model Maker 的必要条件)。

4. 下载数据

接下来,您需要将数据从 Colab 服务器下载到您的设备,并将 data_file 变量设置为指向本地文件:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
  extract=False)

Model Maker 可以通过像这样的简单 CSV 文件训练模型。您只需指定哪些列包含文本,哪些列包含标签,稍后您将在此 Codelab 中了解如何操作。

5. 预先学习的嵌入

通常,在使用 Model Maker 时,您无需从头开始构建模型。您可使用现有模型,然后根据需要进行自定义。

如本例所示,语言模型便会使用预先学习的嵌入。嵌入背后的理念是将字词转换为数字,在整个语料库中每个字词都对应着一个数字。嵌入是一种矢量,用于通过建立字词的“方向”来确定该字词的情感。例如,常用于垃圾评论中的字词的矢量会指向类似方向,而无此情感指向的字词的矢量则指向相反的方向。

使用预先学习的嵌入时,您可以先从字词语料库(或语料集)开始,其中的字词已通过大量文本学习了情感,因此您获得解决方案的速度要比从头开始快得多。

Model Maker 提供多个您可以使用的预先学习的嵌入,但最简单快捷的上手方式是使用 average_word_vec 选项。

它的代码如下:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

num_words 参数

您还可以指定希望模型使用的字词数量。

您可能认为“数量越多越好”,但通常适当的数量才是最好的,这一数量由每个字词的使用频率而定。如果您使用整个语料库中的每个字词,模型可能会去尝试学习那些仅使用一次的字词并为其建立方向。在任何文本语料库中,都有许多只会使用一两次的字词,由于它们对总体情感的影响微乎其微,因此并不值得在您的模型中包含这些字词。

您可以使用 num_words 参数,根据所需的字词数量来调整模型。字词数量越少,模型就越小速度也会更快,但会降低准确率,因为模型能识别的字词更少。反之,字词数量越多,模型可能越大速度也会更慢。因此找到最佳平衡点非常重要!

wordvec_dim 参数

wordved_dim 参数是您要用于每个字词矢量的维度数。经过研究确定的经验法则是,该参数为字词数量的四次方根。例如,如果您使用 2,000 个字词,那么 7 便是一个不错的起点。如果您更改了所用的字词数量,也可以更改此参数。

seq_len 参数

当涉及到输入值时,模型通常缺少弹性。对于语言模型而言,这意味着语言模型可以对具有特定静态长度的句子进行分类。分类取决于 seq_len 参数或序列长度。

当您将字词转换为数字或词元,一个句子就会变为这些词元的序列。在本例中,您的模型经过训练,可以对包含 20 个词元的句子进行分类和识别。如果句子长度超过此数量,则会被截断。如果句子长度短于此数量,则会进行填充。您可以在用于填充的语料库中看到专用的 <PAD> 词元。

6. 使用数据加载器

您之前下载了 CSV 文件。现在,您可以使用数据加载器将其转换为模型能够识别的训练数据:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

如果您在编辑器中打开该 CSV 文件,会看到每行只有两个值,文件的第一行文本对这些值进行了说明。通常,每个条目被视为一列。

您会看到,第一列的描述符为 commenttext,而且每行的第一个条目都是评论的文本。同样,第二列的描述符是 spam,并且您会看到每行上的第二个条目是 TrueFalse,,用于表明该文本是否被视为垃圾评论。其他属性用于设置您之前创建的 model_spec 变量以及分隔符(在本例中为英文逗号,因为该文件是以英文逗号分隔的)。您将使用此数据训练模型,因此 is_Training 会设置为 True

您需要保留部分数据用于测试模型。将数据拆分,其中 90% 用于训练,其余 10% 用于测试/评估。由于我们执行此操作时要确保测试数据是随机选择的,而不是数据集“底部”的 10%,因此,您可以在加载数据时使用 shuffle=True 进行随机化处理。

7. 构建模型

下一个单元是一行代码,仅用于构建模型:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
                               validation_data=test_data)

此代码使用 Model Maker 创建一个文本分类器模型,您需要指定要使用的训练数据(在第 4 步中设置)、模型规范(在第 4 步中设置)以及周期数(在本例中为 50)。

机器学习的基本原理是,它是一种模式匹配。最初,它会加载字词的预训练权重,并尝试将它们组合在一起,以预测是否为垃圾内容,如果组合成功则表示为垃圾内容,否则便不是。第一轮可能会进行均匀拆分,因为才刚刚开始构建模型。

c42755151d511ce.png

接下来,它会测量此训练周期的结果并运行优化代码,以调整其预测,然后重试。这就是一个周期。因此,通过将周期指定为 50,它将经历该“循环”50 次。

7d0ee06a5246b58d.png

到第 50 个周期时,模型报告的准确率会高得多。在本例中,它显示 99%

验证准确率数字通常略低于训练准确率,因为它们表明模型如何对之前未见过的数据进行分类。它会使用您之前预留的那 10% 的测试数据。

f063ff6e1d2add67.png

8. 导出模型

  1. 运行此单元以指定目录并导出模型:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. 压缩整个 /mm_spam_savedmodel 文件夹,然后下载生成的 mm_spam_savedmodel.zip 文件,您在下一个 Codelab 中需要用到该文件。
# Rename the SavedModel subfolder to a version number
!mv /mm_spam_savedmodel/saved_model /mm_spam_savedmodel/123
!zip -r mm_spam_savedmodel.zip /mm_spam_savedmodel/

9. 恭喜

此 Codelab 引导您学完了用于构建和导出模型的 Python 代码。现在,您已拥有一个 SavedModel,并且在其末尾添加了标签和词汇表。在下一个 Codelab 中,您将了解如何使用此模型,以便开始对垃圾评论进行分类。

了解详情