Форум сайта python.su
Сегодня все чаще встречается применение python-a в качестве среды для научных вычислений.
В большой степени это связано с развитием библиотек numpy\scipy. Они, плюс дополнительные библиотеки, покрывают достаточно большой спектр научных методов, однако многие области все еще слабо развиты. Во многом, это справедливо и для искусственных нейронных сетей (ИНС).
В свое время встретившись с задачей требующей применения ИНС, я не нашел достойной замены Neural Network Toolbox из MATLAB в котором уже неплохо разбирался. Отдельные библиотеки позволили решить частную задачу, однако они не обеспечивали всей полноты и удобства работы с разными архитектурами ИНС как в NNT.
И когда ситуация повторилась, я решил попробовать свои силы в реализации ИНС на python-е, а сейчас хотел бы поделиться результатом:
NeuroLab (http://neurolab.googlecode.com)
Особенности:
- Чистый python + numpy
- Названия функций и методов соответствует Neural Network Toolbox (MATLAB)
- Возможность использовать алгоритмы обучения из scipy.optimize
- Многообразие поддерживаемых архитектур ИНС и алгоритмов обучения
- Гибкая настойка сети, изменение функций активации, оценки обучения, инициализации и т.д.
На данный момент поддерживаются следующие архитектуры:
- Однослойный перцептрон. Функция создания newp. Обучение train_delta
- Многослойный перцептрон Функция создания newff. Обучение train_gd, train_gdm, train_gda, train_gdx, train_rprop, train_bfgs, train_bfgs, train_cg
- Конкурирующий слой Кохонена. Функция создания newc. Обучение train_wta, train_cwta
- LVQ. Функция создания newlvq. Обучение train_lvq
Для примера решим задачу аппроксимации функции 0.5*sin(x):
import neurolab as nl
import numpy as np
import pylab as pl
# Создаем обучающую выборку
inp = np.linspace(-7, 7, 20).reshape(20, 1)
tar = np.sin(inp) * 0.5
# Создаем нейронную сеть с одним входом,
# 2я слоями - по 5 и 1 нейрону в каждом
net = nl.net.newff([[-10, 10]], [5, 1])
# Первый аргумент задает диапазоны входных сигналов
# В данном случае сеть имеет один входной сигнал в диапазоне от -10 до 10
# Сменим функцию обучения (по умолчанию nl.train.train_gdx):
net.trainf = nl.train.train_bfgs
# Данная функция обучения использует scipy.optimize.fmin_bfgs
# Поэтому для ее использования необходимо наличие пакета scipy
# Процесс обучения
error = net.train(inp, tar, epochs=500, show=100, goal=0.01)
# inp, tar - обучающие множества
# epochs - число циклов обучения
# goal - цель обучения, значение функционала ошибки при котором обучение будет завершено преждевременно
# show - период вывода информации о состоянии процесса (на данный момент вывод осуществляется в консоль)
# Plot result
pl.subplot(211)
pl.plot(error)
pl.xlabel('Epoch number')
pl.ylabel(u'Значение ошибки обучения')
# Испытание сети
inp_test = np.linspace(-8.0, 8.0, 150).reshape(150, 1)
out_test = net.sim(inp_test).flatten()
pl.subplot(212)
pl.plot(inp_test.flat, out_test.flat, '-', inp , tar, 'p')
pl.legend(['train target', 'net output'])
pl.show()
Офлайн
comm
а чего для новичков? Есть же специальный раздел по проектам :)
http://python.su/forum/viewforum.php?id=30
Офлайн
ух ты, круто. Как раз понадобилось. Буду смотреть.
Коль уж все равно отписался, посоветуйте литературы по этому поводу :)
Отредактировано (Апрель 19, 2011 20:22:03)
Офлайн
Enchantner
Да, возможно стоит перемести, просто здесь мне кажется как-то поживее))
Zubchick
Литературу в сети без проблем найдете, мне в свое время очень помог В. С. Медведев, В. Г. Потемкин Нейронные сети. MATLAB 6 - хорошее сочетание теории и практики, однако это MATLAB.
Офлайн
На сколько я понял, сейчас в библиотеке отсутствует поддержка рекурентных сетей(с обратными связями). Планируете ли вы их добавить?
Офлайн
Да, на банный момент библиотека не содержит рекурентных сетей. Однако, их можно создать пользуясь библиотекой как фреймворком. Ниже приводится пример функции создания сети Элмана:
from neurolab import core, layer, trans, train, error
def newelm(minmax, size):
net_ci = len(minmax)
net_co = size[1]
li = layer.Perceptron(net_ci + size[0], size[0], trans.TanSig())
lo = layer.Perceptron(size[0], net_co, trans.PureLin())
connect = [[-1, 0], [0], [1]]
net = core.Net(minmax, net_co, [li, lo], connect, train.train_gdx, error.MSE())
return net
>>> net = newelm([[-1, 1], [-1, 1]], [2, 3])
>>> net.step([-1, 1])
array([ -3.19243218, -20.80530307, 19.0479209 ])
>>> net.step([-1, 1])
array([ -6.90169645, -18.09887954, 21.88511552])
>>> net.step([-1, 1])
array([ -4.50367077, -19.73115306, 19.63888381])
>>> net.step([-1, 1])
array([ -6.06917297, -18.69493985, 21.20838924])
Офлайн
Круто, не знал, что эту штуку наши писали, как раз недавно смотрел, в целом понравилось. Сам остановился на pybrain, т.к. там очень подробная документация с примерами (и много всего есть, рекуррентные сети втч) - правда штука довольно не новая. В последнее время еще как-то принято считать, что метод опорных векторов лучше нейросетей работает (см. http://scikit-learn.sourceforge.net/, но нейросеть заработала, потивации переписывать не было поэтому).
Отредактировано (Июнь 6, 2011 21:52:45)
Офлайн
Выпустил версию 0.1.0.
Основные изменения коснулись механизмов обучения. А также значительно переработана документация. Добавлены новые примеры.
kmike
Если не сложно, поясните с чем возникли сложности?
Также обращаюсь к членам сообщества владеющим английским языком, с просьбой посетить сайт проекта и страницу документации для корректировки теста.
Проект http://neurolab.googlecode.com
Документация http://packages.python.org/neurolab
Примеры использования http://packages.python.org/neurolab/example.html
Отредактировано (Июнь 12, 2011 16:42:36)
Офлайн
Сложностей не возникло) Поглядел туда, погладел сюда, все понравилось и там, и там, взял pybrain.
Офлайн
1 сентября вышла версия 0.2.0
Основным изменением данной версии является поддержка (из коробки, косвенно работать с ними можно было и ранее - http://python.su/forum/viewtopic.php?pid=70948#p70948) рекуррентных сетей Элмана и Хопфилда.
Другим стимулом обновиться является исправление некоторых багов.
Пример использования сети Элмана: http://packages.python.org/neurolab/ex_newelm.html
Пример использования сети Хопфилда: http://packages.python.org/neurolab/ex_newhop.html
Офлайн