[英]Approximating sine function with Neural Network and ReLU
我正在尝试使用神经网络(Keras)来近似正弦函数。
是的,我阅读了相关帖子:)
使用四个带有 sigmoid 的隐藏神经元和一个带有线性激活的输出层工作正常。
但也有一些设置提供的结果对我来说似乎很奇怪。
由于我刚刚开始工作,我对事情发生的原因和原因很感兴趣,但到目前为止我无法弄清楚。
# -*- 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 的形状?
这与输出归一化有关吗?
这里有两件事:
relu
的神经元很可能会导致其中几个神经元完全饱和。 这可能就是您的网络结果看起来像这样的原因。 尝试将he_normal
或he_uniform
作为初始化程序来克服这个问题。sigmoid
形状与sin
函数相似,这可能会正常工作 - 但在relu
情况下,您确实需要更大的网络。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.