2016-03-21 35 views
8

尺寸我試圖運行此SimpleRNN的錯誤號:上model.fit

model.add(SimpleRNN(init='uniform',output_dim=1,input_dim=len(pred_frame.columns))) 
model.compile(loss="mse", optimizer="sgd") 
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),show_accuracy=True) 

錯誤是model.fit,你可以看到如下:

File "/Users/file.py", line 1496, in Pred 
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),show_accuracy=True) 
File "/Library/Python/2.7/site-packages/keras/models.py", line 581, in fit 
shuffle=shuffle, metrics=metrics) 
File "/Library/Python/2.7/site-packages/keras/models.py", line 239, in _fit 
outs = f(ins_batch) 
File "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py", line 365, in __call__ 
return self.function(*inputs) 
File "/Library/Python/2.7/site-packages/theano/compile/function_module.py", line 513, in __call__ 
allow_downcast=s.allow_downcast) 
File "/Library/Python/2.7/site-packages/theano/tensor/type.py", line 169, in filter 
data.shape)) 
TypeError: ('Bad input argument to theano function with name "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py:362" at index 0(0-based)', 'Wrong number of dimensions: expected 3, got 2 with shape (88, 88).') 

錯誤告訴我它的尺寸錯誤,它應該是3,它只有2。它指的是什麼尺寸?

回答

8

您正在嘗試運行RNN。這意味着你想要在你的計算中包括前面的時間步驟。爲此,必須在將數據提供給SimpleRNN圖層之前對其進行預處理。爲了簡單起見,讓我們假設88個樣本不是88個樣本,而是每個樣本8個樣本,每個樣本都有4個特徵。現在,當使用RNN時,您必須決定反向傳播的最大值(即計算中包含的以前時間步數)。在這種情況下,您可以選擇包含最多2個先前的時間步驟。因此,爲了計算RNN的權重,您必須在每個時間步驟提供當前時間步長(具有4個特徵)的輸入和前兩個時間步長(每個具有4個特徵)的輸入。就像在這個可視化:的

sequence sample0 sample1 sample2 sample3 sample4 sample5 sample6 sample7  
    0  |-----------------------| 
    1     |-----------------------| 
    2       |-----------------------| 
    3         |-----------------------| 
    4            |----------------------| 
    5              |----------------------| 

因此,而不是給人一種(nb_samples,nb_features)矩陣的輸入,SimpleRNN,你必須給它一個(nb_sequences,nb_timesteps,nb_features)型輸入。在這個例子中,它意味着你不給(8x4)輸入一個(5x3x4)輸入。

的keras Embedding層可能會做這份工作,但在這種情況下,你也可以寫一個簡短的代碼吧:

input = np.random.rand(8,4) 
nb_timesteps = 3 # 2 (previous) + 1 (current) 
nb_sequences = input.shape[0] - nb_timesteps #8-3=5 

input_3D = np.array([input[i:i+nb_timesteps] for i in range(nb_sequences)]) 
+0

感謝您的解釋,我有類似的問題。爲什麼在你評論的情況下反向傳播的最大步驟只有2?爲什麼序列的數量是5?順便說一下,順序是指訓練中的一個時代? – David

+1

我隨機選擇數字2作爲本例中反向傳播的先前步驟的數量。結合(也是自由選擇的)8個樣品的數量,這導致總共5個序列。序列1包括樣本1,2和3,序列2包括2,3和4等等。有關詳細信息,請參閱我答案中的圖表。一個時代是當網絡已經被每個序列訓練一次時完成的。然後你再次開始第一個序列 – Lorrit

4

的錯誤可能是因爲您的輸入尺寸不是格式:

(nb_samples, timesteps, input_dim) 

據預計3個維度,而你只是其中(88,88) 2要提供。

+0

優秀@Tarantula!輸入dim是我的預測數據幀的列數,對嗎?什麼是時間步和nb_samples?行和幀大小? – abutremutante