1. 准备工作
在此 Codelab 中,您将查看使用 TensorFlow 和 TensorFlow Lite Model Maker 创建的代码,这些代码使用基于垃圾注释的数据集来创建模型。Kaggle 上提供了原始数据。它已收集到单个 CSV 中,并通过移除损坏的文本、标记、重复字词等进行了清理。让您可以更轻松地专注于模型,而不是文本。
此处提供了您要查看的代码,但我们强烈建议您在 Google Colab 中使用该代码进行操作。
前提条件
- 此 Codelab 专为刚接触机器学习的有经验的开发者编写。
- 此 Codelab 是“移动设备文本分类入门”在线课程的一部分。如果您还没有完成之前的活动,请立即停下来先完成这些活动。
学习内容
- 如何使用 Google Colab 安装 TensorFlow Lite Model Maker
- 如何将数据从云服务器下载到您的设备
- 如何使用数据加载器
- 如何构建模型
所需条件
- 能够访问 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. 下载数据
接下来,您需要将数据从云服务器下载到您的设备,并将 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 可以读取这些元数据。
此元数据非常重要,因为它包含表示模型识别字词的词元字典。还记得之前学习过的词元成为词元,然后这些词元被赋予情感向量吗?您的移动应用需要知道这些令牌。例如,如果“狗”令牌化为 42,而您的用户键入“dog”之后,您的应用需要将“dog”42 来让模型理解它。作为 Android 开发者但 iOS 系统需要处理词汇表,因此在 iOS 设备上必须同时提供词汇表。Model Maker 可以通过指定 export_format
参数来导出该模型。因此,如需获取模型的标签和词汇表,您可以使用以下命令:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. 恭喜
此 Codelab 介绍了用于构建和导出模型的 Python 代码。文件末尾会有一个 .tflite 文件。
在下一个 Codelab 中,您将了解如何修改 Android 应用以使用此模型,以便开始对垃圾评论进行分类。