2017-06-29 8 views
0

同様の問題を検索して見つけましたが、私が直面している問題と同じ問題はないようです。私は、層の1次元出力を取るラムダ層を含むTheanoバックエンド(両方とも最新)を使用してKerasを用いてニューラルネットワークを実装しようとしており、これを1次元のn次元ベクトルに変換して、 d回の出力をn回繰り返す。Keras Lambdaレイヤーを異なるサイズの入出力に追加したときのブロードキャストの問題

私はに実行しているように見える問題は、ラムダ層でKerasは、入力は、私が指定してるの出力形状と同じ寸法を持っていることを期待しているように見えるということです。

x=Input(shape=(2,)) 
V1=Dense(1)(x) 
V2=Lambda(lambda B : B[0,0]*K.ones((3,)),output_shape=(3,))(V1) 
model=Model(inputs=x,outputs=V2) 
rms = RMSprop() 
model.compile(loss='mse', optimizer=rms) 
model.predict(np.array([1,2]).reshape((1,2))) 

これを提供しますエラー:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-7-40a7e91d5963> in <module>() 
----> 1 model.predict(np.array([1,2]).reshape((1,2))) 

/Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine /training.py in predict(self, x, batch_size, verbose) 
    1504   f = self.predict_function 
    1505   return self._predict_loop(f, ins, 
-> 1506         batch_size=batch_size, verbose=verbose) 
    1507 
    1508  def train_on_batch(self, x, y, 

/Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py in _predict_loop(self, f, ins, batch_size, verbose) 
    1137 
    1138    for i, batch_out in enumerate(batch_outs): 
-> 1139     outs[i][batch_start:batch_end] = batch_out 
    1140    if verbose == 1: 
    1141     progbar.update(batch_end) 

ValueError: could not broadcast input array from shape (3) into shape (1) 

私はこの(K.repeat_elements)を実行しようとする他の方法がある知っているが、これも私の放送に関するエラーメッセージを与えています。この問題は、B[0,0]*を削除しても(ラムダレイヤーがBに依存しないように)、問題は解決されません。 K.onesoutput_shapeから(1,)(3,)を変更すると正常に動作しているようです。

私が理解しているところでは、ラムダレイヤーは異なる次元の入出力ペアを処理できるはずですが、それは正しいのですか?

答えて

0

output_shapeには、バッチサイズは考慮されません。これは正しいです:(3,)

しかし、テンソルでは、バッチサイズは無視されません。式の結果には少なくとも2つのディメンションが必要です(Batch_size、3)。

また、テンソルの要素を使用しないで、テンソル全体を使用してください。私は

を(あなたがバッチ全体に正確に同じ操作を行うことになっているので)、個別の要素を使用することが重要または有用であろうケースを発見していない私はあなたが非常に役に立っK.repeat_elements(B, rep=3, axis=-1)

+0

を使用することをお勧め、ありがとう。バックスサイズはタプルの第2の場所を占めるのに対し、ラムダ関数の 'K.ones'テンソルを定義するには、バッチサイズは最初のスロットに入ります。なぜこれが私に考えを与えることができますか? これを念頭に置いて、両方の提案が機能します( 'K.repeat_elements'テンソルを再構成した後)。ありがとう! – hughes

+0

いいえ、バッチサイズは常に最初の位置になります。私は '(3、)'にカンマがあるのはなぜ分かりませんが、有用なものではありません。次元が1つしかない場合は、コンマを置く必要があります。 (None、3)がある場合は、(3、)と定義します。 (None、3、4)がある場合、それを(3,4)として定義します。 - 単なる表記の問題でしょう。タプルを作成するために少なくとも1つのカンマを持つ必要があるかもしれません。 –

+0

答えがあなたには分かりやすいときは、答えとしてマークすることを考えてください:) - それは答えを探しているときに他のユーザーに役立ちます。 –

関連する問題