如何在 Keras 中实现矩阵乘法?
How to implement a matrix multiplication in Keras?
我只想实现一个给定矩阵 X returns X 的协方差矩阵 (X^T*X) 的函数,这只是一个简单的矩阵乘法。
在 Tensorflow 中这很容易:tf.matmul(X, tf.transpose(X))
但我没想到这是Keras的噩梦。 Keras 中的 multiply 和 dot 等 API 不符合我的要求。我也尝试了不同的方式(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()
它将一个张量列表作为输入,所有张量的形状都相同,returns一个张量(也具有相同的形状)。
干杯 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
。
我只想实现一个给定矩阵 X returns X 的协方差矩阵 (X^T*X) 的函数,这只是一个简单的矩阵乘法。
在 Tensorflow 中这很容易:tf.matmul(X, tf.transpose(X))
但我没想到这是Keras的噩梦。 Keras 中的 multiply 和 dot 等 API 不符合我的要求。我也尝试了不同的方式(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()
它将一个张量列表作为输入,所有张量的形状都相同,returns一个张量(也具有相同的形状)。
干杯 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
。