行列Xが与えられると、Xの共分散行列(X ^ T * X)を返す関数を実装したいだけです。これは単純な行列の乗算です。
Tensorflowでは簡単になります:tf.matmul(X、tf.transpose(X))
しかし、それがKerasの悪夢だとは思っていませんでした。乗算やドットなどのKerasのAPIは、私の要求に適合しません。また、さまざまな方法(LambdaレイヤーとTF操作の混合)を試しましたが、それでも失敗し、多くのエラーが発生しました。
誰かが助けてくれることを願っています。ありがとう。
実際、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
の周りに何かが表示されます。
レイヤーが必要です。レイヤー内で計算を行います。
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)
Keras.layers.merge.Multiply()を使用できます
すべて同じ形状のテンソルのリストを入力として受け取り、単一のテンソル(これも同じ形状)を返します。
乾杯A。