【问题标题】:Keras model to predict number sequenceKeras模型预测数列
【发布时间】:2017-09-01 13:36:46
【问题描述】:

我正在尝试训练 Keras LSTM 模型来预测序列中的下一个数字。

  1. 下面我的模型有什么问题,模型不学习时如何调试
  2. 如何确定要使用的图层类型
  3. 在编译时我应该根据什么选择损失和优化器参数

我的输入训练数据的形状为 (16000, 10),如下所示

[
    [14955 14956 14957 14958 14959 14960 14961 14962 14963 14964]
    [14731 14732 14733 14734 14735 14736 14737 14738 14739 14740]
    [35821 35822 35823 35824 35825 35826 35827 35828 35829 35830]
    [12379 12380 12381 12382 12383 12384 12385 12386 12387 12388]
    ...
]

对应的输出训练数据的形状为 (16000, 1),如下所示

[[14965] [14741] [35831] [12389] ...]

由于 LSTM 的抱怨,我重塑了训练/测试数据

X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)

这是最终的训练/测试数据形状

Total Samples: 20000
X_train: (16000, 10, 1)
y_train: (16000, 1)
X_test: (4000, 10, 1)
y_test: (4000, 1)

这是我的模型

# Model configuration
epochs = 2
batch_size = 32
hidden_neurons = 100
output_size = 1

# Create the model
model = Sequential()
model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dense(output_size))
model.compile(loss='mean_squared_error', optimizer='rmsprop', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size)

scores = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0)
print("Model Accuracy: %.2f%%" % (scores[1]*100))

这是我的输出

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_3 (LSTM)                (None, 100)               40800     
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 101       
=================================================================
Total params: 40,901
Trainable params: 40,901
Non-trainable params: 0
_________________________________________________________________
None
Epoch 1/2
16000/16000 [==============================] - 11s - loss: 533418575.3600 - acc: 0.0000e+00    
Epoch 2/2
16000/16000 [==============================] - 10s - loss: 532474289.7280 - acc: 6.2500e-05    
Model Accuracy: 0.00%

【问题讨论】:

  • 你尝试过超过 2 个 epoch 吗?
  • 是的,我什至尝试了 10 个 epoch,但损失并没有减少多少,准确率保持为 0
  • 这看起来像是一个回归问题,在这种情况下准确性没有意义。
  • 那么如何训练和评估没有准确性的回归问题。我应该看什么
  • 您好@MatiasValdenegro,感谢您指出不正确的回归指标。我在这里阅读了更多关于回归指标的信息link。现在我用的是mse、mae,结果看起来更真实。谢谢。

标签: machine-learning neural-network keras lstm recurrent-neural-network


【解决方案1】:

试试这个代码:

epochs = 30
batch_size = 64
hidden_neurons = 32
output_size = 1

# Create the model
model = Sequential()
model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dense(output_size, activation = 'elu'))

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size)

scores = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0)
print("Model Accuracy: %.2f%%" % (scores[1]*100))

一般来说,这真的很难帮助你,因为我们需要一种可以测试的可重现的例子。但是,以下是我的建议:

使用神经网络的超参数,例如:激活函数、选择函数、层数、学习率等。

更新:

强烈建议先对数据进行标准化。

【讨论】:

  • 您好@Paddy,感谢您的回复,我在您的代码上运行了 50 个 epoch,但准确率仅为 0.1%。您能否详细说明数据的规范化,并举一些像我这样的数据集的例子。
  • 您好@Paddy 感谢您指出规范化。我通过将输入/输出数据除以 input_data 的最大值将所有数据标准化为介于 0-1 之间。最终的预测似乎很接近,但并不完美。如果有任何其他有助于改进预测的想法,请告诉我。
  • 你可以尝试很多东西,从批量标准化和 dropout 开始。我也会尝试 GRU 而不是 LSTM(只需简单地将 LSTM 替换为 GRU)。另外,最好有一个学习率回调检查这个链接:machinelearningmastery.com/…
【解决方案2】:

准确度不是衡量模型性能的正确指标。您在这里尝试做的更多的是 回归 任务,而不是 分类 任务。从您的损失函数中可以看出同样的情况,您使用的是“mean_squared_error”而不是“categorical_crossentropy”之类的东西。

此外,50 个 epoch 的训练时间太少了。如果您查看日志(在您的原始问题中),您会看到每个时期的损失都在减少。你需要继续训练更多的 epoch,直到你看到损失已经稳定并且没有进一步减少。

第三,在将数据传递给 fit 函数之前,您肯定必须对数据进行规范化。这些值非常大,如果没有归一化,算法可能不会收敛。

如果您仍然需要解决这个问题,并且需要更多帮助,请在 cmets 中告诉我,以便我提供代码方面的帮助。

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 2022-12-04
    • 2018-01-23
    • 1970-01-01
    • 2021-03-12
    • 2017-08-18
    • 2019-10-19
    • 2018-04-15
    相关资源
    最近更新 更多