【发布时间】:2020-01-03 16:42:59
【问题描述】:
假设我有一个矩阵A 和两个向量x,y,尺寸合适。我想计算点积x' * A * y,其中x' 表示转置。这应该产生一个标量。
Tensorflow 中是否有方便的 API 函数来执行此操作?
(请注意,我使用的是 Tensorflow 2)。
【问题讨论】:
标签: tensorflow linear-algebra tensorflow2.0
假设我有一个矩阵A 和两个向量x,y,尺寸合适。我想计算点积x' * A * y,其中x' 表示转置。这应该产生一个标量。
Tensorflow 中是否有方便的 API 函数来执行此操作?
(请注意,我使用的是 Tensorflow 2)。
【问题讨论】:
标签: tensorflow linear-algebra tensorflow2.0
使用 tf.linalg.tensordot()。 See the documentation
正如您在问题中提到的那样,您正在尝试查找点积。在这种情况下,tf.matmul() 将不起作用,因为它仅用于度量的叉积。
演示代码sn-p
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)
我想在这里提几点
不要忘记 tf.linalg.tensordot() 中的 axes 参数
当你创建tf.zeros(5) 时,它会创建一个形状为 5 的列表,它就像[0,0,0,0,0],当你转置它时,它会给你相同的列表。但是如果你像tf.zeros((5,1)) 那样创建它,它将是一个形状为(5,1) 的向量,结果将是
[
[0],[0],[0],[0],[0]
]
现在你可以转置它,结果会有所不同,但我建议你做我提到的代码 sn-p。如果是点积,您不必为此烦恼太多。
如果您仍然面临问题,将非常乐意为您提供帮助。
【讨论】:
transpose 调用在 tf.linalg.tensordot(tf.transpose(x), A, axes=1) 中是不必要的(正如您稍后在帖子中解释的那样)。
只需执行以下操作,
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)); tf.transpose(x) * A * x,它返回一个矩阵而不是一个标量。
根据您的示例:
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)
【讨论】: