Пользователь
0,1
рейтинг
27 июля 2012 в 16:06

Разработка → Запускаем PyBrain на Python 3 из песочницы

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

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

Поскольку я только недавно стал изучать python, а также интересуюсь нейронными сетями, то был весьма заинтригован возможностями библиотеки.
Полез грузить и ставить, но вот незадача! 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
карма
44,0
рейтинг 0,1
Реклама помогает поддерживать и развивать наши сервисы

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

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

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

  • +2
    Приятно видеть, что моя статья подстегнула интерес творческого люда к этой библиотеке. Сам использую 2.7, но от третьей версии никуда не деться рано или поздно.
    Было-бы интересно узнать, что скажут авторы PyBrain когда узнают о проделанной Вами работе.
    Успехов!
  • 0
    Работа будет проделана, когда напишу хотя бы с десяток тестов для проверки корректности работы ключевых функций. И они все будут успешно отрабатывать.
    А разработчикам надо отдать должное. Их код хорош. Мне много приходилось копаться в чужом коде, но в их коде — это делать приятно.
  • 0
    А подскажите, почему две версии питона в ходу? Я так понимаю большинство книг и либ только со 2й версией работают — может зря я 3ку поставил?
    • 0
      Не зря. Искусственные языки как и естесственные тоже «живут» и меняются со временем.
      Данная ситуация с одновременным существованием двух питонов очень напоминает мне Фортран и Си.
      Си только появился, он более логичный, структурированный, адаптированный под требования своего времени. Фортран же проверен временем, надежен, на рынке куча владеющих им специалистов, а самое главное — ОГРОМНОЕ количество качественных, хорошо отлаженных библиотек.
      Фортраном, кстати, до сих пор пользуются в ученых кругах (я на нем в институте лабораторки писал).
      Поэтому я и стал изучать питон3. Он более переспективный.
      Да и разработчики поддерживают 2 ветки, чтобы не было резкого скачка (как у KDE4 из-за чего он сильно уступил тому же GNOME, пользователи отвернулись от него из-за сырости и нестабильности). Таким образом бизнес пользуется стабильным и надежным питоном2, в то время как сообщество допиливает питон3.
  • +1
    Сейчас очень много завязано на питон 2.х, переход на 3.х сопряжён с рядом трудностей, связанных с ограничениями питона 3 и отсутствием обратной совместимости там, где её и не должно быть. Однако при портировании как правило вылезают косяки: строки и массивы байт в питоне 2.х — одно и то же, это отследить сложно но можно, однако во всех сетевых библиотеках приходится проходиться по всем send/receive и менять data на data.encode() и data.decode(). Ну и всякие неприятные мелочи, которые 2to3 сама понять не в состоянии. Автор PyBrain будет очень доволен, во всяком случае, я надеюсь, проявит больше энтузиазма, нежели авторы Selenium, чью библиотеку я когда-то портировал.

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