Форум сайта python.su
1
Сегодня все чаще встречается применение 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()
Офлайн
0
comm
а чего для новичков? Есть же специальный раздел по проектам :)
http://python.su/forum/viewforum.php?id=30
Офлайн
0
ух ты, круто. Как раз понадобилось. Буду смотреть.
Коль уж все равно отписался, посоветуйте литературы по этому поводу :)
Отредактировано (Апрель 19, 2011 20:22:03)
Офлайн
1
Enchantner
Да, возможно стоит перемести, просто здесь мне кажется как-то поживее))
Zubchick
Литературу в сети без проблем найдете, мне в свое время очень помог В. С. Медведев, В. Г. Потемкин Нейронные сети. MATLAB 6 - хорошее сочетание теории и практики, однако это MATLAB.
Офлайн
0
На сколько я понял, сейчас в библиотеке отсутствует поддержка рекурентных сетей(с обратными связями). Планируете ли вы их добавить?
Офлайн
1
Да, на банный момент библиотека не содержит рекурентных сетей. Однако, их можно создать пользуясь библиотекой как фреймворком. Ниже приводится пример функции создания сети Элмана:
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])
Офлайн
4
Круто, не знал, что эту штуку наши писали, как раз недавно смотрел, в целом понравилось. Сам остановился на pybrain, т.к. там очень подробная документация с примерами (и много всего есть, рекуррентные сети втч) - правда штука довольно не новая. В последнее время еще как-то принято считать, что метод опорных векторов лучше нейросетей работает (см. http://scikit-learn.sourceforge.net/, но нейросеть заработала, потивации переписывать не было поэтому).
Отредактировано (Июнь 6, 2011 21:52:45)
Офлайн
1
Выпустил версию 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)
Офлайн
4
Сложностей не возникло) Поглядел туда, погладел сюда, все понравилось и там, и там, взял pybrain.
Офлайн
1
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
Офлайн