3

我想在Keras中嘗試一個簡單的模型,我想將其作爲輸入大小爲5x3的矩陣。在下面的示例中,在添加第一個緻密層時,通過使用input_shape=(5, 3)來指定。Keras錯誤:期望dense_input_1有3個維度

from keras.models import Sequential 
from keras.layers import Dense, Activation 
from keras.optimizers import Adam 
import numpy as np 


model = Sequential() 
model.add(Dense(32, input_shape=(5, 3))) 
model.add(Activation('relu')) 
model.add(Dense(32)) 
model.add(Activation('relu')) 
model.add(Dense(4)) 


adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) 
model.compile(loss='mean_squared_error', optimizer=adam) 


x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]) 


y = model.predict(x) 

然而,當我運行的代碼中,model.predict()功能提供了以下錯誤:

ValueError: Error when checking : expected dense_input_1 to have 3 dimensions, but got array with shape (5, 3)

但我不理解的錯誤。 x的形狀是(5,3),這正是我告訴第一個密集層期望的輸入。爲什麼因此期待三個維度?看起來這可能與批量大小有關,但我認爲input_shape只是指網絡的形狀,與批量大小無關......

回答

4

問題出在這裏:

model.add(Dense(32, input_shape=(5, 3))) 

它應該是:

model.add(Dense(32, input_shape=(3,))) 

該第一示例尺寸不包括在input_shape。還因爲它實際上取決於在網絡安裝期間設置的batch_size。如果你想指定你可以嘗試:

model.add(Dense(32, batch_input_shape=(5, 3))) 

編輯:

從您的評論我瞭解,你希望你的輸入有shape=(5,3)在這種情況下,你需要:

  1. reshape您的x的設置:

    x = x.reshape((1, 5, 3)) 
    

    其中第一個維度來自示例。

  2. 您需要flatten您的模型在某個階段。這是因爲沒有它,你會通過你的網絡傳遞一個2d輸入。我建議你做到以下幾點:

    model = Sequential() 
    model.add(Dense(32, input_shape=(5, 3))) 
    model.add(Activation('relu')) 
    model.add(Dense(32)) 
    model.add(Activation('relu')) 
    model.add(Flatten()) 
    model.add(Dense(4)) 
    
+0

感謝您的建議。我嘗試過使用'input_shape =(3,)',但是網絡'y'的輸出已經變形了(5,4)。因此,這表明它將'x'視爲一個大小爲5的批次,每個條目的大小爲3.然後,輸出'y'也是一個大小爲5的批次,每個輸出的大小爲4。我想要的是。我希望輸入是形狀(5,3),這樣當我運行'model.predict()'時,它會給出形狀輸出(1,4)。 – Karnivaurus

相關問題