我正在尝试让一个网络(PyBrain)来学习二进制。这是我的代码,它将返回值保持在8左右,但当我用这个目标激活时,它应该是返回9。在
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import *
from pybrain.datasets import *
from pybrain.supervised.trainers import BackpropTrainer
from matplotlib.pyplot import *
trains = 3000
hiddenLayers = 4
dim = 4
target = (1, 0, 0, 1)
ds = SupervisedDataSet(dim, 1)
ds.addSample((0, 0, 0, 0), (0,))
ds.addSample((0, 0, 0, 1), (1,))
ds.addSample((0, 0, 1, 0), (2,))
ds.addSample((0, 0, 1, 1), (3,))
ds.addSample((0, 1, 0, 0), (4,))
ds.addSample((0, 1, 0, 1), (5,))
ds.addSample((0, 1, 1, 0), (6,))
ds.addSample((0, 1, 1, 1), (7,))
ds.addSample((1, 0, 0, 0), (8,))
net = buildNetwork(dim, hiddenLayers, 1, bias=True, hiddenclass=SigmoidLayer)
trainer = BackpropTrainer(net, ds)
tests = []
for i in range(trains):
trainer.train()
tests.append(net.activate(target))
plot(range(len(tests)), tests)
print net.activate(target)
show()
我试过调整隐藏层的数量,hiddenclass从TanhLayer调整到SigmoidLayer,并改变了列车的数量,但它总是收敛500倍左右(训练网络到数据集)。我应该使用不同于反向传播的培训师吗?如果是,为什么?在
您已经构建了一个包含4个输入节点、4个隐藏节点、1个输出节点和2个偏差的网络。在
考虑到每个字母都是该节点的激活,我们可以说每个隐藏节点计算其激活为sigmoid(w0*1+w1*A+w2*B+w3*C+w4*D),输出节点计算其激活为(w0*1+w1*E+w2*F+w3*G+w4*H(无sigmoid)。图中的行数是模型中在学习过程中调整的权重参数的数量。在
有这么多的参数,但只有9个样本可以训练,有许多局部最优,不太正确的解决方案,网络可以收敛。在
解决这个问题的一种方法是增加训练样本的数量。您可以概括过去的1和0,并提供一些示例,例如((0,0,1.0,0.5),(2.5,))和((0,1.2,0.0,1.0),(5.8,))。在
另一个选择是简化模型。一个完美的解决方案只需要4个输入直接连接到输出,没有偏差或乙状结肠。该模型只有4个权重,训练设置为1、2、4和8。最后的计算结果是1*A+2*B+4*C+8*D
我建议你把目标放在中间而不是边缘。在
我试着用10和11把训练数据向上扩展,结果在预测9时产生了更好的结果,即使在训练数据中遗漏了9。而且,如果你试图预测4,即使你在训练数据中没有4,你也会得到相当好的结果。在
根据我的经验,我不希望神经网络能轻易地猜出超出测试数据边界的数字。在
相关问题 更多 >
编程相关推荐