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

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


 В рамках одного проекта столкнулся необходимостью работать с нейронными сетями, рассмотрел несколько вариантов, больше всего понравилась 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 — это швейцарский армейский нож в области нейро-сетевых вычислений).

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

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

    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 файла.

# 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)  


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



Заключение

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

Источник: habrahabr.ru

Комментарии: