【问题标题】:Keras model to fit polynomial拟合多项式的 Keras 模型
【发布时间】:2017-07-09 17:02:47
【问题描述】:

我从 4 次多项式生成了一些数据,并想在 Keras 中创建一个回归模型来拟合这个多项式。问题是拟合后的预测似乎基本上是线性的。由于这是我第一次使用神经网络,我想我犯了一个非常微不足道和愚蠢的错误。

这是我的代码:

model = Sequential()
model.add(Dense(units=200, input_dim=1))
model.add(Activation('relu'))
model.add(Dense(units=45))
model.add(Activation('relu'))
model.add(Dense(units=1))

model.compile(loss='mean_squared_error',
              optimizer='sgd')

model.fit(x_train, y_train, epochs=20, batch_size=50)

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=100)

classes = model.predict(x_test, batch_size=1)

x_trainy_train 是 numpy 数组,包含来自 this file 的前 9900 个条目。

我尝试了不同的 batch_size、epoch 数、层大小和训练数据量。似乎没有任何帮助。

请指出你看到的所有不合理的地方!

【问题讨论】:

  • 能否提供x_train、y_train和x_test?以便读者可以运行您的代码。
  • 我在原始问题中添加了指向数据文件的链接。

标签: python neural-network keras non-linear-regression


【解决方案1】:

神经网络通常不能很好地推断多项式函数。但是,如果您的训练和测试数据在同一范围内,您可以获得相当不错的结果。我生成了一些数据并使用了您的代码:

import numpy as np
x_train=np.random.rand(9000)
y_train=x_train**4+x_train**3-x_train
x_train=x_train.reshape(len(x_train),1)

x_test=np.linspace(0,1,100)
y_test=x_test**4+x_test**3-x_test
x_test=x_test.reshape(len(x_test),1)


model = Sequential()
model.add(Dense(units=200, input_dim=1))
model.add(Activation('relu'))
model.add(Dense(units=45))
model.add(Activation('relu'))
model.add(Dense(units=1))

model.compile(loss='mean_squared_error',
              optimizer='sgd')

model.fit(x_train, y_train, epochs=40, batch_size=50, verbose=1)

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=100)

classes = model.predict(x_test, batch_size=1)

test=x_test.reshape(-1)
plt.plot(test,classes,c='r')
plt.plot(test,y_test,c='b')
plt.show()

请注意,我将epochs 增加到 40 以获得更多迭代和更准确的结果。我还设置了verbose=1 以便能够查看损失的行为。损失确实减少到7.4564e-04,下面是我得到的结果。红线是网络的预测,蓝线是正确的值。您可以看到它们彼此非常接近。

【讨论】:

  • 谢谢!对于我选择上述代码的多项式并没有真正起作用。但是将激活形式从 ReLU 更改为 sigmoid(10*x) 会产生可接受的结果。也许从拟合多项式开始第一次尝试神经网络是一个糟糕的选择。
  • @FloodLuszt 在一维 Relus 的单层中执行分段线性回归。您最好只使用一层并可能显着增加节点数量。本质上,您可以用线段拟合曲线的程度取决于函数的凸度[因此梯度变化越多,需要添加的节点越多]。看我的回答stats.stackexchange.com/a/375658/27556
猜你喜欢
  • 2022-01-25
  • 2017-07-08
  • 2020-05-12
  • 1970-01-01
  • 2021-09-30
  • 2020-03-24
  • 2019-02-10
  • 2015-09-06
  • 2020-09-12
相关资源
最近更新 更多