Keras中LSTM的第一层中input形状的确定

Keras中的Sequential 顺序模型中输入数据结构的讨论

在LSTM序列模型搭建时,使用Sequential 顺序模型中的model.add.(LSTM())是较为简单的一种方式。
比如下面的一个实例:

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

# 搭建一个 LSTM 多分类过程
# 将输入转化成为[sample, time steps, feature]
trainX = np.reshape(X, (X.shape[0],1, X.shape[1]))        #化为三维
model = Sequential()
model.add(LSTM(50, return_sequences=True, 
               input_shape=(trainX.shape[1],trainX.shape[2])))
model.add(Dropout(0.3))
model.add(LSTM(40,return_sequences=True))  
model.add(Dropout(0.3))
model.add(LSTM(30,return_sequences=False))  
model.add(Dropout(0.3))
model.add(Dense(k2))
model.add(Activation('tanh'))
model.compile(loss='categorical_crossentropy',  # 模型解译
              optimizer='rmsprop',
              metrics=['accuracy'])

但是遇到一个比较奇怪的问题,就是在LSTM中的第一层中,input_shape的确定。

input_shape=[sample, timesteps, feature]

基本所有的文章中都规定 训练的 X 的形状为 [sample, time steps, feature],按照我的理解:
sample:也就是训练样本的数量
time steps和feature 表示一次训练总 X 的形状。其中,
time steps:表X的长度
feature:表X的纬度
比如,我有一组单维时间序列,想用序列S的前m个预测后n个,

#  确定LSTM网络的结构。m个输入,n个输出
def get_LSTM_XY(S,m,n):
    L=len(S)
    X=np.empty((L-(m+n)+1,m))
    Y=np.empty((L-(m+n)+1,n))
    for i in np.arange(L-(m+n)+1):
        X[i]=S[i:m+i].reshape(m,)
        Y[i]=S[m+i:m+n+i].reshape(n,)
    return X,Y

利用上述代码获得训练集上X和Y后,需对X进行维度的转化,这时问题来了。

trainX1 = np.reshape(X, (X.shape[0],X.shape[1]1))        #化为三维
trainX2 = np.reshape(X, (X.shape[0],1, X.shape[1]))        #化为三维

trainX1是按照标准的格式进行转化的,但模型训练时特别慢,
将X的形状按照trainX2转换后,模型训练的速度和精度都可以接受,但这时模型的输入与大家常规的定义存在出入。
请问大家是否遇到过类似的问题?
tensorflow的版本时1.2.1

你可能感兴趣的:(机器学习)