张量流中两个向量的点积

时间:2016-11-18 06:05:36

标签: python tensorflow dot-product

我想知道是否有一种简单的方法来计算两个向量(即1-d张量)的点积并返回张量流中的标量值。

给定两个向量X =(x1,...,xn)和Y =(y1,...,yn),点积是 dot(X,Y)= x1 * y1 + ... + xn * yn

我知道可以通过首先将向量X和Y广播到2-d张量然后使用tf.matmul来实现这一点。但是,结果是一个矩阵,我在标量之后。

是否有像tf.matmul这样的运算符特定于向量?

9 个答案:

答案 0 :(得分:21)

计算两个张量之间的点积(向量是1D张量)的最简单方法之一是使用tf.tensordot

abc-66ttgg

答案 1 :(得分:19)

tf.reduce_sum(tf.multiply(x, y))外,您还可以tf.matmul(x, tf.reshape(y, [-1, 1]))

答案 2 :(得分:12)

你可以使用tf.matmul和tf.transpose

tf.matmul(x,tf.transpose(y))

tf.matmul(tf.transpose(x),y)

取决于x和y的尺寸

答案 3 :(得分:3)

import tensorflow as tf

x = tf.Variable([1, -2, 3], tf.float32, name='x')
y = tf.Variable([-1, 2, -3], tf.float32, name='y')

dot_product = tf.reduce_sum(tf.multiply(x, y))

sess = tf.InteractiveSession()
init_op = tf.global_variables_initializer()
sess.run(init_op)

dot_product.eval()

Out[46]: -14

这里,x和y都是矢量。我们可以做元素明智的产品,然后使用tf.reduce_sum来对结果向量的元素求和。该解决方案易于阅读,无需重新整形。

有趣的是,docs似乎没有内置的点积运算符。

请注意,您可以轻松检查中间步骤:

In [48]: tf.multiply(x, y).eval()
Out[48]: array([-1, -4, -9], dtype=int32)

答案 4 :(得分:1)

你可以做tf.mul(x,y),然后是tf.reduce_sum()

答案 5 :(得分:1)

在较新的版本中(我认为自0.12起),你应该能够做到

tf.einsum('i,i->', x, y)

Before that,似乎不允许/可能减少标量。)

答案 6 :(得分:1)

也许使用新文档,您可以将dot设置的第一个参数或第二个参数的transpose选项设置为true:

tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)

领先:

tf.matmul(a, b, transpose_a=True, transpose_b=False)
tf.matmul(a, b, transpose_a=False, transpose_b=True)

答案 7 :(得分:0)

只需使用*和reduce_sum

ab = tf.reduce_sum(a*b)

举一个简单的例子如下:

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

print(a.get_shape())
print(b.get_shape())

c = a*b
ab = tf.reduce_sum(c)

with tf.Session() as sess:
    print(c.eval())
    print(ab.eval())

# output
# (3,)
# (3,)
# [2 6 12]
# 20

答案 8 :(得分:0)

我们假设您有两个列向量

u = tf.constant([[2.], [3.]])
v = tf.constant([[5.], [7.]])

如果您想要1x1矩阵,可以使用

tf.einsum('ij,ik->jk',x,y)

如果您对标量感兴趣,可以使用

tf.einsum('ij,ik->',x,y)