1. 准备工作
在此 Codelab 中,您将查看使用 TensorFlow 和 TensorFlow Lite Model Maker 创建的代码,以使用基于垃圾评论的数据集创建模型。Kaggle 上提供了原始数据。这些数据已收集到一个 CSV 文件中,并通过移除损坏的文本、标记、重复字词等进行了清理。让您可以更轻松地专注于模型,而不是文本。
此处提供了您要查看的代码,但我们强烈建议您参考 Google Colab 中的代码。
前提条件
- 此 Codelab 专为刚接触机器学习的有经验的开发者编写。
- 此 Codelab 是《移动文本分类入门》开发者在线课程的一部分。如果您还没有完成之前的活动,请立即停下来先完成这些活动。
学习内容
- 如何使用 Google Colab 安装 TensorFlow Lite Model Maker
- 如何将数据从 Cloud 服务器下载到您的设备
- 如何使用数据加载器
- 如何构建模型
所需条件
- 能够访问 Google 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. 下载数据
接下来,您需要将数据从 Cloud 服务器下载到您的设备,并将 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 参数是您要用于每个字词矢量的维度数。根据研究确定的经验法则是,它是字词数量的四次方根。例如,如果您使用 2000 个字词,一个不错的起点是 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,并且您会看到每行上的第二个条目是 True 或 False,,用于表明该文本是否被视为垃圾评论。其他属性用于设置您之前创建的 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)。
机器学习的基本原则是模式匹配形式。首先,它会加载预训练的字词权重,并尝试将它们组合在一起,同时预测哪些字词组合在一起表示垃圾内容,哪些不是。第一次运行时,结果很可能接近 50:50,因为模型才刚刚开始。

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

到第 50 个周期时,模型报告的准确率会高得多。在本例中,准确率显示为 99%!
在右侧,您会看到验证准确率数字。这些数字通常会比训练准确率低一些,因为它们表明模型如何对之前未“见过”的数据进行分类。它使用我们之前预留的 10% 测试数据。

8. 导出模型
训练完成后,您可以导出模型。
TensorFlow 以自己的格式训练模型,这需要转换为 TFLITE 格式,才能在移动应用中使用。Model Maker 会为您处理这种复杂性。
只需导出模型,并指定一个目录:
model.export(export_dir='/mm_spam')
在该目录中,您会看到一个 model.tflite 文件。下载该文件。您将在下一个 Codelab 中需要它,您将在其中将其添加到 Android 应用!
iOS 注意事项
您刚刚导出的 .tflite 模型非常适合 Android,因为有关模型的元数据嵌入在其中,并且 Android Studio 可以读取该元数据。
此元数据非常重要,因为它包含一个词元字典,用于将字词表示为模型识别的字词。还记得之前您学习过字词会变成词元,然后这些词元会被赋予矢量以表示其情感吗?您的移动应用需要知道这些令牌。例如,如果“dog”被标记为 42,并且您的用户在句子中输入“dog”,那么您的应用需要将“dog”转换为 42,以便模型能够理解它。作为 Android 开发者,您将拥有一个“TensorFlow Lite Task Library”,这使得使用此功能更加轻松,但在 iOS 上,您需要处理词汇表,因此需要提供该词汇表。Model Maker 可以通过指定 export_format 参数为您导出此词汇表。因此,如需获取模型的标签和词汇表,您可以使用以下代码:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. 恭喜
此 Codelab 引导您学完了用于构建和导出模型的 Python 代码。最后,您将获得一个 .tflite 文件。
在下一个 Codelab 中,您将了解如何修改 Android 应用以使用此模型,以便开始对垃圾评论进行分类。