Sequential keras что это

На предыдущем занятии мы с вами увидели, как можно с нуля создавать слои и модели, используя базовые классы:

(Подробнее о них также см. официальную документацию https://keras.io/api/models/).

Некоторые из этих классов мы с вами уже использовали в курсе «Нейронные сети». Если вы его не смотрели, то рекомендую ознакомиться:

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

Класс Sequential

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

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

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

А, затем, создаем экземпляр класса Sequential, то есть, последовательную архитектуру нейронной сети:

В действительности, это эквивалентно последовательному вызову слоев для некоторого входного тензора:

Класс Sequential предоставляет лишь удобство и некоторый дополнительный функционал при работе с моделью. Например, все слои доступны через список model.layers:

Можно удалить последний слой методом pop():

А, затем, добавить методом add():

Соответственно, можно вначале определить пустую модель (без слоев):

а после этого добавить необходимые элементы:

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

У каждого слоя и у модели в целом имеется свойство weights, содержащее список настраиваемых параметров (весовых коэффициентов). Если обратиться к первому слою и свойству weights:

то увидим пустой список. А если сделать то же самое для всей модели:

то получим исключение (ошибку). Это связано с тем, что до момента подачи входного сигнала на вход сети весовые коэффициенты еще не были сформированы. Здесь все работает по аналогии с нашим классом DenseLayer, который мы создавали на предыдущем занятии. Пока не будет вызван метод build слоя, весовые коэффициенты отсутствуют.

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

Теперь при обращении к свойству weights получим список всех весовых коэффициентов модели:

и мы также можем вывести структуру этой модели с помощью метода summary():

Слой Input

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

Здесь первый слой Input() устанавливает размерность входного тензора, равным 20 элементов. Это означает, что на вход следует подавать данные в формате:

Обратите внимание, в Keras первая размерность – это размер мини-батча, по которому производится расчет градиентов и оптимизация весовых коэффициентов. Поэтому, указывая размер 20, получаем матрицу:

Именно так мы задавали входной тензор для нашей модели (размерностью 1 x 20):

Также следует иметь в виду, что в коллекции model.layers:

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

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

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

Последовательная модель обучается абсолютно также, как и любая другая модель в Keras. Если у нас есть обучающая выборка:

то достаточно задать функцию потерь, оптимизатор:

и запустить обучением через метод fit():

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

Извлечение признаков из последовательной модели

Давайте теперь на основе последовательной модели сформируем немного более сложную модель, которая будет иметь тот же один вход, но два выхода (по одному от каждого слоя):

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

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

Обратите внимание, мы это делаем после обучения сети. В результате, модель model_ex будет содержать те же самые слои и весовые коэффициенты, что и модель model, так как лишь меняет конфигурацию входов и выходов, но не создает сеть заново. То есть, обе модель ссылаются на одну и ту же архитектуру НС.Благодаря этому, мы можем обучать любую из них, а затем, использовать обе, как обученный вариант НС.

В качестве маленького эксперимента давайте создадим модель model_ex непосредственно после модели model, обучим первую модель (model) и сравним выходные результаты последнего слоя:

Как видим, выходные значения идентичны. Это показывает, что обе модели представляют одну и ту же нейронную сеть. Но, model_ex дополнительно еще дает доступ к промежуточным слоям.

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

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

то получим эквивалент исходной модели, так как все промежуточные слои между входом и указанными выходами автоматически повторяются. Мы можем в этом убедиться, вызвав метод summary() для второй модели:

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

Расширение существующей модели

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

Смотрите, здесь первая часть модель – это первая модель, а далее описан еще один слой Dense. Мало того, мы можем обучить этот последний слой, не трогая веса первой модели, то есть, исключая ее из обучения. Для этого достаточно определить свойство:

И после компилирования второй модели:

дообучим ее последний слой:

При необходимости можно «замораживать» отдельные слои, исключая их из обучения. Для этого следует обратиться к слою и установить у него тот же параметр trainable в False:

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

Видео по теме

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#1. Что такое Tensorflow? Примеры применения. Установка

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#2. Тензоры tf.constant и tf.Variable. Индексирование и изменение формы

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#3. Математические операции и функции над тензорами

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#4. Реализация автоматического дифференцирования. Объект GradientTape

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#5. Строим градиентные алгоритмы оптимизации Adam, RMSProp, Adagrad, Adadelta

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#6. Делаем модель с помощью класса tf.Module. Пример обучения простой нейросети

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#7. Делаем модель нейросети для распознавания рукописных цифр

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#8. Декоратор tf.function для ускорения выполнения функций

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#9. Введение в модели и слои бэкэнда Keras

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#13. Создаем ResNet подобную архитектуру для классификации изображений CIFAR-10

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#14. Тонкая настройка и контроль процесса обучения через метод fit()

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#15. Тонкая настройка обучения моделей через метод compile()

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

#16. Способы сохранения и загрузки моделей в Keras

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

Источник

Обучение и оценка модели с Keras

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Это руководство охватывает обучение, оценку и прогнозирование (выводы) моделей в TensorFlow 2.0 в двух общих ситуациях:

Установка

Часть I: Использование встроенных циклов обучения и оценки

При передаче данных во встроенные циклы обучения модели вы должны использовать массивы Numpy (если ваши данные малы и умещаются в памяти), либо объекты Dataset tf.data. В следующих нескольких параграфах мы будем использовать набор данных MNIST в качестве массива Numpy, чтобы показать, как использовать оптимизаторы, функции потерь и метрики.

Обзор API: первый полный пример

Давайте рассмотрим следующую модель (будем строим ее с помощью Functional API, но она может быть и Sequential или субклассированной моделью):

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

Определение потерь, метрик и оптимизатора

Вам нужно передать их в модель в качестве аргументов метода compile() :

Аргумент metrics задается в виде списка — ваша модель может иметь любое количество метрик.

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

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

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

Вам доступно множество встроенных оптимизаторов, функций потерь и метрик

Как правило, вам не нужно создавать с нуля собственные функции потерь, метрики, или оптимизаторы, поскольку то, что вам нужно, скорее всего, уже является частью Keras API:

Кастомные функции потерь

Кастомные метрики

Обработка функций потерь и метрик, не соответствующих стандартной сигнатуре

В таких случаях вы можете вызвать self.add_loss(loss_value) из метода call кастомного слоя. Вот простой пример, который добавляет регуляризацию активности (отметим что регуляризация активности встроена во все слои Keras — этот слой используется только для приведения конкретного примера):

Вы можете сделать то же самое для логирования значений метрик:

Вот простой пример:

Автоматическое выделение валидационного отложенного множества

В первом полном примере, как вы видели, мы использовали аргумент validation_data для передачи кортежа массивов Numpy (x_val, y_val) в модель для оценки валидационных потерь и метрик в конце каждой эпохи.

Вот другая опция: аргумент validation_split позволяет вам автоматически зарезервировать часть ваших тренировочных данных для валидации. Значением аргумента является доля данных, которые должны быть зарезервированы для валидации, поэтому значение должно быть больше 0 и меньше 1. Например, validation_split=0.2 значит «используйте 20% данных для валидации», а validation_split=0.6 значит «используйте 60% данных для валидации».

Вы можете использовать validation_split только когда обучаете модель данными Numpy.

Обучение и оценка с tf.data Dataset

Давайте теперь рассмотрим случай, когда ваши данные поступают в форме Dataset tf.data.

tf.data API это набор утилит в TensorFlow 2.0 для загрузки и предобработки данных быстрым и масштабируемым способом.

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

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

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

Использование валидационного датасета

Вы можете передать экземпляр Dataset как аргумент validation_data в fit :

В конце каждой эпохи модель будет проходить по валидационному Dataset и вычислять потери и метрики на валидации.

Обратите внимание, что валидационный Dataset будет сбрасываться после каждого использования (так что вы всегда будете получать оценку на одних и тех же примерах от эпохи к эпохе).

Аргумент validation_split (генерирующий отложенную выборку из тренировочных данных) не поддерживается при обучении на объектах Dataset, поскольку для этого требуется возможность индексирования элементов, что в общем невозможно в Dataset API.

Другие поддерживаемые форматы входных данных

Кроме массивов Numpy и TensorFlow Dataset-ов, можно обучить модель Keras с использованием датафрейма Pandas, или с генераторами Python которые выдают значения пакетами.

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

Использование весов для примеров и классов

Кроме входных данных и меток модели можно передавать веса примеров и веса классов при использовании fit :

Словарь «class weights» является более специфичным экземпляром той же концепции: он сопоставляет индексам классов веса которые должны быть использованы для элементов принадлежащих этому классу. Например, если класс «0» представлен втрое меньше чем класс «1» в ваших данных, вы можете использовать class_weight= <0: 1., 1: 0.5>.

Вот примеры Numpy весов классов и весов элементов позволяющих придать большее значение корректной классификации класса #5 (соответствующий цифре «5» в датасете MNIST).

Вот соответствующий Dataset пример:

Передача данных в модели с несколькими входами и выходами

В предыдущих примерах, мы рассматривали модель с единственным входом (тензор размера (764,) ) и одним выходом (тензор прогнозов размера (10,) ). Но как насчет моделей, у которых есть несколько входов или выходов?

Рассмотрим следующую модель, в которой на входными данными являются изображения размера (32, 32, 3) (это (height, width, channels) ) и временные ряды размера (None, 10) (это (timesteps, features) ). У нашей модели будет два выхода вычисленных из комбинации этих входов: «score» (размерности (1,) ) и вероятностное распределение по пяти классам (размерности (5,) ).

Давайте начертим эту модель, чтобы вы ясно увидели что мы здесь делаем (заметьте что размерности, которые вы видите на схеме это размерности пакетов, а не поэлементные размерности).

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

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

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

Аналогично для метрик:

Так как мы дали имена нашим выходным слоям, мы могли бы также указать функции потерь и метрики для каждого выхода в dict:

Мы рекомендуем использовать имена и словари если у вас более 2 выходов.

Имеется возможность присвоить разные веса разным функциям потерь (например, в нашем примере мы можем захотеть отдать предпочтение потере «score», увеличив в 2 раза важность потери класса), используя аргумент loss_weights :

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

Передача данных в модель с несколькими входами и выходами в fit происходит аналогично определению функции потерь в compile : вы можете передать списки массивов Numpy (совпадающие 1:1 с выходами на которых есть функции потерь) или словари сопоставляющие имена выходов массивам Numpy тренировочных данных.

Ниже пример для Dataset: аналогично массивам Numpy, Dataset должен возвращать кортеж словарей.

Использование колбеков

Колбеки в Keras это объекты которые вызываются в разных местах во время обучения (в начале эпохи, в конце пакета, в конце эпохи, и т.д.) и которые могут быть использованы для реализации такого поведения, как:

Выполнение валидации в различных точках во время обучения (кроме встроенной валидации в конце каждой эпохи)

Пользователям доступно большое количество встроенных колбеков

Написание собственного колбека

Вот простой пример сохранения списка значений попакетных потерь во время обучения:

Сохранение контрольных точек моделей

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

Проще всего сделать это с помощью колбека ModelCheckpoint :

Вы также можете написать собственный колбек для сохранения и восстановления моделей.

Использование графиков скорости обучения

Обычным паттерном при тренировке моделей глубокого обучения является постепенное сокращение скорости обучения по мере тренировки модели. Это общеизвестно как «снижение скорости обучения».

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

Передача расписания оптимизатору

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

Использование колбеков для реализации графика динамического изменения скорости обучения

Расписание динамического изменения скорости обучения (например, уменьшение скорости обучения, когда потери при валидации более не улучшаются) не может быть достигнуто с этими объектами расписания, поскольку оптимизатор не имеет доступа к показателям валидации.

Визуализация потерь и метрик во время обучения

Лучший способ следить за вашей моделью во время обучения — это использовать TensorBoard — приложение на основе браузера, которое вы можете запустить локально и которое предоставляет вам:

Использование колбека TensorBoard

В простейшем случае просто укажите, куда вы хотите, чтобы колбек писал логи, и все готово:

Колбек TensorBoard имеет много полезных опций, в том числе, писать ли лог вложений, гистограмм и как часто писать логи:

Часть II: Написание собственных циклов обучения и оценки с нуля

Использование GradientTape: первый полный пример

Вызов модели внутри области видимости GradientTape позволяет получить градиенты обучаемых весов слоя относительно значения потерь. Используя экземпляр оптимизатора, вы можете использовать эти градиенты для обновления переменных (которые можно получить с помощью model.trainable_weights ).

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

Низкоуровневая обработка метрик

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

Низкоуровневая обработка дополнительных потерь

В общем вы можете захотеть учесть эти потери в своих пользовательских циклах обучения (если только вы сами не написали модель и уже знаете, что она не создает таких потерь).

Вспомните пример из предыдущего раздела, где есть слой, который создает потери регуляризации:

Когда вы вызываете модель так:

потери которые она создает во время прямого прохода добавляются в атрибут model.losses :

Чтобы учесть эти потери во время обучения, все, что вам нужно сделать, это модифицировать цикл обучения, добавив к полному значению потерь sum(model.losses) :

Это была последняя часть паззла! Вы достигли конца руководства.

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

Источник

Боковая панель

НАЧАЛО РАБОТЫ

МОДЕЛИ

ПРЕДОБРАБОТКА

ПРИМЕРЫ

Keras: библиотека глубокого обучение на Python

Вы только что открыли для себя Keras.

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

Используйте Keras, если Вам нужна библиотека глубокого обучения, которая:

Keras совместим с Python 2.7 — 3.6.

Многоуровневый бэкенд Keras и tf.keras.

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

Keras 2.2.5 — последняя версия Keras, реализующая API 2.2. и поддерживая только TensorFlow 1 (а также Theano и CNTK).

Текущая версия Keras — Keras 2.3.0, в которой внесены существенные изменения в API и добавлена поддержка TensorFlow 2.0. Версия Keras 2.3.0 будет последней версией многоуровневого бэкенда Keras, который заменяется на tf.keras.

Ошибки многоуровневого бэкенда Keras будут исправляться только до апреля 2020 г. (в качестве небольших изменений версии).

Больше информации о планируемых изменениях Keras смотрите на: the Keras meeting notes.

Основные идеи.

Первые шаги: 30 секунд до Keras.

Базовая структура данных библиотеки Keras — это модель, описывающая способ организации слоев. Простейшим типом модели является модель Sequential, представляющая собой линейный стек слоев. Для более сложных архитектур вы должны использовать функциональное программирование (Keras functional API), которое позволяет строить произвольные графы слоев.

Источник

Библиотеки для глубокого обучения: Keras

Привет, Хабр! Мы уже говорили про Theano и Tensorflow (а также много про что еще), а сегодня сегодня пришло время поговорить про Keras.

Изначально Keras вырос как удобная надстройка над Theano. Отсюда и его греческое имя — κέρας, что значит «рог» по-гречески, что, в свою очередь, является отсылкой к Одиссее Гомера. Хотя, с тех пор утекло много воды, и Keras стал сначала поддерживать Tensorflow, а потом и вовсе стал его частью. Впрочем, наш рассказ будет посвящен не сложной судьбе этого фреймворка, а его возможностям. Если вам интересно, добро пожаловать под кат.

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Начать стоит от печки, то есть с оглавления.

Установка

Установка Keras чрезвычайно проста, т.к. он является обычным питоновским пакетом:

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

ВНИМАНИЕ: Чтобы работать с Keras, у вас уже должен быть установлен хотя бы один из фреймворков — Theano или Tensorflow.

Бэкенды

Бэкенды — это то, из-за чего Keras стал известен и популярен (помимо прочих достоинств, которые мы разберем ниже). Keras позволяет использовать в качестве бэкенда разные другие фреймворки. При этом написанный вами код будет исполняться независимо от используемого бэкенда. Начиналась разработка, как мы уже говорили, с Theano, но со временем добавился Tensorflow. Сейчас Keras по умолчанию работает именно с ним, но если вы хотите использовать Theano, то есть два варианта, как это сделать:

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

Также существует MXNet Keras backend, который пока не обладает всей функциональностью, но если вы используете MXNet, вы можете обратить внимание на такую возможность.

Еще существует интересный проект Keras.js, дающий возможность запускать натренированные модели Keras из браузера на машинах, где есть GPU.

Так что бэкенды Keras ширятся и со временем захватят мир! (Но это неточно.)

Практический пример

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

Данные

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential 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 вот такую картинку:

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Пакет 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).

Там можно посмотреть, например, как менялась целевая метрика на валидационной выборке:
Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это
(Кстати, тут можно заметить, что наша сеть переобучается.)

Продвинутые графы

Теперь рассмотрим построение чуть более сложного графа вычислений. У нейросети может быть множество входов и выходов, входные данные могут преобразовываться разнообразными отображениями. Для переиспользования частей сложных графов (в частности, для transfer learning ) имеет смысл описывать модель в модульном стиле, позволяющем удобным образом извлекать, сохранять и применять к новым входным данным куски модели.

Рассмотрим этот подход на примере модели Siamese Network. Схожие модели активно используются на практике для получения векторных представлений, обладающих полезными свойствами. Например, подобная модель может быть использована для того, чтобы выучить такое отображение фотографий лиц в вектор, что вектора для похожих лиц будут близко друг к другу. В частности, этим пользуются приложения поиска по изображениям, такие как FindFace.

Иллюстрацию модели можно видеть на диаграмме:

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Здесь функция G превращает входную картинку в вектор, после чего вычисляется расстояние между векторами для пары картинок. Если картинки из одного класса, расстояние нужно минимизировать, если из разных — максимизировать.

После того, как такая нейросеть будет обучена, мы сможем представить произвольную картинку в виде вектора G(x) и использовать это представление либо для поиска ближайших изображений, либо как вектор признаков для других алгоритмов машинного обучения.

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

Сначала определим на Keras функцию, отображающую входной вектор.

Теперь в переменных processed_a и processed_b лежат векторные представления, полученные путем применения сети, определенной ранее, к входным данным.

Отлично, мы получили расстояние между внутренними представлениями, теперь осталось собрать входы и расстояние в одну модель.

Благодаря модульной структуре мы можем использовать base_network отдельно, что особенно полезно после обучения модели. Как это можно сделать? Посмотрим на слои нашей модели:

Загрузим данные и приведем картинки размера 28×28 к плоским векторам.

Отобразим картинки с помощью извлеченной ранее модели:

Теперь в embeddings лежат двумерные вектора, их можно изобразить на плоскости:
Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential keras что это

Полноценный пример сиамской сети можно увидеть здесь.

Заключение

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

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

Sequential keras что это. Смотреть фото Sequential keras что это. Смотреть картинку Sequential keras что это. Картинка про Sequential keras что это. Фото Sequential 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.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *