Боковая панель
НАЧАЛО РАБОТЫ
МОДЕЛИ
ПРЕДОБРАБОТКА
ПРИМЕРЫ
Основные слои
Dense
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer=’glorot_uniform’, bias_initializer=’zeros’, kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
Просто обычный плотно связанный слой NN.
Dense реализует операцию: output = activation(dot(input, kernel) + bias), где активация — это функция активации по элементам, переданная в качестве аргумента активации, кернел — это матрица весов, созданная слоем, а смещение — это вектор смещения, созданный слоем (применимо только в случае, если use_bias — True).
Замечание: если вход в слой имеет ранг больше 2, то он сглаживается перед исходным точечным продуктом с кернелом
Пример
# как первый слой в последовательной модели:
model.add(Dense(32, input_shape=(16,)))# теперь модель будет принимать в качестве входных массивов фигуры (*, 16)# и выходных массивов фигуры (*, 32)
# после первого слоя, больше не нужно указывать# размер входного сигнала:
Аргументы
Форма ввода
тензор nD с формой: (batch_size, …, input_dim). Наиболее распространенная ситуация — 2D-ввод с формой (batch_size, input_dim).
Форма вывода
тензор nD с формой: (размер партии, …, units). Например, для 2D-входа с формой (batch_size, input_dim) выход будет иметь форму (batch_size, units).
Activation
Применяет функцию активации к выводу.
Аргументы
Форма ввода
Произвольно. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включает ось отсчета) при использовании этого слоя в качестве первого слоя в модели.
Форма вывода
Та же форма, что и при вводе.
Dropout
keras.layers.Dropout(rate, noise_shape=None, seed=None)
Применяет исключение (дропаут) на вводе.
Dropout состоит в случайной установке доли единиц ввода в 0 при каждом обновлении во время обучения, что помогает предотвратить переобучение (оверфиттинг).
Аргументы
Ссылки
Flatten
keras.layers.Flatten(data_format=None)
Выравнивает вход. Не влияет на размер партии.
Аргументы
/.keras/keras.json. Если вы никогда не устанавливали его, то это будет «channels_last».
Пример
model.add(Conv2D(64, (3, 3),
input_shape=(3, 32, 32), padding=’same’,))# теперь: model.output_shape == (None, 64, 32, 32)
model.add(Flatten())# теперь: model.output_shape == (None, 65536)
Input
Input() используется для инстанцирования тензора Keras..
Тензор Keras — это объект тензора из подложки (Theano, TensorFlow или CNTK), который мы дополняем определенными атрибутами, позволяющими построить модель Keras, просто зная входы и выходы модели.
Например, если a, b и c — тензоры Кераса, то можно сделать: model = Model(input=[a, b], output=c].
Добавлены атрибуты Кераса: Форма Кераса: Кортеж интегральной формы, распространяемый через умозаключение формы Keras-сайд. _keras_history: Из этого слоя можно рекурсивно извлечь весь граф слоя.
Аргументы
Возврат
Пример
# это логистическая регрессия в Keras. #
y = Dense(16, activation=’softmax’)(x)
Reshape
Реформирует выход в определенную форму.
Аргументы
Форма ввода
Произвольно, хотя все размеры в форме входа должны быть зафиксированы. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включает ось партии) при использовании этого слоя в качестве первого слоя в модели.
Форма вывода
Пример
# как первый слой в последовательной модели.
model.add(Reshape((3, 4), input_shape=(12,)))# now: model.output_shape == (None, 3, 4)# примечание: `None` — это измерение партии.
# как промежуточный слой в последовательной модели.
model.add(Reshape((6, 2)))# теперь: model.output_shape == (None, 6, 2)
# также поддерживает умозаключение формы, используя `-1` в качестве измерения.
model.add(Reshape((-1, 2, 2)))# теперь: model.output_shape == (None, 3, 2, 2)
Permute
Сохраняет размеры входного сигнала в соответствии с заданным образцом.
Полезно, например, для соединения RNN и свёртков.
Пример
model.add(Permute((2, 1), input_shape=(10, 64)))# теперь: model.output_shape == (None, 64, 10)# примечание: `None` — измерение партии
Аргументы
Форма ввода
Произвольно. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включает ось отсчета) при использовании этого слоя в качестве первого слоя в модели.
Форма вывода
То же самое, что и Форма ввода, но с измененным порядком размеров в соответствии с заданной деталью.
RepeatVector
Повторяет ввод n раз.
Пример
model.add(Dense(32, input_dim=32))# now: model.output_shape == (None, 32)# примечание: `None` — это измерение партии.
model.add(RepeatVector(3))# теперь: model.output_shape == (None, 3, 32)
Аргументы
Форма ввода
2D тензор формы (num_samples, features).
Форма вывода
3D тензор формы (num_samples, n, features).
Lambda
keras.layers.Lambda(function, output_shape=None, mask=None, Arguments=None)
Обертывает произвольное выражение как объект Слоя.
Примеры
model.add(Lambda(lambda x: x ** 2))
# добавьте слой, который возвращает конкатенцию# положительной части входа и # противоположной отрицательной части.
def antirectifier(x):
x = K.l2_normalize(x, axis=1)
return K.concatenate([pos, neg], axis=1)
def antirectifier_output_shape(input_shape):
assert len(shape) == 2 # только для 2D тензоров
return tuple(shape)
# добавьте слой, возвращающий произведение Адамара# и сумму из двух входных тензоров.
def hadamard_product_sum(tensors):
out1 = tensors[0] * tensors[1]
out2 = K.sum(out1, axis=-1)
return [out1, out2]
def hadamard_product_sum_output_shape(input_shapes):
assert shape1 == shape2 # в противном случае произведение Адамара невозможно
return [tuple(shape1), tuple(shape2[:-1])]
layer = Lambda(hadamard_product_sum, hadamard_product_sum_output_shape)
x_hadamard, x_sum = layer([x1, x2])
Аргументы
Форма ввода
Произвольно. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включает ось отсчета) при использовании этого слоя в качестве первого слоя в модели.
Форма вывода
Указывается аргументом output_shape (или auto-inferred при использовании TensorFlow или CNTK).
ActivityRegularization
Слой, который применяет обновление к входной деятельности, основанной на функции затрат.
Аргументы
Форма ввода
Произвольно. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включает ось отсчета) при использовании этого слоя в качестве первого слоя в модели.
Форма вывода
Та же форма, что и при вводе.
Masking
Маскирует последовательность, используя значение маски для пропуска таймфреймов.
Если все возможности для заданного временного отрезка равны значению mask_value, то временной отрезок будет замаскирован (пропущен) во всех последующих слоях (до тех пор, пока они поддерживают маскировку).
Если какой-либо последующий слой не поддерживает маскировку, но получает такую входную маску, то исключение будет поднято.
Пример
Рассмотрим массив данных Numpy x формы (образцы, временные интервалы, возможности), который будет передан в LSTM слой. Вы хотите маскировать образец #0 в timestep #3, и образец #2 в timestep #5, потому что вам не хватает возможностей для этих примеров timesteps. Вы можете это сделать:
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
Аргументы
SpatialDropout1D
Пространственная 1D версия Dropout.
Эта версия выполняет ту же функцию, что и Dropout, однако вместо отдельных элементов выпадают целые карты 1D-функций. Если соседние кадры на картах объектов сильно коррелированы (как это обычно бывает в ранних слоях свертки), то регулярное отсеивание не приводит к регуляризации активаций, а в противном случае просто приводит к снижению эффективности обучения. В этом случае, SpatialDropout1D будет способствовать независимости между картами объектов и должен использоваться вместо этого..
Аргументы
Форма ввода
3D тензор с формой: (samples, timesteps, channels)
Форма вывода
То же, что и при вводе
Ссылки
SpatialDropout2D
keras.layers.SpatialDropout2D(rate, data_format=None)
Пространственная 2D версия Dropout.
Эта версия выполняет ту же функцию, что и Dropout, однако вместо отдельных элементов выпадают целые карты 2D-функций. Если смежные пиксели на картах объектов сильно коррелированы (как это обычно бывает в ранних слоях свертки), то регулярное отсеивание не приводит к регуляризации активаций, а в противном случае просто приводит к снижению эффективности обучения. В этом случае, SpatialDropout2D будет способствовать независимости между картами объектов и должен использоваться вместо них.
Аргументы
/.keras/keras.json. Если вы никогда не устанавливали его, то это будет «channels_last».
Форма ввода
4D тензор с формов: (samples, channels, rows, cols) если data_format=’channels_first’ или 4D тензор с формов: (samples, rows, cols, channels) если data_format=’channels_last’.
Форма вывода
То же, что и при вводе
Ссылки
SpatialDropout3D
keras.layers.SpatialDropout3D(rate, data_format=None)
Пространственная 3D версия Dropout.
Эта версия выполняет ту же функцию, что и Dropout, однако она удаляет целые карты 3D-функций вместо отдельных элементов. Если соседние воксели на картах объектов сильно коррелированы (как это обычно бывает в ранних слоях свертки), то регулярное отсеивание не приводит к регуляризации активаций, а в противном случае просто приводит к снижению эффективности обучения. В этом случае, SpatialDropout3D будет способствовать независимости между картами объектов и должен использоваться вместо них.
Аргументы
/.keras/keras.json. Если вы никогда не устанавливали его, то это будет «channels_last».
Форма ввода
5D тензор с формой: (samples, channels, dim1, dim2, dim3) если data_format=’channels_first’ или тензор с формой: (samples, dim1, dim2, dim3, channels) если data_format=’channels_last’.
Форма вывода
То же, что и при вводе
Ссылки
Обзор Keras для TensorFlow
Перевод обзорного руководства с сайта Tensorflow.org. Это руководство даст вам основы для начала работы с Keras. Чтение займет 10 минут.
Импортируйте tf.keras
Для начала, импортируйте tf.keras как часть установки вашей TensorFlow:
tf.keras может выполнять любой Keras-совместимый код, но имейте ввиду:
Постройте простую модель
Последовательная модель
Построим простую полносвязную сеть (т.е. многослойный перцептрон):
Настройте слои
Обучение и оценка
Настройка обучения
После того как модель сконструирована, настройте процесс ее обучения вызовом метода compile :
tf.keras.Model.compile принимает три важных аргумента:
Обучение на данных NumPy
Для небольших датасетов используйте помещающиеся в память массивы NumPy для обучения и оценки модели. Модель «обучается» на тренировочных данных, используя метод `fit`:
tf.keras.Model.fit принимает три важных аргумента:
Обучение с использованием наборов данных tf.data
Используйте Datasets API для масштабирования больших баз данных или обучения на нескольких устройствах. Передайте экземпляр `tf.data.Dataset` в метод fit :
Датасеты могут быть также использованы для валидации:
Оценка и предсказание
Вот так можно оценить потери в режиме вывода и метрики для предоставленных данных:
А вот как предсказать вывод последнего уровня в режиме вывода для предоставленных данных в виде массива NumPy:
Построение сложных моделей
The Functional API
Модель tf.keras.Sequential это простой стек слоев с помощью которого нельзя представить произвольную модель. Используйте Keras functional API для построения сложных топологий моделей, таких как:
Создайте экземпляр модели с данными входами и выходами.
Сабклассинг моделей
Сабклассинг модели особенно полезен когда включен eager execution, поскольку он позволяет написать прямое распространение императивно.
Ключевой момент: Используйте правильный API для работы. Хоть сабклассинг модели обеспечивает гибкость, за нее приходится платить большей сложностью и большими возможностями для пользовательских ошибок. Если это возможно выбирайте functional API.
Следующий пример показывает сабклассированную модель tf.keras.Model использующую пользовательское прямое распространение, которое не обязательно выполнять императивно:
Создайте экземпляр класса новой модели:
Пользовательские слои
Создайте пользовательский слой сабклассингом tf.keras.layers.Layer и реализацией следующих методов:
Создайте модель с использованием вашего пользовательского слоя:
Колбеки
Колбек это объект переданный модели чтобы кастомизировать и расширить ее поведение во время обучения. Вы можете написать свой пользовательский колбек или использовать встроенный tf.keras.callbacks который включает в себя:
tf.keras.callbacks.ModelCheckpoint : Сохранение контрольных точек модели за регулярные интервалы.
tf.keras.callbacks.LearningRateScheduler : Динамичное изменение шага обучения.
tf.keras.callbacks.EarlyStopping : Остановка обучения в том случае когда результат при валидации перестает улучшаться.
tf.keras.callbacks.TensorBoard: Мониторинг поведения модели с помощью
TensorBoard
Сохранение и восстановление
Сохранение только значений весов
Сохраните и загрузите веса модели с помощью tf.keras.Model.save_weights :
По умолчанию веса модели сохраняются в формате TensorFlow checkpoint. Веса могут быть также сохранены в формате Keras HDF5 (значение по умолчанию для универсальной реализации Keras):
Сохранение только конфигурации модели
Конфигурация модели может быть сохранена — это сериализует архитектуру модели без всяких весов. Сохраненная конфигурация может восстановить и инициализировать ту же модель, даже без кода определяющего исходную модель. Keras поддерживает форматы сериализации JSON и YAML:
Восстановление модели (заново инициализированной) из JSON:
Сериализация модели в формат YAML требует установки `pyyaml` перед тем как импортировать TensorFlow:
Восстановление модели из YAML:
Внимание: сабклассированные модели не сериализуемы, потому что их архитектура определяется кодом Python в теле метода `call`.
Сохранение всей модели в один файл
Вся модель может быть сохранена в файл содержащий значения весов, конфигурацию модели, и даже конфигурацию оптимизатора. Это позволит вам установить контрольную точку модели и продолжить обучение позже с точно того же положения даже без доступа к исходному коду.
Eager execution
Eager execution — это императивное программирование среда которая выполняет операции немедленно. Это не требуется для Keras, но поддерживается tf.keras и полезно для проверки вашей программы и отладки.
Все строящие модели API `tf.keras` совместимы eager execution. И хотя могут быть использованы `Sequential` и functional API, eager execution особенно полезно при сабклассировании модели и построении пользовательских слоев — эти API требуют от вас написание прямого распространения в виде кода (вместо API которые создают модели путем сборки существующих слоев).
Распределение
Множественные GPU
Следующий пример распределяет tf.keras.Model между множеством GPU на одной машине.
Сперва определим модель внутри области распределенной стратегии:
Затем обучим модель на данных как обычно:
Слои Keras: параметры и свойства / keras 5
Слои являются основными элементами, необходимыми при создании нейронных сетей. Последовательные слои отвечают за архитектуру модели глубокого обучения. Каждый из них выполняет вычисления на основе данных, полученных из предыдущего. Затем информация передается дальше. В конце концов, последний слой выдает требуемый результат. В этом материале разберем типы слоев Keras, их свойства и параметры.
Слои Keras
Для определения или создания слоя Keras нужна следующая информация:
Различные слои в Keras
Основные слои Keras
Dense
Вычисляет вывод следующим образом:
Здесь activation — это активатор, а kernel — взвешенная матрица, применяемая к входящим тензорам. bias — это константа, помогающая настроить модель наилучшим образом.
Dense-слой получает информацию со всех узлов предыдущего слоя. Вот его аргументы и значения по умолчанию:
Activation
Используется для применения функции активации к выводу. То же самое, что передача активации в Dense-слой. Имеет следующие аргументы:
Если функцию активации не передать, то будет выполнена линейная активация.
Dropout
Dropout применяется в нейронных сетях для решения проблемы переобучения. Для этого он случайным образом выбирает доли единиц и при каждом обновлении назначает им значение 0.
Flatten
Flatten используется для конвертации входящих данных в меньшую размерность.
Input
Этот слой используется в Keras для создания модели на основе ввода и вывода модели. Он является точкой входа в модель графа.
Reshape
Изменить вывод под конкретную размерность
Выдаст следующий результат:
Permute
Поменять ввод для соответствия конкретному шаблону. Этот же слой используется для изменения формы ввода с помощью определенных шаблонов.
Lambda
Слои Lambda используются для создания дополнительных признаков слоев, которых нет в Keras.
Masking
Сверточные сети Keras
Conv1D и Conv2D
Здесь определяется взвешенное ядро. Производится операция свертки, результатом которой становятся тензоры.
Слои пулинга (подвыборки)
Они используются для уменьшения размера ввода и извлечения важной информации.
MaxPooling1D и MaxPooling2D
AveragePooling1D и AveragePooling2D
Рекуррентный слой
Этот слой используется для вычисления последовательных данных — временного ряда или естественного языка.
SimpleRNN
Это полностью связанная RNN (рекуррентная нейронная сеть), где вывод подается обратно в качестве входящих данных
Это увеличенная форма RNN с хранилищем для информации.
В Keras есть и другие слои, но чаще всего используются описанные выше.
Выводы
Этот материал посвящен концепции слоев в моделях Keras. Вы узнали о требованиях для построения слоя, а также об их типах: основные слои, сверточные слои, подвыборки, рекуррентные слои, а также их свойства и параметры.
Библиотеки для глубокого обучения: Keras
Привет, Хабр! Мы уже говорили про Theano и Tensorflow (а также много про что еще), а сегодня сегодня пришло время поговорить про Keras.
Изначально Keras вырос как удобная надстройка над Theano. Отсюда и его греческое имя — κέρας, что значит «рог» по-гречески, что, в свою очередь, является отсылкой к Одиссее Гомера. Хотя, с тех пор утекло много воды, и Keras стал сначала поддерживать Tensorflow, а потом и вовсе стал его частью. Впрочем, наш рассказ будет посвящен не сложной судьбе этого фреймворка, а его возможностям. Если вам интересно, добро пожаловать под кат.
Начать стоит от печки, то есть с оглавления.
Установка
Установка Keras чрезвычайно проста, т.к. он является обычным питоновским пакетом:
Теперь мы можем приступить к его разбору, но сначала поговорим про бэкенды.
ВНИМАНИЕ: Чтобы работать с Keras, у вас уже должен быть установлен хотя бы один из фреймворков — Theano или Tensorflow.
Бэкенды
Бэкенды — это то, из-за чего Keras стал известен и популярен (помимо прочих достоинств, которые мы разберем ниже). Keras позволяет использовать в качестве бэкенда разные другие фреймворки. При этом написанный вами код будет исполняться независимо от используемого бэкенда. Начиналась разработка, как мы уже говорили, с Theano, но со временем добавился Tensorflow. Сейчас Keras по умолчанию работает именно с ним, но если вы хотите использовать Theano, то есть два варианта, как это сделать:
Стоит отметить, что сейчас ведется работа по написанию биндингов для CNTK от Microsoft, так что через некоторое время появится еще один доступный бэкенд. Следить за этим можно здесь.
Также существует MXNet Keras backend, который пока не обладает всей функциональностью, но если вы используете MXNet, вы можете обратить внимание на такую возможность.
Еще существует интересный проект Keras.js, дающий возможность запускать натренированные модели Keras из браузера на машинах, где есть GPU.
Так что бэкенды Keras ширятся и со временем захватят мир! (Но это неточно.)
Практический пример
В прошлых статьях много внимания было уделено описанию работы классических моделей машинного обучения на описываемых фреймворках. Кажется, теперь мы можем взять в качестве примера [не очень] глубокую нейронную сеть.
Данные
Обучение любой модели в машинном обучении начинается с данных. Keras содержит внутри несколько обучающих датасетов, но они уже приведены в удобную для работы форму и не позволяют показать всю мощь Keras. Поэтому мы возьмем более сырой датасет. Это будет датасет 20 newsgroups — 20 тысяч новостных сообщений из групп Usenet (это такая система обмена почтой родом из 1990-х, родственная FIDO, который, может быть, чуть лучше знаком читателю) примерно поровну распределенных по 20 категориям. Мы будем учить нашу сеть правильно распределять сообщения по этим новостным группам.
Вот пример содержания документа из обучающей выборки:
From: lerxst@wam.umd.edu (where’s my thing)
Subject: WHAT car is this!?
Nntp-Posting-Host: rac3.wam.umd.edu
Organization: University of Maryland, College Park
Lines: 15
I was wondering if anyone out there could enlighten me on this car I saw
the other day. It was a 2-door sports car, looked to be from the late 60s/
early 70s. It was called a Bricklin. The doors were really small. In addition,
the front bumper was separate from the rest of the body. This is
all I know. If anyone can tellme a model name, engine specs, years
of production, where this car is made, history, or whatever info you
have on this funky looking car, please e-mail.
Препроцессинг
Keras содержит в себе инструменты для удобного препроцессинга текстов, картинок и временных рядов, иными словами, самых распространенных типов данных. Сегодня мы работаем с текстами, поэтому нам нужно разбить их на токены и привести в матричную форму.
На выходе у нас получились бинарные матрицы вот таких размеров:
Первое число — количество документов в выборке, а второе — размер нашего словаря (одна тысяча в этом примере).
Еще нам понадобится преобразовать метки классов к матричному виду для обучения с помощью кросс-энтропии. Для этого мы переведем номер класса в так называемый one-hot вектор, т.е. вектор, состоящий из нулей и одной единицы:
На выходе получим также бинарные матрицы вот таких размеров:
Как мы видим, размеры этих матриц частично совпадают с матрицами данных (по первой координате — числу документов в обучающей и тестовой выборках), а частично — нет. По второй координате у нас стоит число классов (20, как следует из названия датасета).
Все, теперь мы готовы учить нашу сеть классифицировать новости!
Модель
Модель в Keras можно описать двумя основными способами:
Sequential API
Первый — последовательное описание модели, например, вот так:
Functional API
Некоторое время назад появилась возможность использовать функциональное API для создания модели — второй способ:
Это позволяет сохранять модели в человеко-читаемом виде, а также инстанциировать модели из такого описания:
Важно отметить, что модель, сохраненная в текстовом виде (кстати, возможно сохранение также и в JSON) не содержит весов. Для сохранения и загрузки весов используйте функции save_weights и load_weights соответственно.
Визуализация модели
Нельзя обойти стороной визуализацию. Keras имеет встроенную визуализацию для моделей:
Этот код сохранит под именем model.png вот такую картинку:
Пакет graphviz в Ubuntu ставится так (в других дистрибутивах Linux аналогично):
На MacOS (используя систему пакетов HomeBrew):
Инструкцию установки на Windows можно посмотреть здесь.
Подготовка модели к работе
Итак, мы сформировали нашу модель. Теперь нужно подготовить ее к работе:
Custom loss
Здесь y_true и y_pred — тензоры из Tensorflow, поэтому для их обработки используются функции Tensorflow.
Обучение и тестирование
Наконец, пришло время для обучения модели:
Возвращает этот метод history — это история ошибок на каждом шаге обучения.
И наконец, тестирование. Метод evaluate получает на вход тестовую выборку вместе с метками для нее. Метрика была задана еще при подготовке к работе, так что больше ничего не нужно. (Но мы укажем еще размер батча).
Callbacks
Нужно также сказать несколько слов о такой важной особенности Keras, как колбеки. Через них реализовано много полезной функциональности. Например, если вы тренируете сеть в течение очень долгого времени, вам нужно понять, когда пора остановиться, если ошибка на вашем датасете перестала уменьшаться. По-английски описываемая функциональность называется «early stopping» («ранняя остановка»). Посмотрим, как мы можем применить его при обучении нашей сети:
Проведите эксперимент и проверьте, как быстро сработает early stopping в нашем примере?
Tensorboard
Еще в качестве колбека можно использовать сохранение логов в формате, удобном для Tensorboard (о нем разговор был в статье про Tensorflow, вкратце — это специальная утилита для обработки и визуализации информации из логов Tensorflow).
Там можно посмотреть, например, как менялась целевая метрика на валидационной выборке:
(Кстати, тут можно заметить, что наша сеть переобучается.)
Продвинутые графы
Теперь рассмотрим построение чуть более сложного графа вычислений. У нейросети может быть множество входов и выходов, входные данные могут преобразовываться разнообразными отображениями. Для переиспользования частей сложных графов (в частности, для transfer learning ) имеет смысл описывать модель в модульном стиле, позволяющем удобным образом извлекать, сохранять и применять к новым входным данным куски модели.
Рассмотрим этот подход на примере модели Siamese Network. Схожие модели активно используются на практике для получения векторных представлений, обладающих полезными свойствами. Например, подобная модель может быть использована для того, чтобы выучить такое отображение фотографий лиц в вектор, что вектора для похожих лиц будут близко друг к другу. В частности, этим пользуются приложения поиска по изображениям, такие как FindFace.
Иллюстрацию модели можно видеть на диаграмме:
Здесь функция G превращает входную картинку в вектор, после чего вычисляется расстояние между векторами для пары картинок. Если картинки из одного класса, расстояние нужно минимизировать, если из разных — максимизировать.
После того, как такая нейросеть будет обучена, мы сможем представить произвольную картинку в виде вектора G(x) и использовать это представление либо для поиска ближайших изображений, либо как вектор признаков для других алгоритмов машинного обучения.
Будем описывать модель в коде соответствующим образом, максимально упростив извлечение и переиспользование частей нейросети.
Сначала определим на Keras функцию, отображающую входной вектор.
Теперь в переменных processed_a и processed_b лежат векторные представления, полученные путем применения сети, определенной ранее, к входным данным.
Отлично, мы получили расстояние между внутренними представлениями, теперь осталось собрать входы и расстояние в одну модель.
Благодаря модульной структуре мы можем использовать base_network отдельно, что особенно полезно после обучения модели. Как это можно сделать? Посмотрим на слои нашей модели:
Загрузим данные и приведем картинки размера 28×28 к плоским векторам.
Отобразим картинки с помощью извлеченной ранее модели:
Теперь в embeddings лежат двумерные вектора, их можно изобразить на плоскости:
Полноценный пример сиамской сети можно увидеть здесь.
Заключение
Вот и все, мы сделали первые модели на Keras! Надеемся, что предоставляемые им возможности заинтересовали вас, так что вы будете его использовать в своей работе.
Пришло время обсудить плюсы и минусы Keras. К очевидным плюсам можно отнести простоту создания моделей, которая выливается в высокую скорость прототипирования. Например, авторы недавней статьи про спутники использовали именно Keras. В целом этот фреймворк становится все более и более популярным:
Keras за год догнал Torch, который разрабатывается уже 5 лет, судя по упоминаниям в научных статьях. Кажется, своей цели — простоты использования — Франсуа Шолле (François Chollet, автор Keras) добился. Более того, его инициатива не осталась незамеченной: буквально через несколько месяцев разработки компания Google пригласила его заниматься этим в команде, разрабатывающей Tensorflow. А также с версии Tensorflow 1.2 Keras будет включен в состав TF (tf.keras).
Также надо сказать пару слов о недостатках. К сожалению, идея Keras о универсальности кода выполняется не всегда: Keras 2.0 поломал совместимость с первой версией, некоторые функции стали называться по-другому, некоторые переехали, в общем, история похожа на второй и третий python. Отличием является то, что в случае Keras была выбрана только вторая версия для развития. Также код Keras работает на Tensorflow пока медленнее, чем на Theano (хотя для нативного кода фреймворки, как минимум, сравнимы).
В целом, можно порекомендовать Keras к использованию, когда вам нужно быстро составить и протестировать сеть для решения конкретной задачи. Но если вам нужны какие-то сложные вещи, вроде нестандартного слоя или распараллеливания кода на несколько GPU, то лучше (а подчас просто неизбежно) использовать нижележащий фреймворк.
Практически весь код из статьи есть в виде одного ноутбука здесь. Также очень рекомендуем вам документацию по Keras: keras.io, а так же официальные примеры, на которых эта статья во многом основана.
Пост написан в сотрудничестве с Wordbearer.





