Tensorflow 的三重张量积
Triple tensor product with Tensorflow
假设我有一个矩阵 A
和两个适当维度的向量 x,y
。我想计算点积 x' * A * y
,其中 x'
表示转置。这应该会产生一个标量。
Tensorflow 中有方便的 API 函数可以做到这一点吗?
(请注意,我使用的是 Tensorflow 2)。
只需使用 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)
只需执行以下操作,
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())
Returns
>>> 49
使用tf.linalg.tensordot()
。 See the documentation
正如您在问题中提到的,您正在尝试查找点积。在这种情况下 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)
我想在这里提几点
别忘了axes
里面的参数tf.linalg.tensordot()
当您创建 tf.zeros(5)
时,它会创建一个形状为 5 的列表,它会像 [0,0,0,0,0]
,当您转置它时,它会为您提供相同的列表。但是如果你像 tf.zeros((5,1))
这样创建它,它将是一个形状为 (5,1)
的向量,结果将是
[
[0],[0],[0],[0],[0]
]
现在你可以转置这个,结果会不同,但我建议你做我提到的代码片段。如果是点积,你不必为此操心。
如果您仍然遇到问题,我们将非常乐意为您提供帮助。
假设我有一个矩阵 A
和两个适当维度的向量 x,y
。我想计算点积 x' * A * y
,其中 x'
表示转置。这应该会产生一个标量。
Tensorflow 中有方便的 API 函数可以做到这一点吗?
(请注意,我使用的是 Tensorflow 2)。
只需使用 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)
只需执行以下操作,
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())
Returns
>>> 49
使用tf.linalg.tensordot()
。 See the documentation
正如您在问题中提到的,您正在尝试查找点积。在这种情况下 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)
我想在这里提几点
别忘了
axes
里面的参数tf.linalg.tensordot()
当您创建
tf.zeros(5)
时,它会创建一个形状为 5 的列表,它会像[0,0,0,0,0]
,当您转置它时,它会为您提供相同的列表。但是如果你像tf.zeros((5,1))
这样创建它,它将是一个形状为(5,1)
的向量,结果将是[ [0],[0],[0],[0],[0] ]
现在你可以转置这个,结果会不同,但我建议你做我提到的代码片段。如果是点积,你不必为此操心。
如果您仍然遇到问题,我们将非常乐意为您提供帮助。