我只是想實現一個函數,給定一個矩陣X返回X(X^T * X)的協方差矩陣,這只是一個簡單的矩陣乘法。如何在Keras中實現矩陣乘法?
在Tensorflow這會是容易的:tf.matmul(X,tf.transpose(X))
但我沒想到的是它與Keras一場噩夢。 Keras中的API像multiply和dot不符合我的要求。我也嘗試了不同的方式(Lambda層和混合TF操作)但仍然失敗,發生了很多錯誤。
希望有人可以幫忙。謝謝。
我只是想實現一個函數,給定一個矩陣X返回X(X^T * X)的協方差矩陣,這只是一個簡單的矩陣乘法。如何在Keras中實現矩陣乘法?
在Tensorflow這會是容易的:tf.matmul(X,tf.transpose(X))
但我沒想到的是它與Keras一場噩夢。 Keras中的API像multiply和dot不符合我的要求。我也嘗試了不同的方式(Lambda層和混合TF操作)但仍然失敗,發生了很多錯誤。
希望有人可以幫忙。謝謝。
您必須有一個圖層,並在圖層內進行計算。
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.
其實你有Keras類似。嘗試dot(x, transpose(x))
。
下面是一個比較兩個平臺的工作示例。
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
左右的內容。