LSTM和TimeseriesGenerator。输入形状错误

时间:2019-08-24 10:02:28

标签: keras deep-learning lstm

我尝试遵循在线教程(12等),但是当使用keras TimeseriesGenerator拟合LSTM模型时,我无法正确获取输入尺寸。

为进行训练,我有一个名为dn的长numpy数组,形状为(12499896,)。 然后我定义了keras TimeseriesGenerator

from keras.preprocessing.sequence import TimeseriesGenerator
look_back = 10 
gen = TimeseriesGenerator(dn, dn, length=look_back, batch_size=8)

我定义模型:

from keras.models import Sequential
from keras.layers import LSTM, Dense

model = Sequential()
model.add(LSTM(units=100, activation='relu', input_shape=(look_back, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

当我使用fit_generator拟合模型时

model.fit_generator(gen, steps_per_epoch=10, epochs=5)

我得到了错误:

  

检查输入时出错:预期lstm_9_input具有3维,   但是得到了形状为(8,10)的数组

如果我正确理解LSTM要求输入形状为[samples, look_back, features](在这里我猜为samples=12499896look_back=10features=1)。并且TimeseriesGenerator产生一个2元组的列表。我应该重塑TimeseriesGenerator的输出吗? (但我认为这不是要更改吗?)。我在哪里出错?

2 个答案:

答案 0 :(得分:1)

我认为,如果我首先对数组进行整形,它就会起作用

dn = np.reshape(dn, (len(dn),1))

,因此其形状为(12499896, 1),而不是(12499896,)。 然后在LSTM层中使用return_sequences=False

model.add(LSTM(units=100, return_sequences=False, activation='relu', input_shape=(look_back, 1)))

答案 1 :(得分:1)

您已经回答了您的问题,但是我发现了很少的错误,并且想纠正它们。

在为LSTM或Keras中的任何层指定import { map } from 'rxjs/operators'; ... searchProducts(): Observable<Product[]> { return this.http.get<Product[]>('/lerp-product-product').pipe(map( response => response.arr )); } 时,无需提及input_shape。因此,对于LSTM,输入形状应为batch_size[look_back, features]更正确地使用的词是look_back

由于输入是一维数据,因此您可以按以下步骤重新调整数据的形状:

timesteps

此外,dn = np.reshape(dn, (-1, 1)) 层中的return_sequences默认情况下为False。

相关问题