Neural network Keras神经网络函数逼近

Neural network Keras神经网络函数逼近,neural-network,keras,Neural Network,Keras,我试图近似计算以下函数: 但我最好的结果是: (右侧的损失函数) 我甚至尝试过5万个时代,结果也差不多 型号: model = Sequential() model.add(Dense(40, input_dim=1,kernel_initializer='he_normal', activation='relu')) model.add(Dense(20, activation='relu')) model.add(Dense(10, activation='relu')) model.a

我试图近似计算以下函数:

但我最好的结果是:

(右侧的损失函数) 我甚至尝试过5万个时代,结果也差不多

型号:

model = Sequential()
model.add(Dense(40, input_dim=1,kernel_initializer='he_normal', activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1,input_dim=1, activation=activation_fun))
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape', 'cosine'])
history = model.fit(x, y, batch_size=32, epochs=5000, verbose=0)

preds = model.predict(x_test)
prettyPlot(x,y,x_test,preds,history,'linear',5000)
model.summary()
prettyPlot函数创建绘图

如何在不更改NN拓扑的情况下获得更好的结果?我不希望它太大或太宽。如果可能的话,我想使用更少的隐藏层和神经元

我想要近似的函数:

def fun(X):
    return math.sin(1.2*X + 0.5) + math.cos(2.5*X + 0.2) + math.atan(2*X + 1) -  math.cos(2*X + 0.5) 
样本:

range = 20
x = np.arange(0, range, 0.01).reshape(-1,1)
y = np.array(list(map(fun, x))).reshape(-1,1)

x_test = (np.random.rand(range*10)*range).reshape(-1,1)
y_test = np.array(list(map(fun, x_test))).reshape(-1,1)
然后使用MinMaxScaler对y和y_测试进行归一化

scalerY= MinMaxScaler((0,1))
scalerY.fit(y)
scalerY.fit(y_test)
y = scalerY.transform(y)
y_test = scalerY.transform(y_test)

最后一层中的激活函数是线性的。

如果精度仍然存在问题,请尝试使用大量数据点,如10k-100k。

最后一层中的
激活乐趣是什么?此外,请添加规范化
y
y\u测试的代码。
@今天我添加了代码。最后一层中的激活乐趣是线性的。我在最后一层中也尝试过使用sigmoid作为激活乐趣,结果类似。首先,不要规范化
y
y\u测试。这毫无意义,因为您想要近似函数
fun
(因此您需要保留真实值;更不用说这种通过缩放实现的标准化会完全扭曲值)。其次,如果你想规范化某个东西,它应该是
x
x\u test
。第三,修改优化器的学习率(即,
keras.optimizers.Adam(lr=0.01)
)或尝试其他优化器,如
RMSprop
。第四,最佳做法是添加验证数据,以确保您没有过度拟合。如果其中任何一个不合理,请告诉我。