1. 准备工作
在此 Codelab 中,提供了使用 TensorFlow 和 TensorFlow Lite Model Maker 创建的代码,您可以进行查看以使用数据集基于垃圾评论来创建模型。Kaggle 上提供了原始数据。这些数据已收集到一个 CSV 文件中,并通过移除损坏的文本、标记、重复字词等进行了清理。让您可以更轻松地专注于模型,而不是文本。
此处提供了您要查看的代码,但我们强烈建议您参考 Colaboratory 中的代码。
前提条件
- 此 Codelab 专为刚接触机器学习的有经验的开发者编写。
- 此 Codelab 是《Flutter 应用文本分类入门》在线课程的一部分。如果您还没有完成之前的活动,请立即停下来先完成这些活动。
学习内容
- 如何使用 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
,并且您会看到每行上的第二个条目是 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 个周期时,模型报告的准确率会高得多。在本例中,它显示 99%
!
验证准确率数字通常略低于训练准确率,因为它们表明模型如何对之前未见过的数据进行分类。它会使用您之前预留的那 10% 的测试数据。
8. 导出模型
- 运行此单元以指定目录并导出模型:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
- 压缩整个
/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 中,您将了解如何使用此模型,以便开始对垃圾评论进行分类。