TLDR:如何使用Keras RNN预测序列中的下一个值?
我有一系列连续值。我想将它们提供给RNN以预测序列中的下一个值。
[ 0.43589744 0.44230769 0.49358974 ..., 0.71153846 0.70833333 0.69230769]
我正在使用Keras这样做,并且可以使网络的损失减少但精度始终为1.0。这是错的。 y_tests != model.predict(x_tests)
。
Epoch 0
1517/1517 [==============================] - 0s - loss: 0.0726 - acc: 1.0000 - val_loss: 0.0636 - val_acc: 1.0000
Epoch 1
1517/1517 [==============================] - 0s - loss: 0.0720 - acc: 1.0000 - val_loss: 0.0629 - val_acc: 1.0000
...
这是我的网络。
model = Sequential()
model.add(SimpleRNN(1, 100))
model.add(Dense(100, 1, activation = "sigmoid"))
model.compile(loss="mean_squared_error", optimizer = "sgd")
我尝试过SimpleRNN,GRU和LSTM,但没有运气。以下是数据的格式化方式。
# Current value
y_train = [[ 0.60576923] [ 0.64102564] [ 0.66025641] ..., [ 0.71153846] [ 0.70833333] [ 0.69230769]]
# Previous 10 values
x_train_10 = [
[[ 0.65064103] [ 0.66346154] [ 0.66346154] ..., [ 0.72115385] [ 0.72435897] [ 0.71153846]] ...,
[[ 0.66346154] [ 0.66346154] [ 0.67628205] ..., [ 0.72435897] [ 0.71153846] [ 0.70833333]]
]
# Previous value
x_train_1 = [[ 0.58333333] [ 0.60576923] [ 0.64102564] ..., [ 0.72435897] [ 0.71153846] [ 0.70833333]]
# So here are the shapes...
y_train.shape = (1895, 1)
x_train_10.shape = (1895, 10, 1)
x_train_1.shape = (1895, 1)
x_train_10
中的每个元素都是前10个值的列表。我按照这样的方式对其进行格式化,以遵循Keras的文档,即循环图层采用形状(nb_samples, timesteps, input_dim)
的输入。
我也试过使用Embedding
图层而没有运气。 (这可能是使用它的错误方式 - 我只看到它用于分类而不是预测)。
model = Sequential()
model.add(Embedding(1, 30))
model.add(LSTM(30, 100))
...
pad_sequences
也无效。
x_train_1 = sequence.pad_sequences(x_train_1, maxlen = None, dtype = "float32")
我想让RNN使用这个简单的数据/架构,以便以后可以将它用于更复杂的问题。
谢谢:)
答案 0 :(得分:7)
我发布了一个similar question on the Keras Github页面并得到了一个很好的答案。
lukedeo 表示acc: 1.0000
表示真实输出和预测输出都大于0.5,反之亦然。相反,我应该考虑损失,或mse
,以确定模型的准确性。这是因为我的网络是回归而不是分类器/聚类器。
均方根误差是衡量准确度的一个很好的指标。 accuracy_percent = 1 - np.sqrt(mse)
fchollet (Keras创建者)详细说明" 准确性与回归问题无关。"
在执行分类问题时,可以通过在class_mode
中将'categorical'
设置为'binary'
或model.comple(...)
来确定准确性,具体取决于目标(网络输出)。
答案 1 :(得分:4)
尝试使用RMSProp作为优化工具
model.compile(loss="mean_squared_error", optimizer = 'rmsprop')