【问题标题】:Python: Issues training and predicting regression on KerasPython:在 Keras 上训练和预测回归问题
【发布时间】:2017-09-05 23:06:39
【问题描述】:

我正在使用 Keras 研究一个简单的时间序列回归问题,我想使用最近 20 个收盘价预测下一个收盘价,根据我找到的一些示例,我有以下代码:

根据“build_fn”参数的需要,我将顺序模型写在一个单独的函数中:

def modelcreator():
   model = Sequential()
   model.add(Dense(500, input_shape = (20, ),activation='relu'))
   model.add(Dropout(0.25))
   model.add(Dense(250,activation='relu'))
   model.add(Dense(1,activation='linear'))

   model.compile(optimizer=optimizers.Adam(),
                 loss=losses.mean_squared_error)

   return model 

我创建 KerasRegressor 对象,传递模型创建函数和所需的拟合参数:

estimator = KerasRegressor(build_fn=modelcreator,nb_epoch=100, batch_size=32)

我使用 592 个样本通过 KerasRegressor 对象训练模型:

self.estimator.fit(X_train, Y_train)

问题开始出现,尽管 nb_epoch=100 我的模型只训练了 10 个 epoch:

Epoch 1/10
592/592 [==============================] - 0s - loss: 6.9555e-05     
Epoch 2/10
592/592 [==============================] - 0s - loss: 1.2777e-05     
Epoch 3/10
592/592 [==============================] - 0s - loss: 1.0596e-05     
Epoch 4/10
592/592 [==============================] - 0s - loss: 8.8115e-06     
Epoch 5/10
592/592 [==============================] - 0s - loss: 7.4438e-06     
Epoch 6/10
592/592 [==============================] - 0s - loss: 8.4615e-06     
Epoch 7/10
592/592 [==============================] - 0s - loss: 6.4859e-06     
Epoch 8/10
592/592 [==============================] - 0s - loss: 6.9010e-06     
Epoch 9/10
592/592 [==============================] - 0s - loss: 5.8951e-06     
Epoch 10/10
592/592 [==============================] - 0s - loss: 7.2253e-06  

当我尝试使用数据样本进行预测时:

prediction = self.estimator.predict(test)

预测值应该接近 0.02-0.04 范围,但是当我打印它时,我得到 0.000980315962806344

Q1:如何将训练周期设置为所需的值?

Q2:如何使用我的 NN 生成预测?

【问题讨论】:

    标签: python neural-network regression keras


    【解决方案1】:

    您的网络未融合。尝试更改参数。损失应该不断减少。还要正确初始化参数。

    【讨论】:

    • 我应该尝试更改哪些参数?我一直在使用相同的框架与其他神经网络合作,我知道每次迭代时损失值应该减少或至少收敛,但我无法确认只有 10 次迭代的损失趋势......
    【解决方案2】:

    首先,您很可能使用的是 Keras 2.0,并且在该版本中,参数 nb_epochs 已重命名为 epochs。

    第二件事是您必须将输入和输出标准化为 [0, 1] 范围。如果没有规范化,它将无法工作。另外为了匹配归一化的输出和网络范围,最好在输出层使用 sigmoid 激活。

    【讨论】:

    • 将 nb_epochs 更改为 epochs 就像一个魅力......关于数据:我的输入和输出已经在 [0,1] 范围内关于激活函数:我改变了它,我仍然得到低预测结果是:0.003018886549398303,它应该比我第一次尝试线性激活要好 0.03,但还没有,我猜我的网络架构有问题,语法和变量不再有问题名字...谢谢你的帮助
    • @AndrésRangel 您可能有 [0, 1] 中的数据,但它们还需要覆盖 [0, 1] 中的完整范围,这将有助于训练。
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多