2016-01-16 23 views
0

遇到我創建這樣一個神經網絡: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 /站點包/ PyBrain-0.3.1-py3.5.egg/pybr AIN /監督/培訓/ backprop.py:99:RuntimeWarning:在方遇到溢出 誤差+ = 0.5 *總和(outerr ** 2)

(...)/ LIB/python3.5 /站點包/PyBrain-0.3.1-py3.5.egg/pybrain/structure/modules/sigmoidlayer.py:14:RuntimeWarning:在乘法 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> 
(...) 
+1

您正在學習費率太高。正常費率(基於問題)大約是0.01或0.001,例如如果你正在學習速度如此之高,特別是如果你正在訓練大量的時代,你的權重可能會變得太高,因此分化爲NaN值。 – daniel451

+0

@ascenator但是這個問題只發生在一開始(比方說20或30個時代) - 永遠不會遲到。 – Luke

+0

@ascenator你可能是對的。我做了一些測試,訓練率爲0.1,並沒有看到任何警告。 – Luke

回答

1

至於建議,來了一個答案:

具有0.8的學習率是無效的,因爲它可以像你的錯誤,並防止網絡的有效學習。

有了這麼高的學習率,根據你的成本函數,網絡可以很容易地改變你的權重,因此權重可能溢出到NaN值。

一般來說(即使你的權重不會溢出到NaN值),高學習率也不是學習的好主意。您通過從大型培訓數據集中學習,可以解決特定問題。如果您的學習速率非常高,例如0.8,則網絡很難適應當前時代的數據。 因爲網絡強烈地適應當前時代的錯誤率,所以以前的時代的大部分信息/學習功能將完全喪失。

對於大多數問題,典型的學習率是0.01或0.001或更少,因爲你想從一個單獨的時代得出一個小的結論,而是學習幾個時代的不變特徵。