用神经网络和ReLU(Keras)逼近正弦函数

Joe*_*Joe 4 python regression machine-learning neural-network keras

我试图用神经网络(Keras)近似正弦函数.

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

使用具有S形的四个隐藏神经元和具有线性激活的输出层工作正常.

但也有一些设置可以提供对我来说很奇怪的结果.

由于我刚刚开始工作,我对事情发生的原因和原因感兴趣,但到目前为止我无法理解这一点.

# -*- 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()
Run Code Online (Sandbox Code Playgroud)

这是四个隐藏神经元(ReLU)和线性输出激活的结果. 4个隐藏神经元(ReLU),输出激活:线性

为什么结果采用ReLU的形状?

这与输出规范化有关吗?

Mar*_*jko 5

这里有两件事:

  1. 你的网络非常浅薄.只有4个神经元才能relu成为这种神经元完全饱和的可能性.这可能是您的网络结果看起来像这样的原因.尝试he_normalhe_uniform作为初始化程序来克服这一点.
  2. 在我看来,您的网络对于此任务来说太小了.我肯定会通过向网络中添加更多神经元和图层来增加网络的深度和宽度.如果sigmoidsin功能与功能类似,这可能会很好 - 但是如果relu您确实需要更大的网络.