1. Прежде чем начать
В этом практическом занятии вы рассмотрите код, созданный с использованием TensorFlow и TensorFlow Lite Model Maker для построения модели на основе набора данных, содержащего спам в комментариях. Исходные данные доступны на Kaggle. Они были собраны в один CSV-файл и очищены от неработающего текста, разметки, повторяющихся слов и многого другого. Это позволит вам сосредоточиться на модели, а не на тексте.
Код, который вы будете проверять, предоставлен здесь, но настоятельно рекомендуется работать с ним в Google Colab.
Предварительные требования
- Данный практический урок предназначен для опытных разработчиков, которые только начинают знакомиться с машинным обучением.
- Данная практическая работа является частью курса «Начало работы с классификацией текста для мобильных устройств». Если вы еще не выполнили предыдущие задания, пожалуйста, остановитесь и сделайте это сейчас.
Что вы узнаете
- Как установить TensorFlow Lite Model Maker с помощью Google Colab
- Как загрузить данные с облачного сервера на ваше устройство
- Как использовать загрузчик данных
- Как построить модель
Что вам понадобится
- Доступ к 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-файлов, подобных этому. Вам нужно лишь указать, в каких столбцах находится текст, а в каких — метки. Как это сделать, вы узнаете позже в практическом задании.
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, поскольку модель только начинает работу.

Затем программа измерит результаты и запустит код оптимизации для корректировки прогноза, после чего попробует снова. Это эпоха. Таким образом, указав epochs=50, она пройдет этот «цикл» 50 раз.

К 50-й эпохе модель покажет гораздо более высокий уровень точности. В данном случае — 99%!
Справа вы увидите показатели точности валидации. Обычно они немного ниже, чем точность обучения, поскольку показывают, как модель классифицирует данные, которые она ранее не видела. Для этого используются 10% тестовых данных, которые мы отложили ранее.

8. Экспорт модели
После завершения обучения вы можете экспортировать модель.
TensorFlow обучает модель в собственном формате, и для использования в мобильном приложении её необходимо преобразовать в формат TFLITE. Model Maker берёт на себя эту сложную задачу.
Просто экспортируйте модель, указав директорию:
model.export(export_dir='/mm_spam')
В этой директории вы найдете файл model.tflite . Скачайте его. Он понадобится вам в следующем практическом занятии, где вы добавите его в свое Android-приложение!
Вопросы, касающиеся iOS
Экспортированная вами модель .tflite хорошо подходит для Android, поскольку в неё встроены метаданные о модели, и Android Studio может их прочитать.
Эти метаданные очень важны, поскольку они включают словарь токенов, представляющих слова в том виде, в котором их распознает модель. Помните, как вы ранее узнали, что слова становятся токенами, а этим токенам затем присваиваются векторы, отражающие их эмоциональную окраску? Вашему мобильному приложению понадобятся эти токены. Например, если слово «собака» было токенизировано до 42, и ваши пользователи вводят «собака» в предложение, вашему приложению потребуется преобразовать «собаку» в 42, чтобы модель это поняла. Как разработчик Android, вы будете использовать «библиотеку задач TensorFlow Lite», которая упрощает работу с этим, но на iOS вам потребуется обработать словарь, поэтому он должен быть у вас под рукой. Model Maker может экспортировать его для вас, указав параметр export_format . Таким образом, чтобы получить метки и словарь для вашей модели, вы можете использовать следующее:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. Поздравляем!
В этом практическом занятии вы изучили код на Python для создания и экспорта вашей модели. В конце у вас будет файл с расширением .tflite.
В следующем практическом занятии вы узнаете, как отредактировать ваше Android-приложение, чтобы оно использовало эту модель и вы могли начать классифицировать спам-комментарии.