Доброго времени суток, %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.
Дампы работы других примеров, которые дают вывод в консоль, приводить не буду — куча цифр и ничего особо интересного.
Заключение
Таким образом за буквально пару часов удалось с минимальными усилиями портировать библиотеку до достаточно рабочего состояния. Спасибо 2to3!
Вроде бы библиотека работоспособна, но:
- не все примеры я смог прогнать на python3;
- часть примеров работают с использованием рандома, поэтому их результаты невозможно сравнить с результатами на python2;
- требуются еще тестирования разных частей и модулей pybrain.
В идеале надо бы написать набор тестов для полного покрытия библиотеки. Запустить тесты на python2 и на python3, а полученные результаты сравнить. Только тогда можно будет придти к выводу, что порт корректен.
Буду рад любым советам, пожеланиям и рекомендациям!
Если кто готов помочь — пишите, буду рад!
PS. Pull-request в основную ветвь pybrain на github пока не делал. Хочу еще покрутить её, поискать менее очевидные баги. А пока портированную библиотеку pybrain можно взять здесь.
Литература:
- «PyBrain работаем с нейронными сетями на Python»
- PyBrain
- Девид Бизли, «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