PyBrain работаем с нейронными сетями на Python

в 17:18, , рубрики: pybrain, python, Алгоритмы, искусственный интеллект, машинное обучение, нейронные сети, метки: , , ,

PyBrain работаем с нейронными сетями на Python
В рамках одного проекта столкнулся необходимостью работать с нейронными сетями, рассмотрел несколько вариантов, больше всего понравилась PyBrain. Надеюсь её описание будет многим интересно почитать.
PyBrain — одна из лучших Python библиотек для изучения и реализации большого количества разнообразных алгоритмов связанных с нейронными сетями. Являет собой хороший пример удачного совмещения компактного синтаксиса Python с хорошей реализацией большого набора различных алгоритмов из области машинного интеллекта.
Предназначен для:

  • Исследователей — предоставляет единообразную среду для реализации различных алгоритмов, избавляя от потребности в использовании десятков различных библиотек. Позволяет сосредоточится на самом алгоритме а не особенностях его реализации.
  • Студентов — с использованием PyBrain удобно реализовать домашнее задание, курсовой проект или вычисления в дипломной работе. Гибкость архитектуры позволяет удобно реализовывать разнообразные сложные методы, структуры и топологии.
  • Лекторов — обучение методам Machine Learning было одной из основных целей при создании библиотеки. Авторы будут рады, если результаты их труда помогут в подготовке грамотных студентов и специалистов.
  • Разработчиков — проект Open Source, поэтому новым разработчикам всегда рады.

О библиотеке

PyBrian представляет собой модульную библиотеку предназначенную для реализации различных алгоритмов машинного обучения на языке Python. Основной его целью является предоставление исследователю гибких, простых в использовании, но в то же время мощных инструментов для реализации задач из области машинного обучения, тестирования и сравнения эффективности различных алгоритмов.
Название PyBrain является аббревиатурой от английского: Python-Based Reinforcement Learning, Artificial Intelligence and Neural Network Library.
Как сказано на одном сайте: PyBrain — swiss army knife for neural networking ( PyBrain — это швейцарский армейский нож в области нейро-сетевых вычислений).

Библиотека построена по модульному принципу, что позволяет использовать её как студентам для обучения основам, так и исследователям, нуждающимся в реализации более сложных алгоритмов. Общая структура процедуры её использования приведена на следующей схеме:
PyBrain работаем с нейронными сетями на Python

Сама библиотека является продуктом с открытым исходным кодом и бесплатна для использования в любом проекте с единственно оговоркой, при её использовании для научных исследований, они просят добавлять в список цитируемых информационных источников (что народ и делает) следующую книгу:

Tom Schaul, Justin Bayer, Daan Wierstra, Sun Yi, Martin Felder, Frank Sehnke, Thomas Rückstieß, Jürgen Schmidhuber. PyBrain. To appear in: Journal of Machine Learning Research, 2010.

Основные возможности

Основными возможностями библиотеки (для версии 0.3 ) являются:

Сети

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

Инструменты

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

  • Построение / Визуализация графиков
  • Поддержка netCDF
  • Запись/чтение XML

Установка библиотеки

Перед установкой Pybrain, создатели рекомендуют установить следующие библиотеки:
Setuptools — пакетный менеджер для Python, который значительно упрощает установку новых библиотек. Для его установки рекомендуется скачать и выполнить (python ez_setup.py) этот скрипт.
После установки у Вас появиться возможность использовать команду

easy_install

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

$ easy_install scipy
$ easy_install matplotlib

Далее устанавливается сама PyBrain

  • Либо используем репозиторий с github
    PyBrain работаем с нейронными сетями на Python

    git clone git://github.com/pybrain/pybrain.git
    

  • Либо качаем последнюю на текущий момент стабильную версию тут. И устанавливаем стандартным способом:
    $ python setup.py install
    

Основы работы с библиотекой

Создание нейронной сети

Создание нейронной сети с двумя входами, тремя скрытыми слоями и одним выходом:

>>> from pybrain.tools.shortcuts import buildNetwork
>>> net = buildNetwork(2, 3, 1)

В результате, в объекте net находится созданная нейронная цепь, инициализированная случайными значениями весов.

Функция активации

Функция активации задаётся следующим образом:

net.activate([2, 1])

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

Получение данных о сети

Для того, чтобы получить информацию о текущей структуре сети, каждый её элемент имеет имя. Данное имя может быть дано автоматически, либо по иным критериям при создании сети.
К примеру, для сети net имена даны автоматически:

>>> net['in']
<LinearLayer 'in'>
>>> net['hidden0']
<SigmoidLayer 'hidden0'>
>>> net['out']
<LinearLayer 'out'>

Скрытые слои поименованы с номером слоя добавленным к имени.

Возможности при создании сети

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

  • BiasUnit
  • GaussianLayer
  • LinearLayer
  • LSTMLayer
  • MDLSTMLayer
  • SigmoidLayer
  • SoftmaxLayer
  • StateDependentLayer
  • TanhLayer

>>> from pybrain.structure import TanhLayer
>>> net = buildNetwork(2, 3, 1, hiddenclass=<b>TanhLayer</b>)
>>> net['hidden0']
<TanhLayer 'hidden0'>

Также возможно задать и тип выходного слоя:

>>> from pybrain.structure import SoftmaxLayer
>>> net = buildNetwork(2, 3, 2, hiddenclass=TanhLayer, outclass=SoftmaxLayer)
>>> net.activate((2, 3))
array([ 0.6656323,  0.3343677])

Дополнительно возможно использование смещения (bias)

>>> net = buildNetwork(2, 3, 1, bias=True)
>>> net['bias']
<BiasUnit 'bias'>
Оперирование данными (Building a DataSet)

Созданная сеть должна обрабатывать данные, работе с которыми и посвящён этот раздел. Типичным набором данных является набор входных и выходных значений. Для работы с ними PyBrain использует модуль pybrain.dataset, также далее используется класс SupervisedDataSet.

Настройка данных

Класс SupervisedDataSet используется для типичного обучения с учителем. Он поддерживает массивы выходных и выходных данных. Их размеры задаются при создании экземпляра класса:
Запись вида:

>>> from pybrain.datasets import SupervisedDataSet
>>> ds = SupervisedDataSet(2, 1)

означает, что создаётся структура данных для хранения двухмерных входных данных и одномерных выходных.

Добавление образцов

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

>>> ds.addSample((0, 0), (0,))
>>> ds.addSample((0, 1), (1,))
>>> ds.addSample((1, 0), (1,))
>>> ds.addSample((1, 1), (0,))
Исследование структуры образца

Для получения массивов данных в текущем их наборе возможно использовать стандартные функции Python для работы с массивами.

>>> len(ds)

выведет 4, так-как это количество элементов.
Итерация по множеству также может быть организована обычным для массивов способом:

>>> for inpt, target in ds:
	print inpt, target

...
[ 0.  0.] [ 0.]
[ 0.  1.] [ 1.]
[ 1.  0.] [ 1.]
[ 1.  1.] [ 0.]

Также к каждому набору полей можно получить прямой доступ с использованием его имени:

>>> ds['input']

array([[ 0.,  0.],
       [ 0.,  1.],
       [ 1.,  0.],
       [ 1.,  1.]])
>>> ds['target']

array([[ 0.],
       [ 1.],
       [ 1.],
       [ 0.]])

Также можно вручную освободить занимаемую образцом память полностью его удалив:

>>> ds.clear()
>>> ds['input']

array([], shape=(0, 2), dtype=float64)

>>> ds['target']

array([], shape=(0, 1), dtype=float64)
Тренировка сети на образцах

В PyBrain использована концепция тренеров (trainers) для обучения сетей с учителем. Тренер получает экземпляр сети и экземпляр набора образцов и затем обучает сеть по полученному набору.
Классический пример это обратное распространение ошибки (backpropagation). Для упрощения реализации этого подход в PyBrain существует класс BackpropTrainer.

>>> from pybrain.supervised.trainers import BackpropTrainer

Обучающий набор образцов (ds) и целевая сеть (net) уже созданы в примерах выше, теперь они будут объединены.

>>> net = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)
>>> trainer = BackpropTrainer(net, ds)

Тренер получил ссылку на структуру сети и может её тренировать.

>>> trainer.train()

0.31516384514375834

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

>>> trainer.trainUntilConvergence()

Данный метод возвратит массив ошибок для каждой эпохи.

Ещё примеры реализации разных сетей

В статье

Tom Schaul, Martin Felder, et.al. PyBrain, Journal of Machine Learning Research 11 (2010) 743-746.

приведён пример создания сети с загрузкой данных из .mat файла.
PyBrain работаем с нейронными сетями на Python

# Load Data Set. 
ds = SequentialDataSet.loadFromFile(’parity.mat’) 
# Build a recurrent Network. 
net = buildNetwork(1, 2, 1, bias=True, 
	hiddenclass=TanhLayer, 
	outclass=TanhLayer, 
	recurrent=True) 
recCon = FullConnection(net[’out’], net[’hidden0’]) 
net.addRecurrentConnection(recCon) 
net.sortModules() 
# Create a trainer for backprop and train the net. 
trainer = BackpropTrainer(net, ds, learningrate=0.05) 
trainer.trainEpochs(1000) 

Немного ссылок:

Заключение

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

P.S. Если есть поправки по названиям некоторых терминов, то я готов выслушать, не уверен в 100% точности пары переводов, возможно уже есть уставившиеся термины.

Автор: Pavel_Osipov

* - обязательные к заполнению поля