簡體   English   中英

Keras-檢查目標時出錯:預期activation_5具有形狀(2,),但數組的形狀為(1,)

[英]Keras - Error when checking target: expected activation_5 to have shape (2,) but got array with shape (1,)

在LSTM網絡中,我將以下形式的數組作為特征傳遞

X
array([[1],[2],...,[12]],
      [[2],[3],...,[13]],...
      [[999],[1000],...,[1011]]
      [[1000],[1001],...,[1012]])

所以它的形狀是(1000,12,1)

目標是一個具有兩個可能值0和1的數組

y 
array([[1], [0], [0], [1], ..., [0]])

所以它的形狀是(1000,1)

考慮到必須使用softmax激活和Dense 2,我在做錯什么?

這是網絡的構建。

model = Sequential()
model.add(LSTM(25, input_shape=(12, 1)))
model.add(Dropout(0.1))
model.add(Dense(2))
model.add(Activation('softmax'))
model.compile(loss="mse", optimizer="rmsprop")
model.fit(X, y, epochs=1000, batch_size=80, verbose=1, shuffle=False, callbacks=[EarlyStopping(patience=10)])

我的猜測是,它與目標的形狀有關,但我不確定如何修復它。

謝謝!

將目標轉換為具有兩個類的一種熱編碼可以解決此問題。 要將y轉換為一種熱編碼,請執行以下操作

y = numpy.eye(2)[y]

編輯:

另一種解決方案是將輸出層更改為僅包含具有S型激活的單個節點。 如果目標是輸出[0,1]之間的值,則最適合S型激活。 我還建議將損失函數從“ mse”更改為“ binary_crossentropy”,因為“ mse”損失的假設是數據來自正態分布而不是二項分布。 在您的情況下,輸出類的分布為二項式({0,1})。 因此,使用“ binary_crossentropy”是合理的選擇。

...
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss="binary_crossentropy", optimizer="rmsprop")
... 

我認為Mitiku正確地對您的分類Y進行熱編碼是正確的。這也可以通過keras.utils.to_categorical完成。

one_hot_y = keras.utils.to_categorical(y)

我也想知道您的模型是否應該...

model = Sequential()
model.add(LSTM(25, input_shape=(12, 1)))
model.add(Dropout(0.1))
model.add(Dense(2, activation='softmax') # For a categorical output this has worked for me
model.compile(loss="binary_crossentropy", optimizer="rmsprop") # AFAIK 'mse' loss is not suitable for binary classification.
model.fit(X, y, epochs=1000, batch_size=80, verbose=1, shuffle=False, callbacks=[EarlyStopping(patience=10)])

我本人對神經網絡比較陌生,因此可能不適合LSTM。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM