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

时间:2017-05-03 08:24:50

标签: matrix tensorflow keras keras-layer

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

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

但我并不认为这对Keras来说是一场噩梦。 Keras中的API就像multiply和dot不符合我的要求。我也尝试了不同的方法(Lambda层和TF操作混合)但仍然失败,发生了很多错误。

希望有人可以提供帮助。感谢。

3 个答案:

答案 0 :(得分:3)

实际上你在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的内容。

答案 1 :(得分:1)

您必须拥有一个图层,并在图层内部进行计算。

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)

答案 2 :(得分:0)

您可以使用keras.layers.merge.Multiply()

它将张量列表作为输入,所有张量都相同,并返回单个张量(也是相同的形状)。

The keras documentation

干杯A.