В большой степени это связано с развитием библиотек 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/
Хотелось бы услышать: замечания, пожелания, здоровую критику, вопросы и т.п.