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

в 12:06, , рубрики: pybrain, python, python3, портирование, метки: , , ,

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

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

Поскольку я только недавно стал изучать python3, а также интересуюсь нейронными сетями, то был весьма заинтригован возможностями библиотеки.
Полез грузить и ставить, но вот незадача! Pybrain не поддерживает python3, да и не обновлялся уже месяца четыре.
Загрустил, подумал, открыл книгу «Python: Полный справочник» Девида Бизли и погрузился в чтение.
Оказывается существует утилита 2to3 в комплекте поставки python3.
Сделал на github форк проекта 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 и pylab.
Поискал, нашел в AUR'e (у меня стоит ArchLinux) пакет python-matplotlib-git, поставил. Благо его уже портировали на python3, но в список поддерживаемых пакетов он не входит. В других системах видимо придется ставить модуль вручную. Брать здесь.
С pylab я особо не разбирался. Он входит в состав scipy. Поставил community/python-scipy версии 0.10 — еще часть примеров заработала.
Приведу пару картинок из примеров, которые выводят сии красивые графики через matplotlib.
Дампы работы других примеров, которые дают вывод в консоль, приводить не буду — куча цифр и ничего особо интересного.
Image and video hosting by TinyPic
Image and video hosting by TinyPic

Заключение

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

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

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

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

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

Литература:

  1. «PyBrain работаем с нейронными сетями на Python»
  2. PyBrain
  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

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