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