具有张量流的三重张量积



假设我有一个矩阵A和两个x,y适当维度的向量。我想计算点积x' * A * y,其中x'表示转置。这应该会产生标量。

Tensorflow中是否有方便的API函数来做到这一点?

(请注意,我使用的是Tensorflow 2(。

使用tf.linalg.tensordot().查看文档

正如您在问题中提到的,您正在尝试查找点积。在这种情况下,tf.matmul()将不起作用,因为它仅适用于度量的交叉乘积。

演示代码片段

import tensorflow as tf
A = tf.constant([[1,4,6],[2,1,5],[3,2,4]])
x = tf.constant([3,2,7])
result = tf.linalg.tensordot(tf.transpose(x), A, axes=1)
result = tf.linalg.tensordot(result, x, axes=1)
print(result)

结果将是

>>>tf.Tensor(532, shape=(), dtype=int32)

我想在这里提及的几点

  1. 不要忘记tf.linalg.tensordot()内部axes论点

  2. 当您创建tf.zeros(5)时,它将创建一个形状为 5 的列表,它就像[0,0,0,0,0],当您转置它时,它将为您提供相同的列表。但是如果你像tf.zeros((5,1))一样创建它,它将是形状(5,1)的向量,结果将是

    [
    [0],[0],[0],[0],[0]
    ]
    

    现在你可以转置它,结果会有所不同,但我建议你做我提到的代码片段。如果是点积,您不必为此烦恼。

如果您仍然面临问题,将非常乐意为您提供帮助。

只需执行以下操作,

import tensorflow as tf
x = tf.constant([1,2])
a = tf.constant([[2,3],[3,4]])
y = tf.constant([2,3])

z = tf.reshape(tf.matmul(tf.matmul(x[tf.newaxis,:], a), y[:, tf.newaxis]),[])
print(z.numpy())

返回

>>> 49

只需像这样使用tf.transpose和乘法运算符:tf.transpose(x)* A * y.

根据您的示例:

x = tf.zeros(5)
A = tf.zeros((5,5))

怎么样

x = tf.expand_dims(x, -1)
tf.matmul(tf.matmul(x, A, transpose_a=True), x)

最新更新