Простой пример нейронной сети на keras и tensorflow с тремя слоями

В данном посте будет показано, как инициализировать нейроннуй сеть на python, задать слои, обучить и получить предсказанные результаты. Пример сделан на python3, а в прослойке между tensorflow установлена библиотека Keras. Чтобы было понятнее — все входные параметры будут подписаны.
И так, нейронные сети очень мощный и не тривиальный инструмент в руках дата-инженера. Однако большинство продвижений в области машинного обучения в последние годы связано именно с нейронными сетями.
Установка:
keras и tensorflow ставится через pip: pip3 install keras и pip3 install —upgrade tensorflow
Отмечу, что здесь мы установили tensorflow для CPU, использование GPU даёт существенный прирост скорости, но и поставить посложнее.

Общий путь
1) Создание модели
2) Компилирование модели
3) Загрузка/подготовка данных
4) Обучение нейронной сети
5) Предсказание

Импорт библиотек:
import numpy as np
# Для создания простых моделей используют Sequential,
# При использовании Sequential достаточно добавить несколько своих слоев.
# Для более сложных моделей уже надо будет использовать Functional API
from keras.models import Sequential
from keras.layers import Dense # Dense — один из типов слоёв в Keras для создания слоя нейронов

Использовать будем бинарную классификацию, т.е. по набору фич надо определить принадлежит ли объект классу или нет.
Данные можете взять свои или например из этого файла data.txt. В нём есть 8 фич, а последний столбец показывает принадлежность классу

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# загружаем данные с фичами
dataset = np.loadtxt("data.txt", delimiter=",")
# Первые 8 столбцов в примере отвечают за фичи, последний же за класс, разбиваем 
X = dataset[:,0:8]
Y = dataset[:,8]

# Создаём модель!
model = Sequential()
# Добавляем первый слой Dense, первое число 12 - это количество нейронов, 
# input_dim - количество фич на вход
# activation -  функция активации, полулинейная функция max(x, 0) 
# именно полулинейные функции позволяют получать нелинейные результаты с минимальными затратами
model.add(Dense(12, input_dim=8, activation='relu'))
# добавляем второй слой с 8ю нейронами
model.add(Dense(8, activation='relu'))
# на выходе при бинарной классификации, функцию активации чаще всего используют sigmoid , реже softmax
# Компилирование модели. binary_crossentropy - опять же не случайно, а т.к. у нас два класса.
# Метрика accuracy используется практически для всех задач классификации
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Наконец дошли до обучения модели, X и Y - понятно, 
# epoch - максимальное количество эпох до остановки
# batch_size - сколько объектов будет загружаться за итерацию
model.fit(X, Y, epochs=15, batch_size=10,  verbose=2)
# Предсказание
predictions = model.predict(X)

Создание высокоточной нейронной сети — непростое задание. Порой хорошо работающие сетки получают случайно, и сложно объснить почему именно они хорошо работают. Поэтому дальше можете поиграть с разными параметрами. Заглядывая наперед — один из способов подбора гиперпараметров нейронной сети — использование библиотеки hyperopt, которая пытается сделать предсказать результирующую функцию, вместо перебора всех параметров, т.к. перебор параметров может быть уж сильно долгим.
Таким образом на выходе мы получаем обученную нейронную сеть на keras . Для использования этой сети в будущем, проще всего использовать model.save(filepath) . Обращу внимание, что picke не рекомендуется. А для загрузки сохраненной ранее модели: keras.models.load_model(filepath).

2 thoughts on “Простой пример нейронной сети на keras и tensorflow с тремя слоями

  1. Roma

    Пробую запустить ваш скрипт-пример, получаю сообщение об ошибке:

    ValueError: Error when checking target: expected dense_1 to have shape (12,) but got array with shape (1,)

    Подскажите пожалуйста решение ?

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>