首页 > 解决方案 > 使用 Keras 使用 ANN 预测正弦

问题描述

我是机器学习的新手,所以如果这个问题反复出现,我会提前道歉,因为我无法找到我的问题的令人满意的答案。作为一项教学练习,我一直在尝试训练 ANN 来预测正弦波。我的问题是,虽然我的神经网络可以准确地训练正弦的形状,但它在验证集和更大的输入中有些失败。因此,我首先将输入和输出输入为

x = np.arange(800).reshape(-1,1) / 50
y = np.sin(x)/2

其余代码如下

model = Sequential()
model.add(Dense(20, input_shape=(1,),activation = 'tanh',use_bias = True))
model.add(Dense(20,activation = 'tanh',use_bias = True))
model.add(Dense(1,activation = 'tanh',use_bias = True))
model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.005), metrics=['mean_squared_error'])


history = model.fit(x,y,validation_split=0.2, epochs=2000, batch_size=400, verbose=0)

然后我设计了一个测试,定义为

x1= np.arange(1600).reshape(-1,1) / 50
y1 = np.sin(x1)/2
prediction = model.predict(x1, verbose=1)

所以问题是 ANN 在验证集中显然开始失败并预测正弦波的延续。

验证集的奇怪行为:

验证集的奇怪行为

无法预测训练集以外的任何内容:

预言

那么,我做错了什么?ANN 是否无法继续正弦波?我试图微调大多数可用参数但没有成功。大多数关于类似问题的常见问题解答都是由于过度拟合造成的,但我一直无法解决这个问题。

标签: pythonmachine-learningkerasneural-network

解决方案


如上所述,您的 NN 无法“掌握”数据的循环性质。

您可以将由密集层组成的 DNN 视为线性回归的更智能版本——使用 DNN 的原因是具有可以由网络本身“学习”的高级非线性抽象特征,而不是通过手。相反,这些特征大多难以描述和理解。

所以,一般来说,DNN 有利于预测“中间”的未知点,x 离训练集越远,预测就越不准确。再说一遍,总的来说。

要预测本质上是循环的事物,您应该使用更复杂的架构,或者预处理您的数据,即通过了解“季节性”或“基本频率”。


推荐阅读