Matrix 如何在Keras中实现矩阵乘法?

Matrix 如何在Keras中实现矩阵乘法?,matrix,tensorflow,keras,keras-layer,Matrix,Tensorflow,Keras,Keras Layer,我只想实现一个函数,给定一个矩阵X,它返回X的协方差矩阵(X^T*X),这只是一个简单的矩阵乘法 在Tensorflow中很容易:tf.matmul(X,tf.transpose(X)) 但我没想到这对凯拉斯来说是一场噩梦。Keras中的api如multiply和dot不符合我的要求。我也尝试了不同的方法(Lambda层和混合TF操作),但仍然失败,出现了很多错误 希望有人能帮忙。谢谢。您必须有一个层,层内进行计算 import keras.backend as K from keras.lay

我只想实现一个函数,给定一个矩阵X,它返回X的协方差矩阵(X^T*X),这只是一个简单的矩阵乘法

在Tensorflow中很容易:tf.matmul(X,tf.transpose(X))

但我没想到这对凯拉斯来说是一场噩梦。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中也有类似的例子。尝试
点(x,转置(x))

下面是一个比较两个平台的工作示例

将keras.backend导入为K
将numpy作为np导入
导入tensorflow作为tf
def cov_tf(x_val):
x=tf.常数(x_val)
cov=tf.matmul(x,tf.transpose(x))
返回cov.eval(session=tf.session())
def cov_keras(x_val):
x=K.常数(x_val)
cov=K.dot(x,K.transpose(x))
返回cov.eval(session=tf.session())
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
x=np.random.rand(4,5)
delta=np.abs(cov_tf(x)-cov_keras(x)).max()
打印('最大绝对差值:',增量)

最大绝对差是打印出来的,给了我一些关于
1e-7

的信息,这是元素乘法,而不是矩阵乘法。我认为keras.layers.Dot()做点积/矩阵乘法谢谢这个答案。仍然不喜欢使用Lambda,但您绝对正确--->“您必须有一个层”才能使您的输出在模型中有用。是的,但您建议的解决方案不会保存到文件中,即您将无法使用keras.model.save序列化模型。虽然keras.Model.save_如果不需要保存整个模型,权重可能会起作用。使用keras.layers.dot,而不是使用后端产品制作lamda层。它确实可以保存和加载。但是今天我推荐
tf.matmul
,它的工作原理更容易理解。如果目标是将矩阵产品作为模型的一个层来执行,那么您不应该使用后端。keras.backend只会将操作引用到后端框架,这会在保存模型时导致问题。相反,您应该使用keras.layers.dot,它专门用于在模型层中执行张量积。嗨,@grovina,我是TensorFlow的新手。我对上面的后端设置很好奇。您已经显式导入了TensorFlow。那么为什么你需要同时
将keras.backend导入为K
。你也许可以在TF中用Keras的方式来做。