Взгляд на приложение трансферного обучения с TensorFlow Hub и Keras.

TensorFlow Hub — это репозиторий моделей машинного обучения.

TensorFlow Hub представляет собой пространство, где вы можете просматривать обученные модели и наборы данных из всей экосистемы TensorFlow, от классификации изображений, встраивания текста, распознавания аудио и видео. Используйте его, чтобы:

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

TensorFlow Hub — это хранилище предварительно обученных моделей TensorFlow.
В этом посте демонстрируется использование моделей встраивания из TensorFlow Hub с tf.keras

В этом посте используется предварительно обученная модель встраивания текста из TensorFlow Hub под названием google/nnlm-en-dim50/2.

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

  • google/nnlm-en-dim128/2 — обучение с той же архитектурой NNLM на тех же данных, что и google/nnlm-en-dim50/2, но с большей размерностью внедрения. Вложения большего размера могут улучшить вашу задачу, но обучение вашей модели может занять больше времени.
  • google/nnlm-en-dim128-with-normalization/2 — то же, что и google/nnlm-en-dim128/2, но с дополнительной нормализацией текста, например удалением пунктуации. Это может помочь, если текст в вашей задаче содержит дополнительные символы или знаки препинания.
  • google/universal-sentence-encoder/4 — гораздо более крупная модель, дающая 512-мерные вложения, обученные с помощью кодировщика сети глубокого усреднения (DAN).

И многое другое! Найдите больше моделей встраивания текста на TFHub.

Набор данных IMDB Large Movie Review — это набор данных для бинарной классификации настроений, содержащий значительно больше данных, чем предыдущие эталонные наборы данных. Мы предоставляем набор из 25 000 крайне полярных обзоров фильмов для обучения и 25 000 для тестирования. Существуют также дополнительные немаркированные данные для использования. Предоставляется необработанный текст и уже обработанный пакет форматов слов. См. файл README, содержащийся в выпуске, для более подробной информации.

# Downloading the IMDB dataset
# Split the training set into 60% and 40% to end up with 15,000 examples
# for training, 10,000 examples for validation and 25,000 examples for testing.
url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
dataset = tf.keras.utils.get_file("aclImdb_v1", url,
                       untar=True, cache_dir='.',
                       cache_subdir='')
dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb')
train_dir = os.path.join(dataset_dir, 'train')
remove_dir = os.path.join(train_dir, 'unsup')
shutil.rmtree(remove_dir)

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

  • Массивы train_data и train_labels представляют собой обучающий набор — данные, которые модель использует для обучения.
  • Модель тестируется на основе тестового набора, массивов test_data и test_labels.
  • Массивы validation_data и validation_labels представляют собой обучающий набор — данные, которые модель никогда раньше не видела, и которые используются для оценки производительности модели.

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

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

  1. .cache() сохраняет данные в памяти после их загрузки с диска. Это гарантирует, что набор данных не станет узким местом при обучении вашей модели. Если ваш набор данных слишком велик, чтобы поместиться в память, вы также можете использовать этот метод для создания производительного кэша на диске, который более эффективен для чтения, чем множество небольших файлов.
  2. .prefetch() перекрывает предварительную обработку данных и выполнение модели во время обучения.

Вы можете узнать больше об обоих методах, а также о том, как кэшировать данные на диск, в Руководстве по производительности данных.

# Preparing train, test and validation datasets
batch_size = 32
seed = 42
train_data = tf.keras.preprocessing.text_dataset_from_directory(
    'aclImdb/train', 
    batch_size=batch_size, 
    validation_split=0.2, 
    subset='training', 
    seed=seed)
validation_data = tf.keras.preprocessing.text_dataset_from_directory(
    'aclImdb/train', 
    batch_size=batch_size, 
    validation_split=0.2, 
    subset='validation', 
    seed=seed)
test_data = tf.keras.preprocessing.text_dataset_from_directory(
    'aclImdb/test', 
    batch_size=batch_size)
AUTOTUNE = tf.data.AUTOTUNE
train_data = train_data.cache().prefetch(buffer_size=AUTOTUNE)
validation_data = validation_data.cache().prefetch(buffer_size=AUTOTUNE)
test_data = test_data.cache().prefetch(buffer_size=AUTOTUNE)
train_examples_batch, train_labels_batch = next(iter(train_data.batch(10)))
train_examples_batch = train_examples_batch.numpy()[0]
train_labels_batch = train_labels_batch.numpy()[0]
validation_data_batch = next(iter(validation_data.batch(32))) 
train_data_batch = next(iter(train_data.batch(32)))

Нейронная сеть создается путем наложения слоев — для этого требуется три основных архитектурных решения:

  • Как представить текст?
  • Сколько слоев использовать в модели?
  • Сколько скрытых единиц использовать для каждого слоя?

В этом примере входные данные состоят из предложений. Метки для прогнозирования: 0 или 1.

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

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

Давайте разберем, что происходит во фрагменте ниже.

  1. KerasLayers hub_layer преобразует текст во встраивание слов
    Этот слой представляет собой слой TensorFlow Hub. Этот слой использует предварительно обученную сохраненную модель для сопоставления предложения с его вектором внедрения. Предварительно обученная модель встраивания текста, которую вы используете (google/nnlm-en-dim50/2), разбивает предложение на токены, встраивает каждый токен, а затем объединяет встраивание. Результирующие размеры: (num_examples, embedding_dimension). Для этой модели NNLM embedding_dimension равно 50.
  2. Первый плотный слой tf.keras.layers.Dense — это линейный слой, который изучает представления/информацию из подаваемых данных. ) слой с 16 скрытыми единицами.
  3. Второй слой — это tf.keras.layers, который плотно связан с одним выходным узлом, который возвращает предсказание бинарного класса о положительном или отрицательном отзыве.
# Full model
embedding = "https://tfhub.dev/google/nnlm-en-dim50/2"
hub_layer = hub.KerasLayer(embedding, input_shape=[],
                          dtype=tf.string, trainable=True)
model = tf.keras.Sequential()
model.add(hub_layer)
model.add(tf.keras.layers.Dense(16, activation='relu'))
model.add(tf.keras.layers.Dense(1))
model.summary()

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

  • Функция потерь — измеряет, насколько точна модель во время обучения. Вы хотите минимизировать эту функцию, чтобы «направить» модель в правильном направлении.
  • Оптимизатор — так модель обновляется на основе данных, которые она видит, и ее функции потерь.
  • Метрики — используются для отслеживания этапов обучения и тестирования. В следующем примере используется точность, доля правильно классифицированных изображений.
# compiling model
model.compile(optimizer='adam',
             loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
             metrics=['accuracy'])

Для обучения модели нейронной сети необходимо выполнить следующие шаги:

  1. Подайте обучающие данные к модели. В этом примере обучающие данные находятся в массивах train_data и train_labels.
  2. Модель учится связывать встраивание слов из нашего узлового слоя и меток положительного или отрицательного класса.
  3. Вы просите модель сделать прогноз относительно тестового набора — в этом примере это массив test_data.
  4. Убедитесь, что прогнозы соответствуют меткам из массива test_labels.

По мере обучения модели отображаются показатели потерь и точности.

# Training the model
history = model.fit(train_data,
                   epochs=5,
                   validation_data=validation_data,
                   verbose=1)

Точность оценки сравнивает работу модели с тестовым набором данных.

# Evaluating the model
loss, accuracy = model.evaluate(test_data)
print("Loss: ", loss)
print("Accuracy: ", accuracy)
Loss:  0.6545483469963074
Accuracy:  0.8464000225067139

Этот довольно наивный подход обеспечивает точность около 84%. При более продвинутых подходах модель должна приближаться к 95%.

Весь код можно скачать ниже.



Кредиты:



Вдохновение:

Глубокие сети в моем мозгу были повреждены, когда я пережил COVID-19, что привело к туману в голове, краткосрочной потере памяти, спутанности сознания, неспособности сосредоточиться и просто чувствовать себя по-другому.
Затем я решил строить новые сети, изучая сети в Tensorflow и изучая немецкую лингвистику.
Надеюсь многие выздоравливают, держу всех в молитвах :)