Что такое keras в python
Особенности Keras / keras 8
В этом материале обсудим некоторые особенности Keras. Также выполним классификацию рукописных цифр с помощью набора данных MNIST, используя Keras и его возможности.
Что такое Keras?
Keras — это библиотека нейронной сети в Python, использующая в качестве бэкенда TensorFlow, Microsoft CNTK или Theano. Ее можно установить вместе с движком с помощью PyPl.
Зачем учить Keras?
Keras делает акцент на пользовательском опыте. С ее помощью пользователь может писать минимум кода для выполнения основных операций. Библиотека модульная и расширяемая. Модели и части кода можно использовать повторно и расширять в будущем.
Особенности Keras
Рассмотрим главные особенности Keras, из-за которых ее стоит учить:
1. Наборы помеченных данных
В Keras много помеченных наборов данных, которые можно импортировать и загрузить.
Пример: классификация небольших изображений CIFAR10, определение тональности рецензий IMDB, классификация новостных тем Reuters, рукописные цифры MNIST и некоторые другие (это лишь примеры самых известных наборов).
Для загрузки набора MNIST нужны следующие команды:
2. Многочисленные реализованные слои и параметры
Keras содержит многочисленные слои и параметры, такие как функции потерь, оптимизаторы, метрики оценки. Они используются для создания, настройки, тренировки и оценки нейронных сетей.
Загрузим эти требуемые слои для построения классификатора цифр.
Keras также поддерживает одно- и двухмерные сверточные и рекуррентные нейронные сети. Для классификатора используем сверточную нейронную сеть (слой Conv2D).
3. Методы для предварительной обработки данных
Перед этим изменим форму и нормализуем данные в соответствии с требованиями.
4. Метод add() в Keras
Для добавления импортированных слоев используется метод add() с дополнительными параметрами.
5. Метод compile()
6. Метод fit()
Тренировка выглядит вот так:
7. Оценка модели
После тренировки модели результаты проверяются на новых данных или с помощью predict_classes() или evaluate().
Проверим модель рукописных цифр. Можете взять в качестве примера это изображение.
Но сперва его нужно конвертировать в формат набора MNIST.
Этот формат представляет собой черно-белые изображения 28*28*1.
8. Модульность
Keras является модульным, поэтому можно сохранить модель и тренировать ее позже.
Это делается вот так:
Выводы
Это основные особенности Keras. Рассмотрели их на примере базовых операций: загрузки набора данных, построения модели, добавления параметров, компиляции, тренировки и оценки. С помощью этой статьи у вас была возможность создать собственный классификатор рукописных цифр на основе набора данных MNIST. Этот пример показывает, что проекты глубокого обучения могут состоять всего из 10 строк кода.
Библиотеки для глубокого обучения: 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.
После изучения необходимых теоретических аспектов, мы готовы к построению и обучению НС. На одном из прошлых занятий по back propagation, мы буквально вручную прописывали алгоритм обучения и структуру сети. Но, это не лучший путь. Особенно, когда сеть становится большой, а критериев качества и методов оптимизации – пруд пруди. Гораздо проще воспользоваться одним из пакетов по разработке и обучению нейросетей. Благо, что на сегодняшний день их масса. Вот диаграмма популярности таких фреймворков, взятая из официальной документации по Keras:
Как видим, по состоянию на 2018 год лидером является TensorFlow, разработанный компанией Google, специально для создания сетей самой разной структуры. Кроме того, TensorFlow позволяет проводить обучение на графических процессорах (GPU), компьютеров объединенных в сеть. Это значительно повышает скорость работы алгоритмов. Но TensorFlow – относительно низкоуровневый фреймворк. Проектировать на нем НС все равно, что писать программу на ассемблере (машинном коде), вместо того, чтобы воспользоваться языками высокого уровня. Как раз другие фреймворки из диаграммы и являются, своего рода, такими языками. Они значительно упрощают процесс проектирования нейросетей. И, в частности, один из самых популярных пакетов Keras является некой надстройкой, оболочкой над TensorFlow:
То есть, используя API Keras, мы в действительности создаем нейросеть на TensorFlow, но делаем это гораздо быстрее. Кроме того, API Keras является официальным фронтендом TensorFlow и мы можем им воспользоваться, просто установив TensorFlow. Для этого нужно выполнить в терминале команду:
pip install tensorflow
Начнется установка, достаточно долгая, т.к. пакет весьма объемный. Дополнительно, мне пришлось установить еще модуль:
pip install tf-nightly
Возможно, еще придется установить Keras как самостоятельный пакет:
Но это все индивидуально и вам не стоит торопиться этого делать, сначала попробуйте только первую команду.
Теперь, начиная с версии
автоматически используется GPU процессора. Для этого на компьютере должно быть установлено специальное ПО:
CUDA для GPU TensorFlow
Иначе, будут выдаваться предупреждения, всякий раз при запуске программы. Но я не стал устанавливать дополнительное ПО, а просто вначале программы пишу строчки:
И предупреждения перестают отображаться. Как поступить вам, решайте сами.
Итак, после установки, можно проверить корректность работы TensorFlow и Keras с помощью двух импортов:
Если здесь программа не выдает никаких ошибок, то, скорее всего, пакеты были успешно установлены и готовы к работе.
Еще один вариант – использовать коллабораторию гугла:
Это специальный сервис для работ по машинному обучению, в том числе и с нейронными сетями. Например, вот у меня здесь написана программа в специальном редакторе
Он очень прост в использовании, поэтому нет смысла его объяснять. Преимущество здесь в том, что вам понадобится только браузер и выход в интернет, чтобы начать проектировать и обучать НС. Это хорошая стартовая площадка. Возможно, я буду показывать часть программ здесь.
Пример построения сети на Keras
Итак, теперь, когда мы с вами разобрались с установкой Keras, давайте воспользуемся его API для построения и обучения простой НС. Сначала я думал взять один из примеров предыдущего занятия, но потом в документации увидел интересную реализацию: перевода градусов Цельсия в градусы Фаренгейта. Общая формула, такая:
Это один из примеров задачи регрессии, когда на выходе сети формируется числовое значение, в данном случае – градусы по Фаренгейту. Итак, для такого преобразования достаточно взять следующую нейросеть с линейной функцией активацией:
Выходное значение будет формироваться как:
Очевидно, что в рамках нашей задачи:
Давайте построим такую простейшую сеть и выполним ее обучение. Сначала импортируем необходимые модули:
Я чуть позже поясню: что здесь что. Далее, в качестве обучающего множества будем использовать два списка:
И, затем, определим модель НС, как последовательную, т.е. состоящую из слоев, идущих друг за другом. Именно такие НС мы рассматривали на наших занятиях:
Добавим в эту модель слой нейронов, состоящий из одного нашего выходного нейрона, имеющий ровно один вход и линейную активационную функцию:
Здесь units=1 означает один нейрон, а input_shape=(1,) – один вход. Конструктор Dense формирует полносвязный слой, то есть, все входы будут связаны со всеми нейронами данного слоя. В нашем простейшем случае – это связь и дополнительно, автоматически, для каждого нейрона добавляется смещение – bias.
Теперь, когда структура НС определена, ее нужно скомпилировать, указав критерий качества и способ оптимизации алгоритма градиентного спуска. В рамках данной задачи мы выберем минимум среднего квадрата ошибки и оптимизацию по Adam:
Видите, нам здесь понадобились знания теоретического материала прошлых занятий. Мы теперь знаем, что такое ‘mean_squared_error’ и когда его выбирать, а также знакомы с принципом оптимизации по Adam и знаем зачем это нужно. Здесь и далее без теоретического материала не обойтись. А вот это значение 0,1 – это шаг сходимости алгоритма обучения. Мы его обозначали через лямбда:
Что еще происходит на этапе компиляции? Сеть автоматически инициализируется начальными значениями весов связей. Так, что теперь она полностью готова к этапу обучения.
Для запуска обучения используется метод fit:
Здесь передается обучающая выборка для входных и выходных значений, затем, число эпох, т.е. выборка будет пропущена через сеть 500 раз и на каждой итерации будут корректироваться весовые коэффициенты и вычисляться значение критерия качества. Последний параметр указывает не отображать в консоли текущую информацию при обучении сети. Мы ее выведем после, используя объект log:
Здесь идет обращение к истории, берутся значения критерия качества (функции потерь – loss function) и отображаются в виде графика.
По идее, все, наша сеть сформирована, обучена и давайте посмотрим как это все будет работать. После запуска программы увидим следующий график:
То есть, наш критерий качества уже на 400-й эпохе практически перестал уменьшаться. Хорошо, теперь было бы интересно узнать как работает сеть и какие весовые коэффициенты были найдены. Чтобы подать на вход произвольное значение, нужно воспользоваться методом predict:
Он возвратит выходное значение и мы его отобразим в консоли. А для отображения весовых коэффициентов, запишем метод get_weights:
Снова запустим программу и в консоли увидим строчки:
[[211.27545]]
[array([[1.8292068]], dtype=float32), array([28.35477], dtype=float32)]
Нейросеть перевела 100 градусов Цельсия в 211 градусов по Фаренгейту, что близко к истине:
А весовые коэффициенты были определены как 1,8 и 28 – также близко к требуемым величинам.
Вот простейший пример того, как с помощью Keras можно описать сеть, определить для нее критерий качества, оптимизационные параметры и провести обучение.
В качестве самостоятельного задания, установите у себя пакет TensorFlow и повторите этот пример.
На следующем занятии мы продолжим знакомиться с API Keras на примерах решения уже более сложных задач.
Видео по теме
Нейронные сети: краткая история триумфа
Структура и принцип работы полносвязных нейронных сетей | #1 нейросети на Python
Ускорение обучения, начальные веса, стандартизация, подготовка выборки | #4 нейросети на Python
Функции активации, критерии качества работы НС | #6 нейросети на Python
Как нейронная сеть распознает цифры | #9 нейросети на Python
Оптимизаторы в Keras, формирование выборки валидации | #10 нейросети на Python
Batch Normalization (батч-нормализация) что это такое? | #12 нейросети на Python
Как работают сверточные нейронные сети | #13 нейросети на Python
Делаем сверточную нейронную сеть в Keras | #14 нейросети на Python
Примеры архитектур сверточных сетей VGG-16 и VGG-19 | #15 нейросети на Python
Теория стилизации изображений (Neural Style Transfer) | #16 нейросети на Python
Делаем перенос стилей изображений с помощью Keras и Tensorflow | #17 нейросети на Python
Как нейронная сеть раскрашивает изображения | #18 нейросети на Python
Введение в рекуррентные нейронные сети | #19 нейросети на Python
Как рекуррентная нейронная сеть прогнозирует символы | #20 нейросети на Python
Делаем прогноз слов рекуррентной сетью Embedding слой | #21 нейросети на Python
Как работают RNN. Глубокие рекуррентные нейросети | #22 нейросети на Python
Как делать сентимент-анализ рекуррентной LSTM сетью | #24 нейросети на Python
Рекуррентные блоки GRU. Пример их реализации в задаче сентимент-анализа | #25 нейросети на Python
Двунаправленные (bidirectional) рекуррентные нейронные сети | #26 нейросети на Python
Автоэнкодеры. Что это и как работают | #27 нейросети на Python
Вариационные автоэнкодеры (VAE). Что это такое? | #28 нейросети на Python
Делаем вариационный автоэнкодер (VAE) в Keras | #29 нейросети на Python
Расширенный вариационный автоэнкодер (CVAE) | #30 нейросети на Python
Что такое генеративно-состязательные сети (GAN) | #31 нейросети на Python
Делаем генеративно-состязательную сеть в Keras и Tensorflow | #32 нейросети на Python
© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта