假设我有这 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
的形状来解决问题?
有几个问题。 首先,因为是监督训练,你需要确保训练巴黎的长度(
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)