同様の問題を検索して見つけましたが、私が直面している問題と同じ問題はないようです。私は、層の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.ones
とoutput_shape
から(1,)
の(3,)
を変更すると正常に動作しているようです。
私が理解しているところでは、ラムダレイヤーは異なる次元の入出力ペアを処理できるはずですが、それは正しいのですか?
を使用することをお勧め、ありがとう。バックスサイズはタプルの第2の場所を占めるのに対し、ラムダ関数の 'K.ones'テンソルを定義するには、バッチサイズは最初のスロットに入ります。なぜこれが私に考えを与えることができますか? これを念頭に置いて、両方の提案が機能します( 'K.repeat_elements'テンソルを再構成した後)。ありがとう! – hughes
いいえ、バッチサイズは常に最初の位置になります。私は '(3、)'にカンマがあるのはなぜ分かりませんが、有用なものではありません。次元が1つしかない場合は、コンマを置く必要があります。 (None、3)がある場合は、(3、)と定義します。 (None、3、4)がある場合、それを(3,4)として定義します。 - 単なる表記の問題でしょう。タプルを作成するために少なくとも1つのカンマを持つ必要があるかもしれません。 –
答えがあなたには分かりやすいときは、答えとしてマークすることを考えてください:) - それは答えを探しているときに他のユーザーに役立ちます。 –