LSTM 层输入的数据基数不明确

问题描述 投票:0回答:1

假设我有这 7 个时间序列样本:

1,2,3,4,5,6,7

我知道每个样本与其之前的两个样本之间存在某种关系。这意味着当您知道两个较早的样本是

1,2
时,您可以预测下一个样本一定是
3
,对于
2,3
,下一个样本是
4
,依此类推。

现在我想为上述样本训练一个带有

RNN
层的
LSTM
。我所做的是:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

X = np.array([[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7]]])
Y = np.array([[3],[4],[5],[6],[7]])

model = keras.Sequential([
    layers.LSTM(16, input_shape=(2, 1)),
    layers.Dense(1, activation="softmax")
])

model.compile(optimizer="rmsprop",
loss="mse",
metrics=["accuracy"])

model.fit(X, Y, epochs=1, batch_size=1)

但是我遇到了这个错误:

ValueError: Data cardinality is ambiguous:
  x sizes: 7
  y sizes: 5
Make sure all arrays contain the same number of samples.

我不知道如何改变

X
Y
的形状来解决问题?

python tensorflow keras neural-network lstm
1个回答
0
投票

有几个问题。 首先,因为是监督训练,你需要确保训练巴黎的长度(

X
和相应的
Y
)是相同的。 Next,因为您想要构建一个需要
1
2
并预测
3
的模型,这就是为什么您还需要相应地准备数据加载器,以便它生成两个值:
X
和目标值为
Y
;例如,首先,它可能如下:
X[0]: [[1], [2]]
Y[0]: [3]
最后,在最后一层中,您使用了激活
softmax
,这在此处使用是不正确的,而应该是线性激活。以下是完整的工作代码。

数据生成器

data = np.array([1, 2, 3, 4, 5, 6, 7])
sequences_length = 2

def dataloader(data, sequences_length):
    X, Y = [], []
    for i in range(len(data) - sequences_length):
        X.append(data[i:i+sequences_length])
        Y.append(data[i+sequences_length])
    return np.array(X), np.array(Y)

X, Y = dataloader(data, sequences_length)
X = np.reshape(X, (X.shape[0], sequences_length , 1))

# check
for i in range(X.shape[0]):
    print(X[i].reshape(-1), Y[i])
[1 2] 3
[2 3] 4
[3 4] 5
[4 5] 6
[5 6] 7

型号

model = keras.Sequential([
    layers.LSTM(64, input_shape=(sequences_length, 1)),
    layers.Dense(1)
])
model.compile(optimizer="adam", loss="mse")
model.fit(X, Y, epochs=1000, batch_size=1)

预测

inference_data = np.array([[8, 9]]).reshape(
    1, sequences_length, 1
)
model.predict(inference_data)
1/1 [==============================] - 0s 25ms/step
array([[9.420095]], dtype=float32)
© www.soinside.com 2019 - 2024. All rights reserved.