Обучите модель обнаружения спама в комментариях с помощью TensorFlow Lite Model Maker

1. Прежде чем начать

В этой практической работе вы изучите код, созданный с помощью TensorFlow и TensorFlow Lite Model Maker, для создания модели с набором данных на основе спама в комментариях. Исходные данные доступны на Kaggle. Они были собраны в один CSV-файл и очищены от битого текста, разметки, повторяющихся слов и т.д. Это позволит сосредоточиться на модели, а не на тексте.

Код, который вы просматриваете, приведен здесь, но настоятельно рекомендуется следовать коду в Colaboratory.

Предпосылки

  • Эта лабораторная работа была написана для опытных разработчиков, которые только начинают изучать машинное обучение.
  • Эта лабораторная работа является частью курса «Начало работы с классификацией текста в приложениях Flutter» . Если вы ещё не выполнили предыдущие задания, пожалуйста, остановитесь и сделайте это сейчас.

Чему вы научитесь

  • Как установить 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-файлов, подобных этому. Вам нужно лишь указать, в каких столбцах будет находиться текст, а в каких — метки. Как это сделать, вы увидите далее в этой практической работе.

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.

Основной принцип машинного обучения заключается в том, что это своего рода сопоставление с образцом. Изначально система загружает предварительно обученные веса слов и пытается сгруппировать их, прогнозируя, какие из них при объединении будут указывать на спам, а какие — нет. В первый раз распределение, скорее всего, будет равномерным, поскольку модель только начинает работу.

c42755151d511ce.png

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

7d0ee06a5246b58d.png

К 50-й эпохе модель демонстрирует гораздо более высокую точность. В данном случае она составляет 99% !

Показатели точности валидации обычно немного ниже, чем точность обучения, поскольку они показывают, как модель классифицирует данные, с которыми она ранее не сталкивалась. Она использует 10% тестовых данных, которые вы отложили ранее.

f063ff6e1d2add67.png

8. Экспортируйте модель

  1. Запустите эту ячейку, чтобы указать каталог и экспортировать модель:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. Сожмите всю папку /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, а также метки и словарь в конце. В следующей практической работе вы увидите, как использовать эту модель для классификации спам-комментариев.

Узнать больше