我使用PyBrain创建了一个简单的神经网络:
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
L_Z = [
0b111111,
0b000010,
0b000100,
0b001000,
0b010000,
0b111111
]
C_Z = [
0b111111,
0b100001,
0b000110,
0b000001,
0b100001,
0b111111
]
net = buildNetwork(6, 3, 1)
ds = SupervisedDataSet(6, 1)
ds.addSample(tuple(L_Z), (1,))
ds.addSample(tuple(C_Z), (0,))
trainer = BackpropTrainer(net, ds)
trainer.trainUntilConvergence()
print net.activate(L_Z)
print net.activate(C_Z)
但是每次运行程序后都会显示不同的结果。我的网络应该学会找英文'Z'字母和西里尔字母'З'。怎么了?
答案 0 :(得分:2)
您的方法根本不正确。具有6个输入的网络意味着每个输入都是一个浮点数,可以从0到1. PyBrain不会告诉您何时给出的值太高或太低。例如,0b111111实际上是63.如果您想为每个检测单元输入一个输入,则需要使用具有36个输入的网络。
L_Z = [
1,1,1,1,1,1,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,1,1,1,1,1
]
C_Z = [
1,1,1,1,1,1,
1,0,0,0,0,1,
0,0,0,1,1,0,
0,0,0,0,0,1,
1,0,0,0,0,1,
1,1,1,1,1,1
]
net = buildNetwork(36, 3, 1)
ds = SupervisedDataSet(36, 1)
ds.addSample(L_Z, [1])
ds.addSample(C_Z, [0])
trainer = BackpropTrainer(net, ds)
for x in range(1000):
trainer.train()
print net.activate(L_Z)
print net.activate(C_Z)
我很惊讶.trainUntilConvergeance()正在运行,通常它会将1/4的数据放在一边进行验证,如果你只提供两个例子,它通常会崩溃。在任何情况下,此代码都适用于您想要的结果,但如果您尝试通常使用计算机视觉,他们会使用多种方法来检测事物。
答案 1 :(得分:0)
神经网络是随机初始化的向量,它们是收敛的。但是根据模型,每个单元格都与上层的每个其他单元格相关联,因此这意味着没有顺序。
=>值为a,b,c的神经网络等效于b,c,a或c,b,a(例如)(粗略地说)
这加上它们随机开始的事实为您提供了答案:许多模型可以解决您的问题,并且每次连续迭代都会向一个或另一个方向汇聚