2016-08-18 66 views
1

我正在嘗試烤寬麪條和nolearn NeuralNet函數來近似一個簡單的sin函數。畢竟,神經網絡被證明是通用的逼近器,所以我想通過一個簡單的非線性函數嘗試千層麪來實驗性地顯示這個事實。這是代碼:逼近一個簡單的sin()函數與烤寬麪條

import lasagne 
import numpy as np 
from lasagne import layers 
from lasagne.updates import nesterov_momentum 
from nolearn.lasagne import NeuralNet 
import matplotlib.pylab as pylab 

x=np.linspace(0,1,1000) 
y=np.sin(8*x) 

# Fit the dimensions and scale 
x=x.reshape(1000,1).astype(np.float32) 
y=y.astype(np.float32) 
y=(y-np.min(y))/np.max(y) 

我們得到以下功能:

pylab.plot(x,y) 
pylab.show() 

Scaled sin function

現在我們創建100個隱藏單元一個簡單的神經網絡來近似功能:

net= NeuralNet(
layers=[ 
    ('input', layers.InputLayer), 
    ('hidden', layers.DenseLayer), 
    ('output', layers.DenseLayer), 
], 

input_shape=(None,1), 

hidden_num_units=100, 
hidden_nonlinearity=lasagne.nonlinearities.rectify, 
hidden_W=lasagne.init.GlorotUniform(), 

output_num_units=1, 
output_nonlinearity=None, 
output_W=lasagne.init.GlorotUniform(), 

update=nesterov_momentum, 
update_learning_rate=0.001, 
update_momentum=0.9, 

regression=True, 
max_epochs=500, 
verbose=0, 
) 

net=net.fit(x,y) 

現在我們預測x與訓練n值看看我們得到:

yp=net.predict(x) 
pylab.plot(x,yp,hold=1) 
pylab.plot(x,y) 
pylab.show() 

這就是我們得到的! Approximated function。這太可笑了!如果我們增加隱藏神經元的數量或訓練時期,則沒有任何變化。其他類型的非線性使情況變得更糟。理論上這應該更好,我錯過了什麼?

非常感謝。

+0

SO上有很多相關的問題。你已經讀過它們了嗎? – Julien

+0

神經網絡近似簡單的罪似乎不是一個好主意,因爲它是分析函數,爲此你可以建立泰勒或更快的收斂系列。神經網絡擅長近似未知形狀的數據,即使是迴歸逼近也不行。 – thodnev

+0

@JulienBernu在數字識別等大規模問題中使用烤寬麪條存在很多問題。我已經成功地在類似的問題上實現了神經網絡,並取得了非常好的結果,但不知怎的,這似乎並不適用於這個簡單的問題,並且我的知識沒有解決這個問題的問題。 –

回答

2

我終於知道發生了什麼事。如果有人遇到同樣的問題,我會發布我的猜測。

衆所周知,來自nolearn環境的NeuralNet使用批量訓練。我不完全知道它是如何選擇批次的,但在我看來,它依次選擇它們。那麼,如果數據沒有被隨機化,那麼一個批次將不會在統計上代表整個數據(數據不是固定的)。在我的情況下,我做了x=np.linspace(0,1,1000),因此每個批次的統計屬性會有所不同,因爲有一個自然順序。

如果您改爲隨機創建數據,即x=np.random.uniform(size=[1000,1]),則每個批處理將具有統計代表性,而與其取自何處無關。一旦你這樣做了,你可以增加訓練的時代,並提高收斂到真正的最佳狀態。我不知道我的猜測是否正確,但至少對我有用。不過,我會深入挖掘它。

+0

默認的'BatchIterator '有一種方法可以在每個時期自動洗牌數據集。當你從nolearn.lasagne import BatchIterator實例化'NeuralNet'時傳遞類似這樣的內容: NeuralNet(batch_iterator_train = BatchIterator(batch_size = 128,shuffle = True))' –