我熟悉LSTM,我需要明确某些事情。我使用t-300建模时间序列:t-1来预测t:t + 60。我的第一个方法是建立一个像这样的LSTM:
# fake dataset to put words into code:
X = [[1,2...299,300],[2,3,...300,301],...]
y = [[301,302...359,360],[302,303...360,361],...]
# LSTM requires (num_samples, timesteps, num_features)
X = X.reshape(X.shape[0],1,X.shape[1])
model = Sequential()
model.add(LSTM(n_neurons[0], batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True))
model.add(Dense(y.shape[1]))
model.compile(loss='mse', optimizer='adam')
model.fit(X, y, epochs=1, batch_size=1, verbose=1, shuffle=False)
使用我的真实数据集,结果不是最理想的,并且在CPU上,它能够在20分钟内训练大约400,000个样本的1个纪元。网络在一个时期之后迅速收敛,对于我提供的任何一组点数,都会产生相同的结果。
我最近的改变是以下列方式重塑X:
X = X.reshape(X.shape[0],X.shape[1],1)
训练似乎进展缓慢(我没有尝试过完整的数据集),但速度明显变慢。在一个2,800个样本的单个时期内训练大约需要5分钟。我玩弄了一小部分我的真实数据和少量的时代,这看起来很有希望。我没有为不同的输入获得相同的输出。
有谁能帮我理解这里发生的事情?
答案 0 :(得分:1)
在Keras中,(num_samples,timesteps,num_features)中的时间步长确定 BPTT 将传回错误的步数。
反过来,这需要更多的时间来完成你所观察到的减速。
在您的情况下, X.reshape(X.shape[0], X.shape[1], 1)
是正确的做法,因为您拥有的是一个具有300次步长的单一功能。