web-dev-qa-db-ja.com

Kerasで行列乗算を実装する方法は?

行列Xが与えられると、Xの共分散行列(X ^ T * X)を返す関数を実装したいだけです。これは単純な行列の乗算です。

Tensorflowでは簡単になります:tf.matmul(X、tf.transpose(X))

しかし、それがKerasの悪夢だとは思っていませんでした。乗算やドットなどのKerasのAPIは、私の要求に適合しません。また、さまざまな方法(LambdaレイヤーとTF操作の混合)を試しましたが、それでも失敗し、多くのエラーが発生しました。

誰かが助けてくれることを願っています。ありがとう。

8
Rui Meng

実際、Kerasには類似のものがあります。 dot(x, transpose(x))を試してください。

2つのプラットフォームを比較する実際の例を次に示します。

import keras.backend as K
import numpy as np
import tensorflow as tf


def cov_tf(x_val):
    x = tf.constant(x_val)
    cov = tf.matmul(x, tf.transpose(x))
    return cov.eval(session=tf.Session())

def cov_keras(x_val):
    x = K.constant(x_val)
    cov = K.dot(x, K.transpose(x))
    return cov.eval(session=tf.Session())

if __== '__main__':
    x = np.random.Rand(4, 5)
    delta = np.abs(cov_tf(x) - cov_keras(x)).max()
    print('Maximum absolute difference:', delta)

最大絶対差が出力され、1e-7の周りに何かが表示されます。

3
grovina

レイヤーが必要です。レイヤー内で計算を行います。

import keras.backend as K
from keras.layers import Lambda
from keras.models import Model

inp = Input((your input shape))
previousLayerOutput = SomeLayerBeforeTheCovariance(blabla)(inp)    

covar = Lambda(lambda x: K.dot(K.transpose(x),x), 
    output_shape = (your known shape of x))(previousLayerOutput)

nextOut = SomeOtherLayerAfterThat(blablabla)(covar)
lastOut = AnotherLayer(bahblanba)(nextOut)

model = Model(inp, lastOut)
1
Daniel Möller

Keras.layers.merge.Multiply()を使用できます

すべて同じ形状のテンソルのリストを入力として受け取り、単一のテンソル(これも同じ形状)を返します。

kerasドキュメント

乾杯A。

0
anthdm