我想做一个小项目,并希望使用Python中的神经网络。我发现pybrain是最佳解决方案。但到目前为止,我找到的所有例子和问题都无法帮助我解决问题。
我有一组数字序列。数百行。有些值是缺失的,取而代之的是一个”x”。
例如
1425234838636**x**40543485435097**x**43953458345345430843967067045764607457607645067045**x**04376037654067458674506704567408576405
等等。这只是一个例子,不是我的序列。
我想逐个读取这些值并训练我的神经网络,当我发现一个’x’时,我会预测这个数字,然后继续用后续的数字进行训练。
到目前为止,我找到的训练方式是这样的
trainSet.addSample([0,0,0,0],[1])
带有一些输入和输出。
有什么建议我可以继续进行吗?
编辑:我想到了一个方法,并希望得到反馈,因为我不知道这样做是否正确。
我仍然有上面的字符串。我将其分割成列表,所以我有一个列表,每个实体都是一个数字。
for ind in range(len(myList)): if not myList[ind] == "x" and not myList[ind+1]=="x": ds.addSample(myList[ind],myList[ind+1]) else: breaknet = FeedForwardNetwork() inp = LinearLayer(1) h1 = SigmoidLayer(1) outp = LinearLayer(1)net.addOutputModule(outp) net.addInputModule(inp) net.addModule(h1)net.addConnection(FullConnection(inp, h1)) net.addConnection(FullConnection(h1, outp))net.sortModules()trainer = BackpropTrainer(net, ds)trainer.trainOnDataset(ds,1000)trainer.testOnData(verbose=True)lis[ind+1] = net.activate((ind,))GO to the beggining and continue from the last "x" which replaced from the net.activate()
你觉得怎么样?你认为这样做会有效吗?
回答:
一般来说,如果你使用反向传播来训练你的ANN,你实际上是在训练一个输入-输出映射。这意味着你的训练集必须包含已知的输入-输出关系(训练集中不包括任何未知值)。然后,ANN就成为你输入和输出之间实际关系的近似值。
然后你可以调用x = net.activate([seq])
,其中seq
是与未知值x
相关联的输入序列。
如果x
是一个已知结果的未知输入序列,那么你必须调用ANN的逆。我认为在pybrain中没有简单的方法来反转ANN,但你可以用你原始训练数据的逆来训练一个ANN。换句话说,使用你已知的结果作为训练输入,并将它们相关的序列作为训练结果。
需要考虑的主要事情是工具和训练数据对于你试图做的事情的适用性。如果你只是想预测x
作为前一个数字的函数,那么我认为你的训练是正确的。我猜x
将是前n
个数字的函数,在这种情况下,你需要更新你的数据集如下:
n = 10for ind in range(len(myList)): # Don't overrun our bounds if ind == len(myList)-1: break # Check that our sequence is valid for i in range(ind-n, ind+1): if i >= 0 and myList[i] == "x": # we have an invalid sequence ind += i # start next seq after invalid entry break # Add valid training sequence to data set ds.addSample(myList[ind-n:ind],myList[ind+1])