2017-06-23 91 views
2

我想用神經網絡(Keras)逼近正弦函數。用神經網絡和ReLU(Keras)逼近正弦函數

是的,我看了相關的帖子:)

使用乙狀結腸和輸出四個隱藏的神經元線性激活層可以正常工作。

但也有一些設置提供了對我來說很陌生的結果。

由於我剛開始工作,我對什麼事情發生以及爲什麼會發生感興趣,但目前爲止我還無法弄清楚。

# -*- coding: utf-8 -*- 

import numpy as np 
np.random.seed(7) 

from keras.models import Sequential 
from keras.layers import Dense 
import pylab as pl 
from sklearn.preprocessing import MinMaxScaler 

X = np.linspace(0.0 , 2.0 * np.pi, 10000).reshape(-1, 1) 
Y = np.sin(X) 

x_scaler = MinMaxScaler() 
#y_scaler = MinMaxScaler(feature_range=(-1.0, 1.0)) 
y_scaler = MinMaxScaler() 

X = x_scaler.fit_transform(X) 
Y = y_scaler.fit_transform(Y) 

model = Sequential() 
model.add(Dense(4, input_dim=X.shape[1], kernel_initializer='uniform', activation='relu')) 
# model.add(Dense(4, input_dim=X.shape[1], kernel_initializer='uniform', activation='sigmoid')) 
# model.add(Dense(4, input_dim=X.shape[1], kernel_initializer='uniform', activation='tanh')) 
model.add(Dense(1, kernel_initializer='uniform', activation='linear')) 

model.compile(loss='mse', optimizer='adam', metrics=['mae']) 

model.fit(X, Y, epochs=500, batch_size=32, verbose=2) 

res = model.predict(X, batch_size=32) 

res_rscl = y_scaler.inverse_transform(res) 

Y_rscl = y_scaler.inverse_transform(Y) 

pl.subplot(211) 
pl.plot(res_rscl, label='ann') 
pl.plot(Y_rscl, label='train') 
pl.xlabel('#') 
pl.ylabel('value [arb.]') 
pl.legend() 
pl.subplot(212) 
pl.plot(Y_rscl - res_rscl, label='diff') 
pl.legend() 
pl.show() 

這是四個隱藏神經元(ReLU)和線性輸出激活的結果。 4 hidden neurons (ReLU), output activation: linear

爲什麼結果的形狀是ReLU?

這是否與輸出規範化有關?

回答

4

這裏包括兩個:

  1. 您的網絡是非常淺而小。當只有4個神經元與relu時,這種情況下,幾個這種神經元完全飽和的可能性很高。這可能就是你網絡結果如此的原因。嘗試he_normalhe_uniform作爲初始值設定項來克服這個問題。
  2. 在我看來,你的網絡對於這項任務來說太小了。通過將更多神經元和圖層投入到您的網絡中,我肯定會增加網絡的深度和寬度。在sigmoidsin功能類似的情況下,這可能會正常工作 - 但在relu的情況下,您確實需要更大的網絡。
+0

是的,只是給了上面的代碼40 ReLu HUs給出了一個更好的適合:http://imgur.com/a/yhTqw –