Keras - установка и первое знакомство

После изучения необходимых теоретических аспектов, мы готовы к построению и обучению НС. На одном из прошлых занятий по 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 как самостоятельный пакет:

pip install keras

Но это все индивидуально и вам не стоит торопиться этого делать, сначала попробуйте только первую команду.

Теперь, начиная с версии

TensorFlow 2.0

автоматически используется GPU процессора. Для этого на компьютере должно быть установлено специальное ПО:

CUDA для GPU TensorFlow

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

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

И предупреждения перестают отображаться. Как поступить вам, решайте сами.

Итак, после установки, можно проверить корректность работы TensorFlow и Keras с помощью двух импортов:

import tensorflow as tf
from tensorflow import keras

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

Еще один вариант – использовать коллабораторию гугла:

https://colab.research.google.com

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

Jupyter

Он очень прост в использовании, поэтому нет смысла его объяснять. Преимущество здесь в том, что вам понадобится только браузер и выход в интернет, чтобы начать проектировать и обучать НС. Это хорошая стартовая площадка. Возможно, я буду показывать часть программ здесь.

Пример построения сети на Keras

Итак, теперь, когда мы с вами разобрались с установкой Keras, давайте воспользуемся его API для построения и обучения простой НС. Сначала я думал взять один из примеров предыдущего занятия, но потом в документации увидел интересную реализацию: перевода градусов Цельсия в градусы Фаренгейта. Общая формула, такая:

Это один из примеров задачи регрессии, когда на выходе сети формируется числовое значение, в данном случае – градусы по Фаренгейту. Итак, для такого преобразования достаточно взять следующую нейросеть с линейной функцией активацией:

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

Очевидно, что в рамках нашей задачи:

Давайте построим такую простейшую сеть и выполним ее обучение. Сначала импортируем необходимые модули:

import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras.layers import Dense

Я чуть позже поясню: что здесь что. Далее, в качестве обучающего множества будем использовать два списка:

c = np.array([-40, -10, 0, 8, 15, 22, 38])
f = np.array([-40, 14, 32, 46, 59, 72, 100])

И, затем, определим модель НС, как последовательную, т.е. состоящую из слоев, идущих друг за другом. Именно такие НС мы рассматривали на наших занятиях:

model = keras.Sequential()

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

model.add(Dense(units=1, input_shape=(1,), activation='linear'))

Здесь units=1 означает один нейрон, а input_shape=(1,) – один вход. Конструктор Dense формирует полносвязный слой, то есть, все входы будут связаны со всеми нейронами данного слоя. В нашем простейшем случае – это связь  и дополнительно, автоматически, для каждого нейрона добавляется смещение – bias.

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

model.compile(loss='mean_squared_error', optimizer=keras.optimizers.Adam(0.1))

Видите, нам здесь понадобились знания теоретического материала прошлых занятий. Мы теперь знаем, что такое 'mean_squared_error' и когда его выбирать, а также знакомы с принципом оптимизации по Adam и знаем зачем это нужно. Здесь и далее без теоретического материала не обойтись. А вот это значение 0,1 – это шаг сходимости алгоритма обучения. Мы его обозначали через лямбда:

Что еще происходит на этапе компиляции? Сеть автоматически инициализируется начальными значениями весов связей. Так, что теперь она полностью готова к этапу обучения.

Для запуска обучения используется метод fit:

log = model.fit(c, f, epochs=500, verbose=False)

Здесь передается обучающая выборка для входных и выходных значений, затем, число эпох, т.е. выборка будет пропущена через сеть 500 раз и на каждой итерации будут корректироваться весовые коэффициенты и вычисляться значение критерия качества. Последний параметр указывает не отображать в консоли текущую информацию при обучении сети. Мы ее выведем после, используя объект log:

plt.plot(log.history['loss'])
plt.grid(True)
plt.show()

Здесь идет обращение к истории, берутся значения критерия качества (функции потерь – loss function) и отображаются в виде графика.

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

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

print(model.predict([100]))

Он возвратит выходное значение и мы его отобразим в консоли. А для отображения весовых коэффициентов, запишем метод get_weights:

print(model.get_weights())

Снова запустим программу и в консоли увидим строчки:

[[211.27545]]
[array([[1.8292068]], dtype=float32), array([28.35477], dtype=float32)]

Нейросеть перевела 100 градусов Цельсия в 211 градусов по Фаренгейту, что близко к истине:

А весовые коэффициенты были определены как 1,8 и 28 – также близко к требуемым величинам.

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

В качестве самостоятельного задания, установите у себя пакет TensorFlow и повторите этот пример.

На следующем занятии мы продолжим знакомиться с API Keras на примерах решения уже более сложных задач.

Видео по теме