Пользователь
0,0
рейтинг
24 июля 2012 в 21:18

Разработка → 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 — это швейцарский армейский нож в области нейро-сетевых вычислений).

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


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


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




Заключение


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

P.S. Если есть поправки по названиям некоторых терминов, то я готов выслушать, не уверен в 100% точности пары переводов, возможно уже есть устоявшиеся названия.
Павел Осипов @Pavel_Osipov
карма
66,5
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (22)

  • +2
    Спасибо, только начал изучать питон и задумался, а есть ли реализация алгоритмов машинного обучения, а тут как раз ваша статья по теме!
    • +1
      В таком случае надеюсь PyBrain Вам понравится, и позволит реализовать что-нибудь занимательное
    • +5
      Могу еще посоветовать:
      • 0
        Это уже не нейронные сети, но тоже конечно Machine Learning.
        Может расширите Ваш комментарий аргументацией рекомендации именно этих двух проектов?
        • +3
          +1 к этим проектам. Чего тут комментировать) В scikit-learn собрана куча современных алгоритмов, довольно неплохо оптимизированных, и люди все это на практике используют. В PyBrain — только небыстрые и не супер-актуальные нейронные сети + довольно корявые биндинги для SVM, которые, похоже, не очень-то и поддерживаются. Даже если количество коммитов сравнить — в PyBrain их за последний год штук 10 было, в scikit-learn это сотни (по десятку в день), очень активный и хороший проект. Pandas не пользовался, но все хвалят очень.
    • –1
      При обцчении в ШАДе я искал различные библиотеки, реализующие алгоритмы машинного обучения. К сожалению, в большинстве реализованы обычно только базисные алгоритмы и каких-то продвинутостей нету.

      В данной библиотеке PyBrain удивительно много алгоритмов. Насколько удобно ими пользоваться — непонятно.
  • 0
    Когда я сел разбираться в нейронных сетях, то понял, что метод обратного распространения по сравнению с другими методами это как счёты по сравнению с суперкомпьютером. Для объяснения принципов и модельных примеров — пойдёт, для реальных задач он ужасен.
  • +2
    Сравнивали с fann? У них есть биндинги к python в комплекте, да и побыстрее должна быть.
    • +1
      К PyBrain можно прикручивать arac, который дает прирост производительности раз в 10. А вот с fann я как раз собираюсь сравнить.
      • 0
        Я-бы использовал PyPy для JIT, более общий конечно вариант, по идее должен быть медленнее чем arac, просто смущает то, что последнее обновление для arac было больше двух лет назад
    • +1
      Так… Вобщем сравнил. Субъективно libfann на порядок медленнее чем PyBrain + arac!
      • 0
        На порядок это серьёзно! Опишете процесс тестирования? Есть численные результаты (графики всегда эффектно выглядят)?
        Сравнить со связкой PyPy + PyBrain не надумали?

        А вообще, спасибо, что поделились. Такая информация может пригодится.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Девиз Java: «Зачем просто, когда можно сложно?»
    • +1
      Чушь. На любом языке можно создать фигню.
      У меня мой проект сетей создается 1-й строчкой безо всяких фабрик.
      BPNet net = new BPNet( 4, 100, Type.Sigma );

      Загружаю данные.
      net.LoadData( «C:\Net\datain.csv»)

      Обучение
      net.train( 100, TypeTrain.BP );

      И что это доказывает? Да ничего…
      Еще раз повторю, на любом языке можно написать плохо и хорошо.
      • НЛО прилетело и опубликовало эту надпись здесь
  • +3
    У меня всегда с этим затык, может ТС объяснит как например файл разбирать нейронной сетью?
    Например я хочу создать датасет из разнообразных слов и словосочетаний и определять спам по ним.
    Пример простейшей байзановой сети я могу понять (матрица грубо говоря), а с нейронкой с ходу не выходит…
    Хотя уверен с ней результаты были бы лучше для антиспама.
    • 0
      Я очень сомневаюсь что такую задачу нейросетями решить можно. Требуется много ресурсов, не гарантируется нахождение минимума, возможны блуждания в седловых точках. Насколько мне известно, наивные байесовский классификаторы используются для этой цели и показывают хорошие результаты.
      • 0
        Проблема Байеса — фальш-позитивы.
        • 0
          Ну как сказать, вот для Вас F1 score > 0.98 это достаточно или нет? А требуемое количество ресурсов, на порядок, а то и два больше стоит повышения F1 до 0.999?
    • 0
      Единственная статья на хабре, кроме моей, в которой упоминается PyBrain — http://habrahabr.ru/post/136237/ посмотрите, возможно приведённый в ней код поможет Вам разобраться как по log-файлам сеть тренировать
  • +2
    Есть еще хорошая библиотек NeuroLab, API которого сильно напоминает MatLab Neural Network Toolbox.

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