Найти - Пользователи
Полная версия: Нейронные сети
Начало » Python проекты » Нейронные сети
1 2 3
comm
Сегодня все чаще встречается применение 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/

Хотелось бы услышать: замечания, пожелания, здоровую критику, вопросы и т.п.
Enchantner
comm
а чего для новичков? Есть же специальный раздел по проектам :)
http://python.su/forum/viewforum.php?id=30
Zubchick
ух ты, круто. Как раз понадобилось. Буду смотреть.

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

Zubchick
Литературу в сети без проблем найдете, мне в свое время очень помог В. С. Медведев, В. Г. Потемкин Нейронные сети. MATLAB 6 - хорошее сочетание теории и практики, однако это MATLAB.
nook
На сколько я понял, сейчас в библиотеке отсутствует поддержка рекурентных сетей(с обратными связями). Планируете ли вы их добавить?
comm
Да, на банный момент библиотека не содержит рекурентных сетей. Однако, их можно создать пользуясь библиотекой как фреймворком. Ниже приводится пример функции создания сети Элмана:

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])
При этом, для обучения данной сети можно использовать те же алгоритмы обучения, так как они не учитывают рекурентные связи.
Так же можно создать и сеть Хопфилда, однако процедура обучения данных сетей иная и функцию обучения прейдется также писать самостоятельно.
Возможно в следующих версиях появятся и рекурентные сети будут “из коробки”.
kmike
Круто, не знал, что эту штуку наши писали, как раз недавно смотрел, в целом понравилось. Сам остановился на pybrain, т.к. там очень подробная документация с примерами (и много всего есть, рекуррентные сети втч) - правда штука довольно не новая. В последнее время еще как-то принято считать, что метод опорных векторов лучше нейросетей работает (см. http://scikit-learn.sourceforge.net/, но нейросеть заработала, потивации переписывать не было поэтому).
comm
Выпустил версию 0.1.0.
Основные изменения коснулись механизмов обучения. А также значительно переработана документация. Добавлены новые примеры.
kmike
Если не сложно, поясните с чем возникли сложности?

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

Проект http://neurolab.googlecode.com
Документация http://packages.python.org/neurolab
Примеры использования http://packages.python.org/neurolab/example.html
kmike
Сложностей не возникло) Поглядел туда, погладел сюда, все понравилось и там, и там, взял pybrain.
comm
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB