PyBrain:在square中遇到溢出,在multiply中遇到无效值

时间:2016-01-16 14:53:39

标签: python pybrain

我创建了一个这样的神经网络:

n = FeedForwardNetwork()

inLayer = LinearLayer(43)
bias = BiasUnit()
hiddenLayer = SigmoidLayer(100)
outLayer = LinearLayer(1)

n.addInputModule(inLayer)
n.addModule(bias)
n.addModule(hiddenLayer)
n.addOutputModule(outLayer)

in_to_hidden = FullConnection(inLayer, hiddenLayer)
bias_to_hidden = FullConnection(bias, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)

n.addConnection(in_to_hidden)
n.addConnection(bias_to_hidden)
n.addConnection(hidden_to_out)

n.sortModules()

我按照以下方式训练它(我正在简化,它正在多次迭代中训练):

self.trainer = BackpropTrainer(self.neural_net, learningrate=0.8)
(...)
ds = SupervisedDataSet(self.net_input_size, 1)
ds.addSample([...], np.float64(learned_value))
(...)
self.trainer.trainOnDataset(ds)

有时我会收到以下警告:

  

(...)/ lib / python3.5 / site-packages / PyBrain-0.3.1-py3.5.egg / pybrain / supervised / trainers / backprop.py:99:StarttimeWarning:在广场遇到溢出     误差+ = 0.5 *总和(外部** 2)

     

(...)/ lib / python3.5 / site-packages / PyBrain-0.3.1-py3.5.egg / pybrain / structure / modules / sigmoidlayer.py:14:RuntimeWarning:在multiply中遇到无效值     inerr [:] = outbuf *(1 - outbuf)* outerr

然后当我检查保存的网络文件时,我发现所有权重都是nan

(...)
<FullConnection class="pybrain.structure.connections.full.FullConnection" name="FullConnection-8">
    <inmod val="BiasUnit-5"/>
    <outmod val="SigmoidLayer-11"/>
    <Parameters>[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]</Parameters>
</FullConnection>
(...)

2 个答案:

答案 0 :(得分:1)

正如所建议的,这里有一个答案:

学习率为0.8是无效的,因为它可能导致像你这样的错误,并妨碍有效学习网络。

如此高的学习率,基于您的成本函数,网络可以轻松地将权重更改为非常大的数量,因此权重可能会溢出到NaN值。

一般来说(即使你的体重没有溢出到NaN值),学习率也很高,学习率也不高。您是通过从大型训练数据集中学习来解决特定问题的网络。如果你的学习率非常高,比如0.8,那么网络很难将非常强调为当前时代的数据。 以前的纪元的大部分信息/学习功能都将完全丢失,因为网络会自动调整当前纪元的错误率。

对于大多数问题,典型的学习率是0.01或0.001甚至更低,因为你想从一个单一时期得出小结论,而不是学习几个时代的不变特征。

答案 1 :(得分:0)

无需猜测任意数字!在前馈网络中,您浪费的时间超过了1 / n的学习率,其中n是网络中神经元的数量。如果您建立的学习率降低了培训步骤的数量,您将更容易解决细微的关系,但是每度(如果您愿意)的微妙关系将花费相当长的时间,因为网络状态整体的一部分会逐渐减少将在每个训练步骤中受到影响。

如果您的学习率超过1 / n,则整个网络中每个节点的更改自由度将超出每个节点100%的变化,这与更为相似忘记比记住。