Python Keras LSTM输入/输出尺寸

Python Keras LSTM输入/输出尺寸,python,keras,lstm,Python,Keras,Lstm,我正在用Keras构建一个LSTM预测器。我的输入数组是历史价格数据。我将数据分割成窗口大小块,以便预测前面的预测长度块。我的数据是4246个浮点数的列表。我将数据分成4055个数组,每个数组的长度为168,以便预测前方的24个单位 这给了我一个x\u列集合,其尺寸(4055168)。然后,我缩放数据并尝试拟合数据,但遇到维度错误 df = pd.DataFrame(data) print(f"Len of df: {len(df)}") min_max_scaler = M

我正在用Keras构建一个LSTM预测器。我的输入数组是历史价格数据。我将数据分割成
窗口大小
块,以便预测前面的
预测长度
块。我的数据是4246个浮点数的列表。我将数据分成4055个数组,每个数组的长度为168,以便预测前方的24个单位

这给了我一个
x\u列
集合,其尺寸
(4055168)
。然后,我缩放数据并尝试拟合数据,但遇到维度错误

df = pd.DataFrame(data)
print(f"Len of df: {len(df)}")
min_max_scaler = MinMaxScaler()
H = 24

window_size = 7*H
num_pred_blocks = len(df)-window_size-H+1

x_train = []
y_train = []
for i in range(num_pred_blocks):
    x_train_block = df['C'][i:(i + window_size)]
    x_train.append(x_train_block)
    y_train_block = df['C'][(i + window_size):(i + window_size + H)]
    y_train.append(y_train_block)

LEN = int(len(x_train)*window_size)
x_train = min_max_scaler.fit_transform(x_train)
batch_size = 1
    
def build_model():
    model = Sequential()
    model.add(LSTM(input_shape=(window_size,batch_size),
                   return_sequences=True,
                   units=num_pred_blocks))
    model.add(TimeDistributed(Dense(H)))
    model.add(Activation("linear"))
    model.compile(loss="mse", optimizer="rmsprop")
    return model
    
num_epochs = epochs
model= build_model()
model.fit(x_train, y_train, batch_size = batch_size, epochs = 50)
返回的错误是这样的

ValueError: Error when checking model target: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 4055 arrays: [array([[0.00630006],
我没有正确分段吗?装载正确吗?单元的数量是否应该不同于预测块的数量?谢谢你的帮助。谢谢

编辑 将它们转换为Numpy数组的建议是正确的,但MinMixScalar()返回一个Numpy数组。我将阵列重新调整为正确的尺寸,但现在我的计算机出现CUDA内存错误。我认为这个问题解决了。多谢各位

df = pd.DataFrame(data)
min_max_scaler = MinMaxScaler()
H = prediction_length

window_size = 7*H
num_pred_blocks = len(df)-window_size-H+1

x_train = []
y_train = []
for i in range(num_pred_blocks):
    x_train_block = df['C'][i:(i + window_size)].values
    x_train.append(x_train_block)
    y_train_block = df['C'][(i + window_size):(i + window_size + H)].values
    y_train.append(y_train_block)

x_train = min_max_scaler.fit_transform(x_train)
y_train = min_max_scaler.fit_transform(y_train)
x_train = np.reshape(x_train, (len(x_train), 1, window_size))
y_train = np.reshape(y_train, (len(y_train), 1, H))
batch_size = 1

def build_model():
    model = Sequential()
    model.add(LSTM(batch_input_shape=(batch_size, 1, window_size),
                   return_sequences=True,
                   units=100))
    model.add(TimeDistributed(Dense(H)))
    model.add(Activation("linear"))
    model.compile(loss="mse", optimizer="rmsprop")
    return model

num_epochs = epochs
model = build_model()
model.fit(x_train, y_train, batch_size = batch_size, epochs = 50)

我认为您没有通过模型中的批量大小

input\u shape=(窗口大小、批次大小)
是数据维度。这是正确的,但是您应该使用
input\u shape=(窗口大小,1)

如果您想使用batch,您必须添加另一个维度,如下面的
LSTM(n_神经元,batch_输入_形状=(n_batch,X.shape[1],X.shape[2]))
(引用自Keras)

就你而言:

def build_model():
    model = Sequential()
    model.add(LSTM(input_shape=(batch_size, 1, window_size),
                   return_sequences=True,
                   units=num_pred_blocks))
    model.add(TimeDistributed(Dense(H)))
    model.add(Activation("linear"))
    model.compile(loss="mse", optimizer="rmsprop")
    return model
您还需要使用
np.shape
来更改数据的维度,它应该是(
batch\u dim
data\u dim\u 1
data\u dim\u 2
)。我使用的是
numpy
,因此
numpy.reformate()
可以工作

首先,您的数据应该是按行的,因此对于每一行,您应该有一个
(1168)
,然后添加批维度,它将是
(batch\n,1168)


希望有帮助。

这可能是因为
x\u-train
y\u-train
没有更新到numpy数组。在github上仔细看看这个

model = build_model()
x_train, y_train = np.array(x_train), np.array(y_train)
model.fit(x_train, y_train, batch_size = batch_size, epochs = 50)