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

2024-10-01 22:30:33 发布

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

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

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()

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

^{pr2}$

有时我会收到以下警告:

(...)/lib/python3.5/site-packages/PyBrain-0.3.1-py3.5.egg/pybrain/supervised/trainers/backprop.py:99: RuntimeWarning: overflow encountered in square error += 0.5 * sum(outerr ** 2)

(...)/lib/python3.5/site-packages/PyBrain-0.3.1-py3.5.egg/pybrain/structure/modules/sigmoidlayer.py:14: RuntimeWarning: invalid value encountered in 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>
(...)

Tags: toinnanhiddenbiaspybrainhiddenlayerinlayer
2条回答

正如我们所建议的,答案如下:

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

在如此高的学习率下,基于你的成本函数,网络很容易改变你的权重,因此权重可能会溢出到NaN值。在

一般来说(即使权重没有溢出到NaN值中),对于学习来说,高学习率也不是一个好主意。你的网络通过学习大量的训练数据来解决具体问题。如果你的学习率很高,比如0.8,网络很难适应当前纪元的数据。 前一个历元的大部分信息/学习特征将完全丢失,因为网络对当前历元的错误率有很强的适应能力。在

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

没有必要用任意数字来猜测!在前馈网络中,除了学习速率为1/n(n是网络中神经元的数量)之外,你将浪费时间。如果你建立一个减少过度训练步骤的学习率,你将更容易解决微妙的关系,但每一个微妙程度(如果你愿意的话)所花费的时间会相当长,因为每个训练步骤只会影响整个网络状态中的一小部分。在

如果你的学习率超过1/n,整个网络中允许的变化自由度超过了每个节点的100%变化,这远比记忆更接近于遗忘。在

相关问题 更多 >

    热门问题