为什么PyBrain不能学习二进制

Why can't PyBrain Learn Binary

我正在尝试建立一个网络 (PyBrain) 来学习二进制文件。这是我的代码,它使 return 值保持在 8 左右,但是当我使用此目标激活时它应该是 return 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()

我尝试调整隐藏层的数量,将隐藏类从 TanhLayer 调整为 SigmoidLayer 并改变列车数量,但它总是收敛大约 500 次(将网络训练到数据集)。我应该使用不同于反向传播的训练器吗?如果是,为什么?

我建议你把目标放在中间而不是边缘。

我尝试用 10 和 11 向上扩展训练数据,然后它在预测 9 时产生了更好的结果,即使训练数据中遗漏了 9。如果您尝试预测 4,即使训练数据中没有 4,您也会得到很好的结果。

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

您已经构建了一个包含 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 个输入直接连接到输出,没有偏差或 sigmoid。该模型只有 4 个权重,训练将设置为 1、2、4 和 8。最终计算将是 1*A + 2*B + 4*C + 8*D。