我想知道在tensorflow中是否有一种简单的方法来计算两个向量(即1-d张量)的点积并返回一个标量值。
假设有两个向量X=(x1,...,xn)和Y=(y1,...,yn),它们的点积是 dot(X,Y) = x1 * y1 + ... + xn * yn
我知道可以通过将向量X和Y广播到一个2-d张量,然后使用tf.matmul来实现这一点。但是,结果是一个矩阵,而我需要的是一个标量。
是否有类似于tf.matmul的特定于向量的运算符?
我想知道在tensorflow中是否有一种简单的方法来计算两个向量(即1-d张量)的点积并返回一个标量值。
假设有两个向量X=(x1,...,xn)和Y=(y1,...,yn),它们的点积是 dot(X,Y) = x1 * y1 + ... + xn * yn
我知道可以通过将向量X和Y广播到一个2-d张量,然后使用tf.matmul来实现这一点。但是,结果是一个矩阵,而我需要的是一个标量。
是否有类似于tf.matmul的特定于向量的运算符?
计算两个张量的点积(向量是1D张量)最简单的方法之一是使用tf.tensordot
函数。
a = tf.placeholder(tf.float32, shape=(5))
b = tf.placeholder(tf.float32, shape=(5))
dot_a_b = tf.tensordot(a, b, 1)
with tf.Session() as sess:
print(dot_a_b.eval(feed_dict={a: [1, 2, 3, 4, 5], b: [6, 7, 8, 9, 10]}))
# results: 130.0
tf.reduce_sum(tf.multiply(x, y))
,你还可以使用tf.matmul(x, tf.reshape(y, [-1, 1]))
。您可以使用tf.matmul和tf.transpose。
tf.matmul(x,tf.transpose(y))
或者tf.matmul(tf.transpose(x),y)
根据x和y的尺寸而定
matmul
可以帮你进行转置:例如,tf.matmul(a, b, transpose_a=True, transpose_b=False)
,当然你也可以转置 b。 - Charlie Parkerimport 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
In [48]: tf.multiply(x, y).eval()
Out[48]: array([-1, -4, -9], dtype=int32)
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
u = tf.constant([[2.], [3.]])
v = tf.constant([[5.], [7.]])
tf.einsum('ij,ik->jk',x,y)
tf.einsum('ij,ik->',x,y)
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)
如果您想要两个向量的点积,请使用tf.reduce_sum(tf.multiply(x,y))。
需要明确的是,即使您在之后将矩阵的所有元素相加,使用tf.matmul(x,tf.transpose(y))也无法获得点积。
我之所以提到这一点,是因为在上面的答案中经常出现这种情况,而它与所提问的问题无关。我只是想发表评论,但没有足够的声望来这样做。
(1234,)
的向量,则以下是唯一正确的答案。 - ihadanny