Python 学习正弦函数似乎需要ANN(Keras)中过多的参数

Python 学习正弦函数似乎需要ANN(Keras)中过多的参数,python,keras,deep-learning,Python,Keras,Deep Learning,我一直在尝试对不同的函数逼近方法做一些研究,我尝试的第一个方法是使用ANN(人工神经网络)。守则如下: import tensorflow as tf import matplotlib.pyplot as plt %matplotlib inline import numpy as np from tensorflow.keras.layers import Input, Dense, Flatten, Dropout from tensorflow.keras.optimizers impo

我一直在尝试对不同的函数逼近方法做一些研究,我尝试的第一个方法是使用ANN(人工神经网络)。守则如下:

import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from tensorflow.keras.layers import Input, Dense, Flatten, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Model
from sklearn.preprocessing import MinMaxScaler

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

x_scaler = MinMaxScaler()
y_scaler = MinMaxScaler()

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

plt.plot(X, Y)
plt.show()


inp = Input(shape=(20000, 1))

x = Dense(32, activation='relu')(inp)
x = Dense(64, activation='relu')(x)
x = Dense(128, activation='relu')(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(1, activation='linear')(x)

model = Model(inp, predictions)

model.compile(loss='mse', optimizer='adam')
model.summary()

X = X.reshape((-1, 20000, 1))
Y = Y.reshape((-1, 20000, 1))

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

X_test = np.linspace(0.0 , 2.0 * np.pi, 20000).reshape(-1, 1)
X_test.shape
X_test = x_scaler.transform(X_test)
X_test = X_test.reshape((-1, 20000, 1))
res = model.predict(X_test, batch_size=32)

res = res.reshape((20000, 1))
res_rscl = y_scaler.inverse_transform(res)

Y_rscl = y_scaler.inverse_transform(Y.reshape(20000, 1))

plt.subplot(211)
plt.plot(res_rscl, label='ann')
plt.plot(Y_rscl, label='train')
plt.xlabel('#')
plt.ylabel('value [arb.]')
plt.legend()
plt.subplot(212)
plt.plot(Y_rscl - res_rscl, label='diff')
plt.legend()
plt.show()
情节如下:

import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from tensorflow.keras.layers import Input, Dense, Flatten, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Model
from sklearn.preprocessing import MinMaxScaler

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

x_scaler = MinMaxScaler()
y_scaler = MinMaxScaler()

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

plt.plot(X, Y)
plt.show()


inp = Input(shape=(20000, 1))

x = Dense(32, activation='relu')(inp)
x = Dense(64, activation='relu')(x)
x = Dense(128, activation='relu')(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(1, activation='linear')(x)

model = Model(inp, predictions)

model.compile(loss='mse', optimizer='adam')
model.summary()

X = X.reshape((-1, 20000, 1))
Y = Y.reshape((-1, 20000, 1))

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

X_test = np.linspace(0.0 , 2.0 * np.pi, 20000).reshape(-1, 1)
X_test.shape
X_test = x_scaler.transform(X_test)
X_test = X_test.reshape((-1, 20000, 1))
res = model.predict(X_test, batch_size=32)

res = res.reshape((20000, 1))
res_rscl = y_scaler.inverse_transform(res)

Y_rscl = y_scaler.inverse_transform(Y.reshape(20000, 1))

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

正如我们可以看到的,它确实非常接近正弦曲线与这种架构。然而,我并不确定我做的是对的。我觉得很奇怪,我需要
43777
参数来拟合正弦曲线。也许我错了。然而,看着(我一点也不知道R,但我猜ANN比我拥有的要小得多)让我更加好奇

我的问题——我的方法正确吗?我是否应该更改某些内容以减少参数的数量?或者,正弦函数是一个困难的函数,而对于人工神经网络来说,它需要大量的参数来逼近它,这是正常的吗

这可能是一个开放性的问题,但我真的很感激你能为我指出任何方向,以及我犯的任何错误,你能给我看

注-表明数据的循环性质对于ANN来说是困难的。我还想知道这是否真的是这样,这是否是ANN需要这么多参数的原因