2017-10-04 12 views
0

私は、ベクトル行列乗算を実行して別の層に渡す前に、kerasでラムダ層を作成しようとしています。マトリックスは固定されています(私はそれを学びたくありません)。以下のコード:行列ベクトル乗算のKeras Lambda層

model.add(Dropout(0.1))  
model.add(Lambda(lambda x: x.dot(A))) 
model.add(Dense(output_shape, activation='softmax')) 
model.compile(<stuff here>)} 

A固定行列であり、私はx.dot(A)をやりたい私はこれを実行すると

、私は次のエラーを取得する:

'Tensor' object has no attribute 'dot'

dotをmatmulに置き換えたときに同じエラーが発生しました(テンセントフローバックエンドを使用しています)

最後に、ラムダレイヤーを

model.add(Lambda(lambda x: x*A))

私は下のエラーが表示されます。私はKerasに新たなんだので、任意の助けが理解されるであろう

model.add(Lambda(lambda x: x*G))

model.add(Dense(output_shape, activation='softmax'))

AttributeError: 'tuple' object has no attribute '_dims'

。おかげ

答えて

0

ラムダのための関数を作成します:

import keras.backend as K 
import numpy as np 

numpyA = np.array(define A correctly here, with 2 dimensions) 

def multA(x): 
    A = K.variable(numpyA) 

    return K.dot(x,A) 

model.add(Lambda(multA)) 
1

は、私はあなたが最初の重量は行列AことでDense層を追加し、引数trainable=Falseuse_bias=Falseを設定することができると思います。この層は、固定行列乗算と同等である。

model.add(Dense(A.shape[1], trainable=False, weights=[A], use_bias=False)) 
+0

、これは合理的なようだと、私はそれを試してみましたが、次を得る:層重量形状(1、265)に提供重量形状に対応していない(265、 265)。 265はA.shape [1]です(正方行列です) – NSR

+0

'model.summary()'を提供できますか?前のレイヤの出力サイズが1に等しいと思われます。 –

+0

前のレイヤの出力シェイプが '(None、265、1)'の場合、 'Flatten'レイヤを追加することで余分な軸を削除できます。 –