2016-08-17 19 views
1

こんにちは私は初心者ケラスです。Keras(深層学習ライブラリ)では、RepeatVector + TimeDistributed = Error?

私はいくつかのモデルを作っています。

ステップ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は、入力が2次元であることを期待していますが、そうでないと主張しません。予想される形状を生成する方法は(batch_size, num_repetitions, in_shape[1])です。 Lambdaが誤ってその形状を(batch_size, max_len, embedding_size)と報告したので、RepeatVectorは、(batch_size, num_repetitions, embedding_size)の代わりに(batch_size, num_repetitions, max_len)という形で報告されるようになりました。あなたの場合のnum_repetitionsmax_lenと同じですので、RepeastVectorの形は(batch_size, max_len, max_len)と報告されています。道TimeDistributed(Dense)作品は次のとおりです。今input_shape[2]ことで

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

が誤って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)) 

あなたのケースでは、は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

これは完璧な説明と答えます。 私の問題を解決するのに役立つかもしれません。 ありがとうございます! –

関連する問題