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