我想知道是否有一种简单的方法来计算两个向量(即1-d张量)的点积并返回张量流中的标量值。
给定两个向量X =(x1,...,xn)和Y =(y1,...,yn),点积是 dot(X,Y)= x1 * y1 + ... + xn * yn
我知道可以通过首先将向量X和Y广播到2-d张量然后使用tf.matmul来实现这一点。但是,结果是一个矩阵,我在标量之后。
是否有像tf.matmul这样的运算符特定于向量?
答案 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)
答案 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)
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)