这是 PyBrain 谷歌组的转贴:https ://groups.google.com/forum/#!topic/pybrain/J9qv0nHuxVY 。
我一直在修补 OpenNN 和 FANN,但还没有找到一个可以满足我需要的 ANN 库。
我将把它分为短期和中期目标,但首先要了解一点背景......
背景
我想使用 ANN 对随时间变化的 1000-2000 项向量进行时间序列预测。每个元素都是一个布尔值,表示计算机视觉系统在特定时刻存在的一组视觉属性。
这个想法是在时间 t-1 向网络提供向量,并将时间 t 的向量作为目标值。
然后,网络的输出将是基于向量的先前状态 (t-1) 在当前时间 (t) 中预期会发生什么的预测。
短期
我想训练一个人工神经网络,以便它可以学习随着时间的推移预测这些向量。也就是说,我想给它一个任意向量,它会返回它已经训练过的向量。现在可以使用有限数据集,我希望从正常的 epoch 学习开始。我从一个正常的监督数据集开始,其中输入和目标偏移一个时间单位。到目前为止,我在 MSE 回报方面的表现不如我在 FANN 中获得的结果(第一个时期后错误没有显着减少),如下所述:https ://groups.google.com/forum /#!topic/pybrain/QSfVHsFRXz0。
在 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."
关于如何最好地进行学习设置的任何建议?(我希望我需要递归,但想用普通的 MLP 将 PyBrain 与我之前的 FANN 结果进行比较。)
我实际上尝试使用recurrent=True 来构建这个网络,但是在我所有的测试中,python 最终都使用了所有可用的内存并崩溃了(这台机器上有8GB 内存)。我不确定如何在不大量增加内存占用的情况下启用递归。
中期
最终,系统将不得不在线运行,其中输入是动态输入并不断变化的。这意味着无法进行 epoch 训练,因此我需要能够运行学习算法的单次迭代。我意识到人工神经网络很难学习,但好消息是不会缺少数据点(至少 100,000 个)。因为没有固定的数据集,所以不需要收敛。我预计随着新模式或稳定模式的出现,错误会上升和下降。
感谢您的任何意见和建议。