2016-11-19 92 views
4

我想用Keras創建一個有狀態的LSTM,但我不明白如何在LSTM運行之前添加嵌入層。問題似乎是stateful標誌。如果我的網絡不是有狀態的,那麼添加嵌入層是非常直接的,並且可行。有嵌入層的有狀態LSTM(形狀不匹配)

不嵌入層的工作狀態LSTM着眼於這樣的時刻:

model = Sequential() 
model.add(LSTM(EMBEDDING_DIM, 
       batch_input_shape=(batchSize, longest_sequence, 1), 
       return_sequences=True, 
       stateful=True)) 
model.add(TimeDistributed(Dense(maximal_value))) 
model.add(Activation('softmax')) 
model.compile(...) 

當添加嵌入層I移動至batch_input_shape參數到嵌入層即只需要已知的形狀的第一層? 像這樣:

model = Sequential() 
model.add(Embedding(vocabSize+1, EMBEDDING_DIM,batch_input_shape=(batchSize, longest_sequence, 1),)) 
model.add(LSTM(EMBEDDING_DIM, 
       return_sequences=True, 
       stateful=True)) 
model.add(TimeDistributed(Dense(maximal_value))) 
model.add(Activation('softmax')) 
model.compile(...) 

我得到知道唯一的例外是Exception: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4

所以我在這裏停留在那一刻。將字嵌入結合到有狀態的LSTM中有什麼竅門?

回答

2

埋入層的batch_input_shape參數應該是(的batch_size,time_steps),其中time_steps是細胞的batch_size和的展開LSTM /數的長度是在間歇式實施例中的數量。

model = Sequential() 
model.add(Embedding(
    input_dim=input_dim, # e.g, 10 if you have 10 words in your vocabulary 
    output_dim=embedding_size, # size of the embedded vectors 
    input_length=time_steps, 
    batch_input_shape=(batch_size,time_steps) 
)) 
model.add(LSTM(
    10, 
    batch_input_shape=(batch_size,time_steps,embedding_size), 
    return_sequences=False, 
    stateful=True) 
) 

有一個極好的blog post這解釋了在Keras狀態LSTMs。另外,我上傳了一個gist,其中包含一個帶有嵌入層的有狀態LSTM的簡單示例。

+0

你如何決定embedding_size或找出嵌入的向量的大小? – naisanza

+0

@naisanza embedding_size是一個超參數。這意味着embedding_size取決於您的問題,您可以自由選擇它。 不幸的是,我無法給您一個關於如何選擇優秀超參數的一般性答案,但https://arxiv.org/pdf/1206.5533.pdf爲該主題提供了一個良好的開端。 – bruThaler