Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 19, 2011 16:51:19

comm
От:
Зарегистрирован: 2010-02-26
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Нейронные сети

Сегодня все чаще встречается применение 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()
Результат выполнения скрипта:


Помимо функции обучения, в процессе работы с сетью, можно менять:
- функцию ошибки
- функцию инициализации
- функции активации нейронов


Страница проекта: http://neurolab.googlecode.com
Страница pypi: http://pypi.python.org/pypi/neurolab
Документация: http://packages.python.org/neurolab/

Хотелось бы услышать: замечания, пожелания, здоровую критику, вопросы и т.п.



Офлайн

#2 Апрель 19, 2011 17:14:48

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Нейронные сети

comm
а чего для новичков? Есть же специальный раздел по проектам :)
http://python.su/forum/viewforum.php?id=30



Офлайн

#3 Апрель 19, 2011 20:11:03

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Нейронные сети

ух ты, круто. Как раз понадобилось. Буду смотреть.

Коль уж все равно отписался, посоветуйте литературы по этому поводу :)



Отредактировано (Апрель 19, 2011 20:22:03)

Офлайн

#4 Апрель 20, 2011 06:26:18

comm
От:
Зарегистрирован: 2010-02-26
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Нейронные сети

Enchantner
Да, возможно стоит перемести, просто здесь мне кажется как-то поживее))

Zubchick
Литературу в сети без проблем найдете, мне в свое время очень помог В. С. Медведев, В. Г. Потемкин Нейронные сети. MATLAB 6 - хорошее сочетание теории и практики, однако это MATLAB.



Офлайн

#5 Апрель 22, 2011 16:42:48

nook
От:
Зарегистрирован: 2011-04-22
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Нейронные сети

На сколько я понял, сейчас в библиотеке отсутствует поддержка рекурентных сетей(с обратными связями). Планируете ли вы их добавить?



Офлайн

#6 Апрель 23, 2011 17:58:43

comm
От:
Зарегистрирован: 2010-02-26
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Нейронные сети

Да, на банный момент библиотека не содержит рекурентных сетей. Однако, их можно создать пользуясь библиотекой как фреймворком. Ниже приводится пример функции создания сети Элмана:

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
connect - определяет связи между слоями. Ей же задается рекурентность: - означает, что на вход 0-го слоя подается сигнал с входа сети(-1) и выхода 0-го слоя.
Пример - сеть 2-2-3. Не смотря на то что на вход сети подается одно и тоже значение, на выходе сети сигналы меняются - следствие рекурентности.
>>> 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])
При этом, для обучения данной сети можно использовать те же алгоритмы обучения, так как они не учитывают рекурентные связи.
Так же можно создать и сеть Хопфилда, однако процедура обучения данных сетей иная и функцию обучения прейдется также писать самостоятельно.
Возможно в следующих версиях появятся и рекурентные сети будут “из коробки”.



Офлайн

#7 Июнь 6, 2011 21:51:47

kmike
От:
Зарегистрирован: 2009-12-07
Сообщения: 56
Репутация: +  4  -
Профиль   Отправить e-mail  

Нейронные сети

Круто, не знал, что эту штуку наши писали, как раз недавно смотрел, в целом понравилось. Сам остановился на pybrain, т.к. там очень подробная документация с примерами (и много всего есть, рекуррентные сети втч) - правда штука довольно не новая. В последнее время еще как-то принято считать, что метод опорных векторов лучше нейросетей работает (см. http://scikit-learn.sourceforge.net/, но нейросеть заработала, потивации переписывать не было поэтому).



Отредактировано (Июнь 6, 2011 21:52:45)

Офлайн

#8 Июнь 12, 2011 16:42:12

comm
От:
Зарегистрирован: 2010-02-26
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Нейронные сети

Выпустил версию 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)

Офлайн

#9 Июнь 14, 2011 12:31:43

kmike
От:
Зарегистрирован: 2009-12-07
Сообщения: 56
Репутация: +  4  -
Профиль   Отправить e-mail  

Нейронные сети

Сложностей не возникло) Поглядел туда, погладел сюда, все понравилось и там, и там, взял pybrain.



Офлайн

#10 Сен. 5, 2011 21:06:21

comm
От:
Зарегистрирован: 2010-02-26
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Нейронные сети

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version