Как сделать многомерный прогноз временных рядов в PyBrain?
Это репост из группы Google PyBrain: https://groups.google.com/forum/.
Я возился с OpenNN и FANN и еще не нашел библиотеку ANN, которая делает то, что мне нужно.
Я разделю это на краткосрочные и среднесрочные цели, но сначала немного предыстории...
Фон
Я хочу использовать ANN для прогнозирования временных рядов вектора элемента 1000-2000, изменяющегося во времени. Каждый элемент представляет собой логическое значение, которое представляет наличие кластера визуальных свойств в системе компьютерного зрения в определенный момент времени.
Идея состоит в том, чтобы передать сети вектор в момент времени t-1 с вектором в момент времени t в качестве целевого значения.
Выходной сигнал сети будет затем предсказывать, что ожидается в текущее время (t) на основе предыдущего состояния (t-1) вектора.
Короткий срок
Я хотел бы обучить ANN, чтобы он мог учиться предсказывать эти векторы с течением времени. То есть я хотел бы передать ему произвольный вектор, и он вернет вектор, которому он был обучен, чтобы ожидать следующего. Сейчас хорошо использовать конечный набор данных, и я ожидаю начать с обычного обучения эпохи. Я начинаю с обычного набора данных под наблюдением, где ввод и цели смещены на одну единицу времени. До сих пор я не показывал результаты так же хорошо, как я мог получить в FANN с точки зрения возвратов MSE (без существенного уменьшения ошибок после первой эпохи), как описано здесь: https://groups.google.com/forum/.
В FANN я просто использовал простой MLP с 1026 входами, 103 скрытыми и 1026 выходами. Входные логические значения были масштабированы от -1 до 1, а веса были инициализированы случайными значениями между -1 и 1. (Это было сделано, потому что, очевидно, обучение быстрее с отрицательными значениями, чем просто 0-1). Сеть довольно хорошо воспроизводила входные паттерны и в итоге получила небольшую MSE.
В PyBrain это текущая версия кода:
#!/usr/bin/python
# First try and using pyBrain for building an ANN. We'll start with an MLP for obvious reasons.
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.validation import ModuleValidator
import pickle, time
# Load the dataset (parse data)
print "Loading and parsing dataset..."
inputFile = open("../MLP/data/113584_backgroundState-filter-1.fann", 'r')
rawData = inputFile.readlines()
inputFile.close()
processedData = list()
for inputLine in rawData[1:]: # all but last element.
data = inputLine.split() # Slicing to strip off the final newline
scaleData = list()
for item in data:
scaleData.append(int(item))
processedData.append(scaleData)
# Create dataset from parsed data
inputData = SupervisedDataSet(1027, 1027)
for index in xrange(0,len(processedData)-1,2): # every second line.
inputData.addSample(processedData[index], processedData[index+1])
del processedData # no longer needed
# Build the same network as in FANN
net = buildNetwork(1027, 103, 1027, bias=True)
# Train the network
print "Training network..."
trainer = BackpropTrainer(net, inputData, verbose = True)
for i in xrange(5):
startTime = time.time()
error = trainer.train()
print "ERROR " + str(i) + " " + str(error) # test network (calculate error)
print "ProcessingTime " + str(i) + " " + str(time.time() - startTime)
# save results.
print "Saving network..."
fileObject = open('network.pybrain', 'w')
pickle.dump(net, fileObject)
# For each input pattern, what is the output?
# Compatible with FANN output
print "Testing network and generating results..."
i = 0;
for inputPattern in inputData['input']:
outputPattern = net.activate(inputPattern)
for j in xrange(len(inputPattern)):
print "RESULT " + str(i) + " " + str(j) + " " + str(inputPattern[j]) + " " + str(outputPattern[j])
i += 1
print "Done."
Любые рекомендации о том, как лучше всего настроить это для обучения? (Я ожидаю, что мне понадобится рекуррентность, но я хотел сравнить PyBrain с моими предыдущими результатами FANN с простым MLP.)
Я действительно пытался построить эту сеть с помощью recurrent=True, но во всех моих тестах python заканчивал тем, что использовал всю доступную оперативную память, и приводил к сбою (на этой машине было 8 ГБ ОЗУ). Я не уверен, как я могу включить рекуррентность без огромного увеличения объема памяти.
Средняя степень
В конце концов, система должна будет работать в режиме онлайн, где входы поступают на лету и постоянно меняются. Это означает, что обучение в эпоху будет невозможно, поэтому мне нужно выполнить одну итерацию алгоритма обучения. Я понимаю, что ANN будет трудно учиться, но хорошая новость заключается в том, что не будет недостатка в точках данных (по крайней мере, 100 000). Поскольку нет фиксированного набора данных, нет необходимости в конвергенции. Я ожидаю, что ошибка будет расти и падать по мере появления новых или стабильных паттернов.
Спасибо за любые комментарии и предложения.