- PVSM.RU - https://www.pvsm.ru -

Запускаем PyBrain на Python 3

Доброго времени суток, %username%!

Хочу поведать историю о скрещивании python3 с библиотечкой PyBrain [1], описанной недавно на хабре [2].
Подробности под катом.

Поскольку я только недавно стал изучать python3, а также интересуюсь нейронными сетями [3], то был весьма заинтригован возможностями библиотеки.
Полез грузить и ставить, но вот незадача! Pybrain не поддерживает python3, да и не обновлялся уже месяца четыре.
Загрустил, подумал, открыл книгу «Python: Полный справочник» Девида Бизли и погрузился в чтение.
Оказывается существует утилита 2to3 [4] в комплекте поставки python3.
Сделал на github форк [5] проекта pybrain и стал пытать ее.
Сначала с помощью 2to3 надругался над папкой pybrain, а затем и над папкой с примерами examples.
Как ни странно все прошло почти безболезненно, да и команда проста до безобразия (см. подраздел «Краткая справка по опциям 2to3» в конце статьи):

2to3 -Wn -o pybrain3/ pybrain/
2to3 -Wn -o examples3/ examples/

В данном случае я не захотел править код прямо на месте, а создал 2 дополнительные папки (examples3 и pybrain3), куда утилита сохраняла уже портированные исходные тексты.

Тестируем библиотеку на баги

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

Traceback (most recent call last):
  File "test1.py", line 2, in <module>
    from pybrain.tools.shortcuts import buildNetwork
  File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/__init__.py", line 1, in <module>
    from .structure.__init__ import *
  File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/__init__.py", line 1, in <module>
    from .connections.__init__ import *
  File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/connections/__init__.py", line 1, in <module>
    from .full import FullConnection
  File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/connections/full.py", line 5, in <module>
    from .connection import Connection
  File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/connections/connection.py", line 3, in <module>
    from pybrain.utilities import abstractMethod, Named
  File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/utilities.py", line 15, in <module>
    from string import split
ImportError: cannot import name split

Пришлось поработать напильником.
На ряде примеров столкнулся с неработоспособностью из-за отсутствия модулей matplotlib [6] и pylab.
Поискал, нашел в AUR'e (у меня стоит ArchLinux) пакет python-matplotlib-git, поставил. Благо его уже портировали на python3, но в список поддерживаемых пакетов он не входит. В других системах видимо придется ставить модуль вручную. Брать здесь [7].
С pylab я особо не разбирался. Он входит в состав scipy. Поставил community/python-scipy версии 0.10 — еще часть примеров заработала.
Приведу пару картинок из примеров, которые выводят сии красивые графики через matplotlib.
Дампы работы других примеров, которые дают вывод в консоль, приводить не буду — куча цифр и ничего особо интересного.
Image and video hosting by TinyPic [8]
Image and video hosting by TinyPic [9]

Заключение

Таким образом за буквально пару часов удалось с минимальными усилиями портировать библиотеку до достаточно рабочего состояния. Спасибо 2to3!
Вроде бы библиотека работоспособна, но:

  • не все примеры я смог прогнать на python3;
  • часть примеров работают с использованием рандома, поэтому их результаты невозможно сравнить с результатами на python2;
  • требуются еще тестирования разных частей и модулей pybrain.

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

Буду рад любым советам, пожеланиям и рекомендациям!
Если кто готов помочь — пишите, буду рад!

PS. Pull-request в основную ветвь pybrain на github пока не делал. Хочу еще покрутить её, поискать менее очевидные баги. А пока портированную библиотеку pybrain можно взять здесь [5].

Литература:

  1. «PyBrain работаем с нейронными сетями на Python» [2]
  2. PyBrain [1]
  3. Девид Бизли, «Python: Полный справочник», четвертое издание
Список работающих примеров

  • examples/optimization/*
  • examples/supervised/backprop/*
  • examples/supervised/evolino/*
  • examples/rl/environments/maze/*
  • examples/rl/environments/shipsteer/*
  • examples/rl/valuebased/*
  • examples/unsupervised/kohonen.py
  • examples/unsupervised/rbm.py

Список неработающих примеров

  • examples/rl/environments/capturegame/
  • examples/rl/environments/cartpole/play_cartpole.py
  • examples/rl/environments/flexcube/
  • examples/rl/environments/ode — лень было ставить ODE+pyode
  • examples/unsupervised/gp.py
  • examples/unsupervised/lsh.py — при его проверке схватил ошибку в библиотеке scipy в модуле weave. Пока не изучал. Может багрепорт напишу. Только его надо попристальней изучить.

Краткая справка по опциям 2to3

Usage: 2to3 [options] file|dir ...

Опции:
  -h, --help            показать это сообщение и выйти
  -d, --doctests_only   Исправить только doctests
  -f FIX, --fix=FIX     Каждый FIX определяет преобразование; по умолчанию: all
  -j PROCESSES, --processes=PROCESSES
                        Запустить 2to3 в PROCESSES потоков
  -x NOFIX, --nofix=NOFIX
                        Не проводить преобразование NOFIX
  -l, --list-fixes      Вывести доступные преобразования
  -p, --print-function  Modify the grammar so that print() is a function
  -v, --verbose         Подробный вывод
  --no-diffs            Не показывать отличия при рефакторинге
  -w, --write           Сохранять модифицированные файлы
  -n, --nobackups       Не делать бекапы измененных файлов
  -o OUTPUT_DIR, --output-dir=OUTPUT_DIR
                        Сохранять обработанные файлы в заданную директорию вместо
                        перезаписи оригинала. Требует наличие опции -n.
  -W, --write-unchanged-files
                        Также сохранять файлы. не подвергшиеся изменениям
                        (полезно с --output-dir); включает -w.
  --add-suffix=ADD_SUFFIX
                        Добавлять эту строку ко всем выходным файлам.
                        Требуется опция -n, если строка не пустая.
                        Например: --add-suffix='3' сгенерирует файлы .py3

Автор: icoz


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/12184

Ссылки в тексте:

[1] PyBrain: http://pybrain.org/

[2] хабре: http://habrahabr.ru/post/148407/

[3] нейронными сетями: http://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C

[4] 2to3: http://python3porting.com/2to3.html

[5] форк: https://github.com/icoz/pybrain

[6] matplotlib: http://matplotlib.sourceforge.net/

[7] здесь: http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.1/

[8] Image: http://tinypic.com?ref=mj0fgn

[9] Image: http://tinypic.com?ref=1iyeq0