2017-05-03 19 views
2

行列XがX(X^T * X)の共分散行列を返す関数を実装したいだけです。これは単純な行列乗算です。 TensorflowでKerasで行列乗算を実装する方法は?

それがつもりやすいようだ:tf.matmul(X、tf.transpose(X))

しかし、私はそれはKerasと悪夢だと期待していませんでした。 multiplyとdotのようなKerasのAPIは私の要求に合っていません。私はまた、さまざまな方法(ラムダ層とTF操作との混合)を試みましたが、まだ失敗し、多くのエラーが発生しました。

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

答えて

-1

レイヤーが必要で、レイヤー内に計算が必要です。

あなたがkeras.layers.merge.Multiplyを(使用することができます
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

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

The keras documentation

乾杯A.

3

は実際にあなたが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 __name__ == '__main__': 
    x = np.random.rand(4, 5) 
    delta = np.abs(cov_tf(x) - cov_keras(x)).max() 
    print('Maximum absolute difference:', delta) 

最大絶対差が印刷され、私に1e-7の周りに何かを与えています。