Python 基于Keras的神经网络正弦预测

Python 基于Keras的神经网络正弦预测,python,machine-learning,keras,neural-network,Python,Machine Learning,Keras,Neural Network,我是机器学习新手,所以如果这个问题有点重复,我会提前道歉,因为我还没有找到一个满意的答案来解决我的问题。 作为一个教学练习,我一直在尝试训练人工神经网络来预测正弦波。我的问题是,尽管我的神经网络精确地训练正弦的形状,但它在验证集和更大的输入中有些失败。因此,我首先将输入和输出作为 x = np.arange(800).reshape(-1,1) / 50 y = np.sin(x)/2 代码的其余部分如下所示 model = Sequential() model.add(Dense(20, i

我是机器学习新手,所以如果这个问题有点重复,我会提前道歉,因为我还没有找到一个满意的答案来解决我的问题。 作为一个教学练习,我一直在尝试训练人工神经网络来预测正弦波。我的问题是,尽管我的神经网络精确地训练正弦的形状,但它在验证集和更大的输入中有些失败。因此,我首先将输入和输出作为

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不能继续正弦波吗?我试图微调大多数可用参数,但没有成功。关于类似问题的大多数常见问题解答都是由于过度拟合造成的,但我无法解决这一问题。

祝贺您在第一次尝试深度学习时遇到了一个基本问题:)

你所做的是正确的,事实上,ANN(以其当前形式)无法继续正弦波


然而,当验证误差开始增加时,您可以在MSE图中看到过度拟合的迹象。如上所述,您的NN无法“掌握”数据的循环性质

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

因此,一般来说,DNN适合于预测“中间”的未知点,x距离训练集越远,预测的准确性就越低。同样,总的来说


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

尝试一些RNN,如LSTMW,我为什么要@nithin?如果一个简单的ANN不起作用,我仍然需要直觉来解释为什么不起作用,如果RNN起作用,它为什么起作用?我对所有的问题感到抱歉,但我的理论物理背景促使我需要理解的不仅仅是尝试和错误。正如一些答案中所指出的,一个普通的人工神经网络只能在它训练的领域中工作。所以无论你做什么,人工神经网络都无法掌握数据的循环性质。即使你从逻辑上思考,你也只是在给它一个范围内的值,并教授它。它怎么知道它应该遵循与您所教范围之外的其他值相同的模式?因此它需要一些预先信息,即数据是循环的。所以,即使你只给出一个周期的数据,它也能够预测所有其他的值。所以这就是使用RNN(lstm)的情况,它本质上处理循环数据。确实存在过度拟合的迹象。我正在运行许多时代,以便了解NN的演变。尽管如此,即使我减少了纪元的数量,也不能解决问题。我想如果你是正确的,这个框架中没有太多的选项。减少历元的数量并不能解决过度拟合问题,你应该为此添加正则化(例如,退出、重量衰减、较小的批量大小等)和/或尝试更简单的模型(更少的层和/或更少的参数)。问题不在于框架(keras),而在于方法(深度学习)谢谢你的回答。这是一种幼稚的做法。