我正在嘗試烤寬麪條和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()
現在我們創建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。這太可笑了!如果我們增加隱藏神經元的數量或訓練時期,則沒有任何變化。其他類型的非線性使情況變得更糟。理論上這應該更好,我錯過了什麼?
非常感謝。
SO上有很多相關的問題。你已經讀過它們了嗎? – Julien
神經網絡近似簡單的罪似乎不是一個好主意,因爲它是分析函數,爲此你可以建立泰勒或更快的收斂系列。神經網絡擅長近似未知形狀的數據,即使是迴歸逼近也不行。 – thodnev
@JulienBernu在數字識別等大規模問題中使用烤寬麪條存在很多問題。我已經成功地在類似的問題上實現了神經網絡,並取得了非常好的結果,但不知怎的,這似乎並不適用於這個簡單的問題,並且我的知識沒有解決這個問題的問題。 –