3

我有不同的长度输入。 (下面是样本输入)Keras-LSTM-输入大小错误

[0.501757009346, 0.554708349218] 
[0.460997102135, 0.554708349218] 
[0.377844867627] 
[0.328125, 0.554708349218] 
[-0.266091572661, 0.554708349218, 0.554708349218] 
[0.514723203769] 
[0.104587155963, 0.554708349218] 
[0.247003647733, 0.554708349218] 
[0.586212380233] 
[0.559979406212, 0.554708349218] 
[0.412262156448, 0.554708349218] 

因此,我已经填补输入序列如下 -

In [115]: from keras.preprocessing.sequence import pad_sequences 

In [116]: max_sequence_length = max([len(i) for i in X]) 

In [117]: padded_sequences = pad_sequences(X, max_sequence_length).tolist() 

In [118]: X_padd=np.array(padded_sequences) 


In [119]: X_padd.shape 
Out[119]: (13189, 694) 

现在我需要重塑输入要的[样品,时间步骤,特征]根据keras文档实现LSTM层。

但是,当我重塑输入衬垫阵列 -

X_reshaped = X_padd.reshape(X_padd.shape [1],max_sequence_length,X_padd.shape [0])

它将引发下面的错误。请帮我解决这个问题。谢谢。

In [120]: X_reshaped = X_padd.reshape(X_padd.shape[1], max_sequence_length, X_padd.shape[0]) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-120-86980292fb31> in <module>() 
----> 1 X_reshaped = X_padd.reshape(X_padd.shape[1], max_sequence_length, X_padd.shape[0]) 

ValueError: total size of new array must be unchanged 

------ -----更新

max_sequence_length = max([len(i) for i in X]) 
padded_sequences = pad_sequences(X, max_sequence_length).tolist() 
X_padd=np.array(padded_sequences) # shape -> (13023, 694) 

X_reshaped = X_padd.reshape(X_padd.shape[0],X_padd.shape[1],1) 

X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X_reshaped,Y,test_size=0.2,random_state=42) 

input_length = X_train.shape[0] 
input_dim = X_train.shape[1] 

model=Sequential() 
model.add(LSTM(4, input_dim=input_dim, input_length=input_length)) 
model.add(Dropout(0.5)) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 
model.compile(loss='mean_squared_error', optimizer='adam') 
model.fit(X_train, Y_train, nb_epoch=50, batch_size=12) 
的数据拟合模型

,下面是错误,我getting-

例外:当错误检查模型输入:预计lstm_input_4有形状(无,10418,694),但有形状的阵列(10418,694,1)

回答

1

据我了解,你没有这里的功能。你有数字序列,而不是向量序列。你的形状是(n_samples, time_step)

所以,如果你想使一个三维张量输入:

X_Reshaped = X_pad.reshape(X_pad[0], X_pad[1], 1) 

记住X_pad[1]是你max_sequence_length。所以你试图将张量形状(13189,694)重塑成(13189,694,694)。第二个有更多的价值,因此抱怨。

我希望这有助于

编辑:

你的训练数据具有重塑后的形状(n_samples, time_steps, num_feat)。 因此,您的lstm的输入数据将具有(batch_size, time_steps, features)的形状。因此,当您指定input_lengthinput_dim时,应该放置time_steps和num_feat值而不是n_samples和time_steps。

因此改变:

input_length = X_train.shape[1] 
input_dim = X_train.shape[2] 
+0

感谢您的答复。我尝试了你所描述的,但仍然面临一些错误。我已经更新了这个问题。你能告诉我什么是错的吗? – xlax

+1

我编辑了我的答案:) –

+0

感谢Nassim。知道什么是错的。完美工作! – xlax