我尝试遵循在线教程(1,2等),但是当使用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=12499896
,look_back=10
和features=1
)。并且TimeseriesGenerator
产生一个2元组的列表。我应该重塑TimeseriesGenerator的输出吗? (但我认为这不是要更改吗?)。我在哪里出错?
答案 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。