2016-08-17 316 views
1

嗨,我是一個初學者keras。在Keras(深度學習庫)中,RepeatVector + TimeDistributed =錯誤?

我在做一些模型。

步驟1.輸入批次和單詞列表,(BATCH_SIZE,WORD_INDEX_LIST) 步驟2.獲取字的嵌入每個字(BATCH_SIZE,WORD_LENGTH,EMBEDDING_SIZE) 步驟3.平均每個批處理中每個的每個字的嵌入。 (BATCH_SIZE,EMBEDDING_SIZE) 步驟4.重複矢量N,(BATCH_SIZE,N,EMBEDDING_SIZE) 步驟5.應用緻密層每個時間步

所以,我編寫代碼。

MAX_LEN = 20 (= WORD_INDEX_LIST) 

step 1 
layer_target_input = Input(shape=(MAX_LEN,), dtype="int32", name="layer_target_input") 


# step2 
layer_embedding = Embedding(input_dim = n_symbols+1, output_dim=vector_dim,input_length=MAX_LEN, 
               name="embedding", weights= [embedding_weights],trainable = False) 
encoded_target = layer_embedding(layer_target_input) 


# step 3 
encoded_target_agg = KL.core.Lambda(lambda x: K.sum(x, axis=1))(encoded_target) 


#step 4 
encoded_target_agg_repeat = KL.RepeatVector(MAX_LEN)(encoded_target_agg) 



# step 5 
layer_annotated_tahn = KL.Dense(output_dim=50, name="layer_tahn") 
layer_annotated_tahn_td = KL.TimeDistributed(layer_annotated_tahn) (encoded_target_agg_repeat) 

model = KM.Model(input=[layer_target_input], output=[ layer_annotated_tahn_td]) 

r = model.predict({ "layer_target_input":dev_targ}) # dev_targ = (2, 20, 300) 

但是,當我運行這段代碼, 結果是波紋管。

Traceback (most recent call last): 
    File "Main.py", line 127, in <module> 
    r = model.predict({ "layer_target_input":dev_targ}) 
    File "/usr/local/anaconda/lib/python2.7/site-packages/Keras-1.0.7-py2.7.egg/keras/engine/training.py", line 1180, in predict 
    batch_size=batch_size, verbose=verbose) 
    File "/usr/local/anaconda/lib/python2.7/site-packages/Keras-1.0.7-py2.7.egg/keras/engine/training.py", line 888, in _predict_loop 
    outs[i][batch_start:batch_end] = batch_out 
ValueError: could not broadcast input array from shape (30,20,50) into shape (2,20,50) 

爲什麼批量大小發生變化? 我有什麼錯?

回答

2

問題出在Lambda運營商。在你的情況下,它需要一個形狀(batch_size, max_len, embedding_size)的張量,並且預計會產生一個形狀張量(batch_size, embedding_size)。但是,Lambda op不知道您在內部應用了哪種轉換,因此在圖表編輯期間錯誤地認爲該形狀不會更改,因此假定輸出形狀爲(batch_size, max_len, embedding_size)。接下來的RepeastVector期望輸入是二維的,但從不斷言是這樣。它產生預期形狀的方式是(batch_size, num_repetitions, in_shape[1])。由於Lambda錯誤地將其形狀報告爲(batch_size, max_len, embedding_size),因此RepeatVector現在將其形狀報告爲(batch_size, num_repetitions, max_len)而不是預期的(batch_size, num_repetitions, embedding_size)num_repetitions您的情況與max_len相同,因此RepeastVector的形狀爲(batch_size, max_len, max_len)TimeDistributed(Dense)的工作方式是:

Reshape((-1, input_shape[2])) 
Dense() 
Reshape((-1, input_shape[1], num_outputs)) 

現在input_shape[2]被誤認爲是max_len而不是embedding_size,而是被賦予實際的張量有(batch_size, max_len, embedding_size)正確的形狀,所以有什麼最終情況是:

Reshape((batch_size * embedding_size, max_len)) 
Dense() 
Reshape((batch_size * embedding_size/max_len, max_len, num_outputs)) 

在你的情況batch_size * embedding_size/max_len碰巧是2 * 300/20 = 30,這就是你錯誤的形狀來自哪裏。

要修復它,你需要明確地告訴Lambda你想讓它產生的形狀:

encoded_target_agg = KL.core.Lambda(lambda x: K.sum(x, axis=1), output_shape=(vector_dim,))(encoded_target) 
+1

這是一個完美的解釋和答覆。 它可以幫助解決我的問題。 非常感謝! –