День сообщества ML - 9 ноября! Присоединяйтесь к нам для обновления от TensorFlow, JAX, и многое другое Подробнее

Классификация текста с помощью TensorFlow Lite Model Maker

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

Библиотека Maker TensorFlow Lite модель упрощает процесс адаптации и преобразования модели TensorFlow в частности входных данных при развертывании модели на устройстве приложений ML.

В этой записной книжке показан сквозной пример, в котором используется библиотека Model Maker, чтобы проиллюстрировать адаптацию и преобразование широко используемой модели классификации текста для классификации обзоров фильмов на мобильном устройстве. Модель классификации текста классифицирует текст по заранее определенным категориям. Входными данными должен быть предварительно обработанный текст, а выходными данными - вероятности категорий. Набор данных, используемый в этом руководстве, представляет собой положительные и отрицательные отзывы о фильмах.

Предпосылки

Установите необходимые пакеты

Чтобы запустить этот пример, установите необходимые пакеты, включая пакет Maker модели из репозитория GitHub .

pip install -q tflite-model-maker

Импортируйте необходимые пакеты.

import numpy as np
import os

from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.text_classifier import AverageWordVecSpec
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:168: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

Загрузите образец данных обучения.

В этом уроке мы будем использовать SST-2 (Stanford настроения Treebank) , которая является одной из задач в КЛЕЕВОМ тесте. Он содержит 67 349 обзоров фильмов для обучения и 872 обзора фильмов для тестирования. В наборе данных есть два класса: положительные и отрицательные обзоры фильмов.

data_dir = tf.keras.utils.get_file(
      fname='SST-2.zip',
      origin='https://dl.fbaipublicfiles.com/glue/data/SST-2.zip',
      extract=True)
data_dir = os.path.join(os.path.dirname(data_dir), 'SST-2')
Downloading data from https://dl.fbaipublicfiles.com/glue/data/SST-2.zip
7446528/7439277 [==============================] - 2s 0us/step
7454720/7439277 [==============================] - 2s 0us/step

Набор данных SST-2 хранится в формате TSV. Единственное различие между TSV и CSV является то , что TSV использует вкладку \t символ в качестве разделителя вместо запятой , в формате CSV.

Вот первые 5 строк набора данных для обучения. label = 0 означает отрицательный результат, label = 1 означает положительный результат.

приговор метка
скрыть новые выделения от родительских единиц 0
не содержит остроумия, только надоевшие приколы 0
который любит своих персонажей и сообщает что-то прекрасное о человеческой природе 1
остается полностью удовлетворенным тем, что остается неизменным во всем 0
на худшие клише о мести ботаников, которые кинематографисты могли вытащить 0

Далее, мы будем загружать набор данных в dataframe панды и изменить текущие имена меток ( 0 и 1 ) к более гуманному считываемым из них ( negative и positive ) и использовать их для обучения модели.

import pandas as pd

def replace_label(original_file, new_file):
  # Load the original file to pandas. We need to specify the separator as
  # '\t' as the training data is stored in TSV format
  df = pd.read_csv(original_file, sep='\t')

  # Define how we want to change the label name
  label_map = {0: 'negative', 1: 'positive'}

  # Excute the label change
  df.replace({'label': label_map}, inplace=True)

  # Write the updated dataset to a new file
  df.to_csv(new_file)

# Replace the label name for both the training and test dataset. Then write the
# updated CSV dataset to the current folder.
replace_label(os.path.join(os.path.join(data_dir, 'train.tsv')), 'train.csv')
replace_label(os.path.join(os.path.join(data_dir, 'dev.tsv')), 'dev.csv')

Быстрый старт

Есть пять шагов для обучения модели классификации текста:

Шаг 1. Выберите архитектуру модели классификации текста.

Здесь мы используем среднюю архитектуру модели встраивания слов, которая позволяет получить небольшую и быструю модель с приличной точностью.

spec = model_spec.get('average_word_vec')

Модель Maker также поддерживает другие модели архитектуры , такие как BERT . Если вы заинтересованы , чтобы узнать о других архитектурах, увидеть Выберите модель архитектуру для текстового классификатора раздела ниже.

Шаг 2. Загрузите данные обучения и тестирования, а затем препроцессировать их в соответствии с конкретной model_spec .

Model Maker может принимать входные данные в формате CSV. Мы загрузим обучающий и тестовый набор данных с понятным для человека именем ярлыка, которые были созданы ранее.

Каждая архитектура модели требует, чтобы входные данные обрабатывались определенным образом. DataLoader читает требование от model_spec и автоматически выполняет необходимую предварительную обработку.

train_data = DataLoader.from_csv(
      filename='train.csv',
      text_column='sentence',
      label_column='label',
      model_spec=spec,
      is_training=True)
test_data = DataLoader.from_csv(
      filename='dev.csv',
      text_column='sentence',
      label_column='label',
      model_spec=spec,
      is_training=False)

Шаг 3. Обучите модель TensorFlow на обучающих данных.

Среднее слово вложение использование модели batch_size = 32 по умолчанию. Таким образом, вы увидите, что для прохождения 67 349 предложений в наборе обучающих данных требуется 2104 шага. Мы обучим модель 10 эпохам, что означает, что мы пройдем обучающий набор данных 10 раз.

model = text_classifier.create(train_data, model_spec=spec, epochs=10)
Epoch 1/10
2104/2104 [==============================] - 7s 3ms/step - loss: 0.6694 - accuracy: 0.5844
Epoch 2/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.5232 - accuracy: 0.7468
Epoch 3/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.4200 - accuracy: 0.8097
Epoch 4/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3808 - accuracy: 0.8339
Epoch 5/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3598 - accuracy: 0.8468
Epoch 6/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3480 - accuracy: 0.8536
Epoch 7/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3374 - accuracy: 0.8588
Epoch 8/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3308 - accuracy: 0.8640
Epoch 9/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3248 - accuracy: 0.8665
Epoch 10/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3192 - accuracy: 0.8682

Шаг 4. Оцените модель с помощью тестовых данных.

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

Поскольку размер пакета по умолчанию равен 32, потребуется 28 шагов, чтобы просмотреть 872 предложения в тестовом наборе данных.

loss, acc = model.evaluate(test_data)
28/28 [==============================] - 0s 2ms/step - loss: 0.5198 - accuracy: 0.8314

Шаг 5. Экспортируйте как модель TensorFlow Lite.

Давайте экспортируем обученную нами классификацию текста в формат TensorFlow Lite. Мы укажем, в какую папку экспортировать модель. По умолчанию модель TFLite с плавающей запятой экспортируется для архитектуры средней модели встраивания слов.

model.export(export_dir='average_word_vec')
2021-10-07 11:59:17.166040: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
2021-10-07 11:59:17.713200: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-10-07 11:59:17.713245: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.

Вы можете загрузить файл модели TensorFlow Lite, используя левую боковую панель Colab. Идите в average_word_vec папку как указано в export_dir параметр выше, щелкните правой кнопкой мыши на model.tflite файл и выберите Download , чтобы загрузить его на локальном компьютере.

Эта модель может быть интегрирована в Android или приложение IOS , используя NLClassifier API из TensorFlow Lite задач библиотеки .

Смотрите TFLite Текст приложения Классификация образца для получения более подробной информации о том , как модель используется в рабочем приложении.

Примечание 1. Привязка модели Android Studio пока не поддерживает классификацию текста, поэтому используйте библиотеку задач TensorFlow Lite.

Примечание 2: Существует model.json файл в той же папке с моделью TFLite. Он содержит представление JSON из метаданных комплектных внутри модели TensorFlow Lite. Метаданные модели помогают библиотеке задач TFLite знать, что делает модель и как предварительно / постобработать данные для модели. Вам не нужно скачивать model.json файл, который предназначен исключительно для информационных целей и его содержание уже внутри файла TFLite.

Примечание 3: Если вы тренируетесь модель классификации текста с использованием MobileBERT или BERT-Base архитектуры, вам нужно будет использовать BertNLClassifier API вместо того, чтобы интегрировать обученную модель в мобильное приложение.

В следующих разделах пример рассматривается шаг за шагом, чтобы показать более подробную информацию.

Выберите архитектуру модели для классификатора текста

Каждый model_spec объект представляет определенную модель для текстового классификатора. TensorFlow Lite Model Maker в настоящее время поддерживает MobileBERT , в среднем вложения слов и БЕРТ-Base модели.

Поддерживаемая модель Имя model_spec Описание модели Размер модели
Усреднение встраивания слов "среднее_слово_век" Усреднение вложений текстовых слов с активацией RELU. <1 МБ
MobileBERT 'mobilebert_classifier' В 4,3 раза меньше и в 5,5 раза быстрее, чем BERT-Base, при этом обеспечивая конкурентные результаты, подходит для приложений на устройстве. 25 МБ с квантованием
100 МБ без квантования
BERT-База 'bert_classifier' Стандартная модель BERT, широко используемая в задачах НЛП. 300 МБ

Вкратце мы использовали среднюю модель встраивания слов. Переключатель Давайте к MobileBERT тренировать модель с более высокой точностью.

mb_spec = model_spec.get('mobilebert_classifier')

Загрузить данные обучения

Вы можете загрузить свой собственный набор данных для работы с этим руководством. Загрузите свой набор данных с помощью левой боковой панели в Colab.

Загрузить файл

Если вы предпочитаете не загружать свой набор данных в облаке, вы можете также локально запустить библиотеку, следуя руководство .

Для простоты мы будем повторно использовать загруженный ранее набор данных SST-2. Давайте использовать DataLoader.from_csv метод для загрузки данных.

Обратите внимание, что, поскольку мы изменили архитектуру модели, нам нужно будет перезагрузить обучающий и тестовый набор данных, чтобы применить новую логику предварительной обработки.

train_data = DataLoader.from_csv(
      filename='train.csv',
      text_column='sentence',
      label_column='label',
      model_spec=mb_spec,
      is_training=True)
test_data = DataLoader.from_csv(
      filename='dev.csv',
      text_column='sentence',
      label_column='label',
      model_spec=mb_spec,
      is_training=False)

Библиотека Maker Модель также поддерживает from_folder() метод для загрузки данных. Предполагается, что текстовые данные одного и того же класса находятся в одном подкаталоге и что имя подкаталога является именем класса. Каждый текстовый файл содержит один образец обзора фильма. В class_labels параметр используется для указания вложенных папок.

Обучение модели TensorFlow

Обучите модель классификации текста, используя обучающие данные.

model = text_classifier.create(train_data, model_spec=mb_spec, epochs=3)
Epoch 1/3
1403/1403 [==============================] - 333s 198ms/step - loss: 0.3631 - test_accuracy: 0.8448
Epoch 2/3
1403/1403 [==============================] - 270s 193ms/step - loss: 0.1300 - test_accuracy: 0.9537
Epoch 3/3
1403/1403 [==============================] - 272s 194ms/step - loss: 0.0755 - test_accuracy: 0.9762

Изучите подробную структуру модели.

model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_word_ids (InputLayer)     [(None, 128)]        0                                            
__________________________________________________________________________________________________
input_mask (InputLayer)         [(None, 128)]        0                                            
__________________________________________________________________________________________________
input_type_ids (InputLayer)     [(None, 128)]        0                                            
__________________________________________________________________________________________________
hub_keras_layer_v1v2 (HubKerasL (None, 512)          24581888    input_word_ids[0][0]             
                                                                 input_mask[0][0]                 
                                                                 input_type_ids[0][0]             
__________________________________________________________________________________________________
dropout_1 (Dropout)             (None, 512)          0           hub_keras_layer_v1v2[0][0]       
__________________________________________________________________________________________________
output (Dense)                  (None, 2)            1026        dropout_1[0][0]                  
==================================================================================================
Total params: 24,582,914
Trainable params: 24,582,914
Non-trainable params: 0
__________________________________________________________________________________________________

Оцените модель

Оцените модель, которую мы только что обучили, используя тестовые данные, и измерьте потери и значение точности.

loss, acc = model.evaluate(test_data)
28/28 [==============================] - 10s 55ms/step - loss: 0.4050 - test_accuracy: 0.9002

Экспорт как модель TensorFlow Lite

Преобразование обученной модели в формате модели TensorFlow Lite с метаданными , так что вы можете позже использовать в качестве на устройстве приложения ML. Файл метки и файл словаря встроены в метаданные. TFLite по умолчанию имя файла model.tflite .

Во многих приложениях машинного обучения на устройстве размер модели является важным фактором. Поэтому рекомендуется применить квантование модели, чтобы сделать ее меньше и потенциально быстрее. Методика квантования после обучения по умолчанию - это квантование динамического диапазона для моделей BERT и MobileBERT.

model.export(export_dir='mobilebert/')
2021-10-07 12:15:39.015005: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-10-07 12:15:39.015063: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-10-07 12:15:39.015073: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

Файл модели TensorFlow Lite может быть интегрирован в мобильном приложении с помощью BertNLClassifier API в TensorFlow Lite задачи библиотеки . Обратите внимание , что это отличается от NLClassifier API используется для интеграции текста классификации обученной со средней архитектурой слова вектора модели.

Форматы экспорта могут быть одним или несколькими из следующих:

По умолчанию он экспортирует только файл модели TensorFlow Lite, содержащий метаданные модели. Вы также можете экспортировать другие файлы, связанные с моделью, для лучшего изучения. Например, экспорт только файла метки и файла словаря следующим образом:

model.export(export_dir='mobilebert/', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

Вы можете оценить модель TFLite с evaluate_tflite методом измерения ее точность. Преобразование обученной модели TensorFlow в формат TFLite и применение квантования может повлиять на ее точность, поэтому рекомендуется оценить точность модели TFLite перед развертыванием.

accuracy = model.evaluate_tflite('mobilebert/model.tflite', test_data)
print('TFLite model accuracy: ', accuracy)
TFLite model accuracy:  {'accuracy': 0.9036697247706422}

Расширенное использование

create функция является функцией драйвера , что модель библиотеки Maker использует для создания моделей. model_spec параметр определяет спецификацию модели. В AverageWordVecSpec и BertClassifierSpec классы в настоящее время поддерживаются. create функции состоит из следующих этапов:

  1. Создает модель для текстового классификатора по model_spec .
  2. Обучает модель классификатора. Эпохи по умолчанию и размер партии по умолчанию устанавливаются в default_training_epochs и default_batch_size переменных в model_spec объекта.

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

Настроить гиперпараметры модели MobileBERT

Вы можете настроить следующие параметры модели:

  • seq_len : Длина последовательности для подачи в модель.
  • initializer_range : Стандартное отклонение truncated_normal_initializer для инициализации всех весовых матриц.
  • trainable : Boolean, указывающее , является ли обучаемый предварительно подготовленный слой.

Вы можете настроить следующие параметры обучающего конвейера:

  • model_dir : расположение в модели контрольных файлов. Если не установлен, будет использоваться временный каталог.
  • dropout_rate : процент отсева.
  • learning_rate : Начальная скорость обучения для Адама оптимизатора.
  • tpu : ТПУ адрес для подключения.

Например, вы можете установить seq_len=256 ( по умолчанию 128). Это позволяет модели классифицировать более длинный текст.

new_model_spec = model_spec.get('mobilebert_classifier')
new_model_spec.seq_len = 256

Настроить средние гиперпараметры модели встраивания слов

Вы можете настроить модель инфраструктуры как в wordvec_dim и seq_len переменных в AverageWordVecSpec классе.

Например, вы можете тренировать модель с большим значением wordvec_dim . Обратите внимание , что вы должны построить новый model_spec при изменении модели.

new_model_spec = AverageWordVecSpec(wordvec_dim=32)

Получите предварительно обработанные данные.

new_train_data = DataLoader.from_csv(
      filename='train.csv',
      text_column='sentence',
      label_column='label',
      model_spec=new_model_spec,
      is_training=True)

Обучите новую модель.

model = text_classifier.create(new_train_data, model_spec=new_model_spec)
Epoch 1/3
2104/2104 [==============================] - 8s 4ms/step - loss: 0.6604 - accuracy: 0.5970
Epoch 2/3
2104/2104 [==============================] - 6s 3ms/step - loss: 0.4807 - accuracy: 0.7696
Epoch 3/3
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3962 - accuracy: 0.8233

Настройте гиперпараметры обучения

Вы также можете настроить учебные гиперпараметры как epochs и batch_size , которые влияют на точность модели. Например,

  • epochs : больше эпох могли бы достичь большей точности, но может привести к переобучению.
  • batch_size : количество образцов для использования в одном шаге обучения.

Например, вы можете тренироваться с большим количеством эпох.

model = text_classifier.create(new_train_data, model_spec=new_model_spec, epochs=20)
Epoch 1/20
2104/2104 [==============================] - 7s 3ms/step - loss: 0.6621 - accuracy: 0.5950
Epoch 2/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.4874 - accuracy: 0.7679
Epoch 3/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3993 - accuracy: 0.8215
Epoch 4/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3657 - accuracy: 0.8397
Epoch 5/20
2104/2104 [==============================] - 7s 3ms/step - loss: 0.3471 - accuracy: 0.8509
Epoch 6/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3359 - accuracy: 0.8572
Epoch 7/20
2104/2104 [==============================] - 7s 3ms/step - loss: 0.3261 - accuracy: 0.8624
Epoch 8/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3190 - accuracy: 0.8666
Epoch 9/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3142 - accuracy: 0.8681
Epoch 10/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3096 - accuracy: 0.8703
Epoch 11/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3062 - accuracy: 0.8738
Epoch 12/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3043 - accuracy: 0.8736
Epoch 13/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3008 - accuracy: 0.8751
Epoch 14/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2991 - accuracy: 0.8767
Epoch 15/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2981 - accuracy: 0.8772
Epoch 16/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2948 - accuracy: 0.8783
Epoch 17/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2936 - accuracy: 0.8799
Epoch 18/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2919 - accuracy: 0.8811
Epoch 19/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2904 - accuracy: 0.8813
Epoch 20/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2889 - accuracy: 0.8818

Оцените недавно прошедшую переподготовку модель с 20 эпохами обучения.

new_test_data = DataLoader.from_csv(
      filename='dev.csv',
      text_column='sentence',
      label_column='label',
      model_spec=new_model_spec,
      is_training=False)

loss, accuracy = model.evaluate(new_test_data)
28/28 [==============================] - 0s 2ms/step - loss: 0.4911 - accuracy: 0.8291

Изменить архитектуру модели

Вы можете изменить модель, изменив model_spec . Ниже показано, как перейти на модель BERT-Base.

Изменение model_spec Берт-Base модель для текстового классификатора.

spec = model_spec.get('bert_classifier')

Остальные шаги такие же.

Настроить квантование после обучения на модели TensorFlow Lite

После обучения квантования является метод преобразования , который может уменьшить размер модели и логического вывода задержки, а также для повышения скорости процессора и аппаратный ускоритель логического вывода, с небольшим ухудшением точности модели. Таким образом, он широко используется для оптимизации модели.

Библиотека Model Maker применяет стандартную технику квантования после обучения при экспорте модели. Если вы хотите настроить пост-тренировочное квантование, Model Maker поддерживает несколько вариантов после обучения с использованием квантования QuantizationConfig , а также. Возьмем для примера квантование float16. Сначала определите конфигурацию квантования.

config = QuantizationConfig.for_float16()

Затем мы экспортируем модель TensorFlow Lite с такой конфигурацией.

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)

Подробнее

Вы можете прочитать наш текст классификации пример , чтобы узнать технические подробности. Для получения дополнительной информации, пожалуйста, обратитесь к: