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 文件后,您会看到每行只有 2 个值,这些值在文件的第一行中会带有文字说明。通常,每个条目都会被视为一个列。
您会看到第一列的描述符是 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,因为模型才刚刚起步。
然后,它会衡量此操作的结果,运行优化代码来调整其预测,然后重试。这是一个纪元。因此,如果指定 epochs=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 库” Model Maker 可以通过指定 export_format
参数来为您导出这些数据。因此,如需获取模型的标签和词汇表,您可以使用以下代码:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. 恭喜
此 Codelab 将引导您构建 Python 代码以构建和导出模型。该文件末尾会包含 .tflite 文件。
在下一个 Codelab 中,您将了解如何修改 Android 应用以使用此模型,以便开始对垃圾评论进行分类。