python - 使用 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 是否无法继续正弦波?我试图微调大多数可用参数但没有成功。大多数关于类似问题的常见问题解答都是由于过度拟合造成的,但我一直无法解决这个问题。
解决方案
如上所述,您的 NN 无法“掌握”数据的循环性质。
您可以将由密集层组成的 DNN 视为线性回归的更智能版本——使用 DNN 的原因是具有可以由网络本身“学习”的高级非线性抽象特征,而不是通过手。相反,这些特征大多难以描述和理解。
所以,一般来说,DNN 有利于预测“中间”的未知点,x 离训练集越远,预测就越不准确。再说一遍,总的来说。
要预测本质上是循环的事物,您应该使用更复杂的架构,或者预处理您的数据,即通过了解“季节性”或“基本频率”。
推荐阅读
- python - 使用 go-serial 从 arduino 的串口读取
- email - 从 Erlang 发送邮件 - OTP 应用程序或操作系统应用程序
- java - 查询C3P0开始获取的连接数
- firebase - 在 Firestore 中一次按数组项和其他字段查询
- android - Firestore 嵌套获取使用回调在初始调用时获取空结果
- c# - 使用字符串对象成员名称处理 IQueryable.OrderBy 扩展中的无效输入
- javascript - 我需要根据日期按降序对数组进行排序
- symfony - Symfony 3.4:NumberType 和 MoneyType 正在呈现文本类型的 html 输入而不是数字类型的输入
- macos - MAMP vhost:“在此服务器上找不到请求的 URL /。”
- c# - 双击datagridview后组合框中的SelectedValue