簡體   English   中英

我可以在Keras中將嵌入層與形狀層(?,5)連接起來嗎?

[英]Can I concatenate an Embedding layer with a layer of shape (?, 5) in keras?

我想創建一個LSTM內存。 LSTM應該預測給定一個句子的長度為4的單編碼值。 第一步很容易。

我想做的下一件事是向數據集中添加其他信息。 該信息是長度為5的一鍵編碼矢量。

我的想法是在將數據傳遞到LSTM之前,將“嵌入”層與另一個“輸入”形狀連接起來。 這對我來說是這樣的:

main_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32', name='main_input')
embedding = Embedding(MAX_NB_WORDS, EMBEDDING_SIZE,
                    input_length=MAX_SEQUENCE_LENGTH)(main_input)

# second input model
auxiliary_input = Input(shape=(5,), name='aux_input')
x = concatenate([embedding, auxiliary_input])

lstm = LSTM(HIDDEN_LAYER_SIZE)(x)

main_output = Dense(4, activation='sigmoid', name='main_output')(lstm)

model = Model(inputs=[main_input, auxiliary_input], outputs=main_output)

但是,如果我嘗試進行這樣的設置,則會收到以下錯誤:ValueError:連續層需要輸入,除了concat軸外,它們的形狀都匹配。 得到了輸入形狀:[(無,50,128),(無,5)]

為我工作是創建一個嵌入層的LSTM並將其連接到輔助輸入,但是之后我無法再運行LSTM(獲取錯誤:ValueError:輸入0與lstm_2層不兼容:預期的ndim = 3 ,發現ndim = 2)

所以我的問題是:用keras中帶有附加數據的嵌入層輸入來構建LSTM的正確方法是什么?

似乎您在這里嘗試傳遞有關完整序列的附加信息(而不是每個令牌),這就是為什么您遇到不匹配的問題。

有幾種解決這個問題的方法,各有利弊

(1)您可以將aux_dataaux_data的最后一個輸出並置,因此將concat_with_aux = concatenate([auxiliary_input,lstm])並置,並將此並置向量傳遞給您的模型。 這意味着如果您有兩個相同的序列且具有不同的類別,那么LSTM的輸出將是相同的,那么在級聯之后,密集分類器的工作就是使用此級聯的結果來產生正確的輸出。

(2)如果要直接在LSTM的輸入處傳遞信息。 例如,您可以為類別創建新的可訓練Embedding層:

auxiliary_input = Input(shape=(1,), name='aux_input') # Now you pass the idx (0,1,2,3,4) not the one_hot encoded form
embed_categories = Embedding(5, EMBEDDING_SIZE,
                    input_length=1)(auxiliary_input)

x = concatenate([embed_categories, embedding])

這樣一來,您的LSTM將以您的輔助信息為條件,並且具有不同類別的兩個相同句子將具有不同的最后lstm輸出。

暫無
暫無

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

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