为什么PyBrain无法学习二进制

我试图让一个网络(PyBrain)学习二进制。这是我的代码,它总是返回大约8的值,但当我用这个目标激活时,它应该返回9。

from pybrain.tools.shortcuts import buildNetworkfrom pybrain.structure import *from pybrain.datasets import *from pybrain.supervised.trainers import BackpropTrainerfrom matplotlib.pyplot import *trains = 3000hiddenLayers = 4dim = 4target = (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次训练后(对数据集进行网络训练)收敛。我应该使用不同于反向传播的训练器吗?如果是,为什么?


回答:

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注