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.