среда, 12 сентября 2018 г.

TensorFlow: Keras, базовое использование

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

  • Дружественность к пользователю

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

  • Модулярный и компонуемый

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

  • Простой для расширения

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

Импорт tf.keras

tf.keras это TensorFlow реализация Keras API спецификации. Это высокоуровненое API для построения и тренировки моделей, которое включает первоклассную поддержку для TensorFlow специфичной функциональности, такой как нетерпеливое исполнение (eager execution), tf.data пайплайны, и Estimators. tf.keras делает TensorFlow проще для использования без жертвования гибкостью и производительностью.

Для начала импортируем tf.keras как часть создания TensorFlow программы:

import tensorflow as tf
from tensorflow import keras

tf.keras может исполнять любой Keras-совместимый код, но необходимо помнить:

  • Версия tf.keras в последнем TensorFlow релизе может быть не той же самой, что и последняя версия keras из PyPI. Проверяйте tf.keras.version.
  • При сохранении весов модели tf.keras по умолчанию использует формат контрольных точек. Передайте save_format='h5', чтобы использовать HDF5.

Создание простой модели

Последовательная модель (Sequential model)

В Keras для построения модели необходимо собрать слои. Модель - это (обычно) граф слоев. Наиболее общий тип модели - это стек слоев: tf.keras.Sequential модель.

Для построения простой, полностью связанной сети (то есть многослойного перцептрона):

model = keras.Sequential()
# Добавляем плотно-соединенный (densely-connected) слой 
# с 64 элементами в модели:
model.add(keras.layers.Dense(64, activation='relu'))
# Добавляем другой:
model.add(keras.layers.Dense(64, activation='relu'))
# Добавляем софтмакс слой с 10 выводными элементами:
model.add(keras.layers.Dense(10, activation='softmax'))

Конфигурирование слоев

Существует много tf.keras.layers доступных с некоторыми параметрами конструктора:

  • activation: Устанавливает функцию активации для слоя. Этот параметр определяется именем встроенной функции или как вызываемый объект. По умолчанию, активация не применяется.
  • kernel_initializer и bias_initializer: Инициализационные схемы, которые создают веса слоя (ядро и смещение). Этот параметр - это имя или вызываемый объект. По умолчанию равен "Glorot uniform" инициализатору.
  • kernel_regularizer и bias_regularizer: Регуляризационные схемы, которые применяют веса слоя (ядро и смещение), такие как L1 или L2 регуляризация. По умолчанию регуляризация не применяется.

Следующие экземпляры tf.keras.layers.Dense слоев используют аргументы конструктора:

# Создаем сигмоидный слой:
layers.Dense(64, activation='sigmoid')
# Или:
layers.Dense(64, activation=tf.sigmoid)

# Линейный слой с L1 регуляризацией фактора 0.01, 
# применяемой к матрице ядра:
layers.Dense(64, kernel_regularizer=keras.regularizers.l1(0.01))
# Линейный слой с L2 регуляризацией фактора 0.01, 
# применяемой к вектору смещения:
layers.Dense(64, bias_regularizer=keras.regularizers.l2(0.01))

# Линейный слой с ядром инициализированным 
# к случайной ортогональной матрице:
layers.Dense(64, kernel_initializer='orthogonal')
# Линейный слой с вектором смещения, инициализированным к 2.0s:
layers.Dense(64, bias_initializer=keras.initializers.constant(2.0))

tf.keras.Model.compile принимает три важных аргумента:

  • optimizer: Этот объект определяет тренировочную процедуру. Передаем этому экземпляры оптимизатора из модуля tf.train, такие как AdamOptimizer, RMSPropOptimizer, или GradientDescentOptimizer.
  • loss: Функция для минимизации потери в ходе оптимизации. Общие варианты включают среднюю квадратичную ошибку (mean square error (mse)), categorical_crossentropy, и binary_crossentropy. Функции потери определяется именем или передачей вызываемого объекта из модуля tf.keras.losses.
  • metrics: Используются для отображения тренировки. Это строковые имена или вызываемые объекты из модуля tf.keras.metrics.

Далее показаны несколько примеров конфигурирования модели для тренировки:

# Кофигурируем модель для регрессии со средней квадратичной ошибкой
model.compile(optimizer=tf.train.AdamOptimizer(0.01),
              loss='mse',       # средняя квадратичная ошибка
              metrics=['mae'])  # средняя абсолютная ошибка

# Конфигурируем модель для категорийной классификации
model.compile(optimizer=tf.train.RMSPropOptimizer(0.01),
              loss=keras.losses.categorical_crossentropy,
              metrics=[keras.metrics.categorical_accuracy])

Ввод NumPy данных

Для маленьких наборов данных используем NumPy массивы в памяти для тренировки и оценки модели. Модель обучается тренировочным данным, используя метод fit:

tf.keras.Model.fit принимает три важных аргумента:

  • epochs: Тренировка структурирована в эпохи. Эпоха - это одна итерация по всем входным данным (она выполняется маленькими пакетами).
  • batch_size: При передаче NumPy данных модель нарезает данные кусками в маленькие пакеты и итерирует по этим пакетам в течение тренировки. Это число определяет размер каждого пакета. Необходимо помнить, что последний пакет может быть меньше если общее количество примеров не делится целиком на размер пакета.
  • validation_data: При прототипировании модели необходимо проверять ее производительность на некоторых валидационных данных. Передача этого аргумента - пары из вводных данных и меток - позволяет модели показывать потерю и метрики в режиме работы модели для переданных данных в конце каждой эпохи.

Вот пример использования validation_data:

import numpy as np

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

val_data = np.random.random((100, 32))
val_labels = np.random.random((100, 10))

model.fit(data, labels, epochs=10, batch_size=32,
          validation_data=(val_data, val_labels))

Ввод tf.data наборов данных

Используем Datasets API для больших наборов данных или тренировки на нескольких устройствах. Передаем tf.data.Dataset экземпляр fit методу:

# Создаем маленький экземпляр набора данных:
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)
dataset = dataset.repeat()

# Задаем `steps_per_epoch` при вызове `fit` на наборе данных.
model.fit(dataset, epochs=10, steps_per_epoch=30)

Здесь fit метод использует steps_per_epoch аргумент - это количество тренировочных шагов, которые выполняет модель до того как перейти к следующей эпохе. Ввиду того, что Dataset выводит данные пакетами, этот случай не требует batch_size.

Datasets также может быть использован для валидации:

dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32).repeat()

val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels))
val_dataset = val_dataset.batch(32).repeat()

model.fit(dataset, epochs=10, steps_per_epoch=30,
          validation_data=val_dataset,
          validation_steps=3)

Оценка и прогнозирование

tf.keras.Model.evaluate и tf.keras.Model.predict методы могут использовать NumPy данные и tf.data.Dataset.

Чтобы оценить потерю и метрики в рабочем режиме модели выполняем следующее:

model.evaluate(x, y, batch_size=32)

model.evaluate(dataset, steps=30)

А чтобы прогнозировать вывод последним слоем в рабочем режиме модели выполняем следующее:

model.predict(x, batch_size=32)

model.predict(dataset, steps=30)

В следующем посте мы рассмотрим другие аспекты использования TensorFlow Keras.