为什么PyBrain不能学习二进制

2024-05-14 15:54:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试让一个网络(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倍左右(训练网络到数据集)。我应该使用不同于反向传播的培训师吗?如果是,为什么?在


Tags: fromimport网络targetnetdstestsdim
2条回答

您已经构建了一个包含4个输入节点、4个隐藏节点、1个输出节点和2个偏差的网络。在

enter image description here

考虑到每个字母都是该节点的激活,我们可以说每个隐藏节点计算其激活为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,你也会得到相当好的结果。在

根据我的经验,我不希望神经网络能轻易地猜出超出测试数据边界的数字。在

相关问题 更多 >

    热门问题