Точечный продукт двух векторов в тензорном потоке
Мне было интересно, есть ли простой способ рассчитать произведение точек двух векторов (т.е. 1-d-тензоры) и вернуть скалярное значение в тензорном потоке.
Учитывая два вектора X = (x1,..., xn) и Y = (y1,..., yn), точечное произведение
точка (X, Y) = x1 * y1 +... + xn * yn
Я знаю, что это можно достичь, сначала передав векторы X и Y в 2-й тензор, а затем используя tf.matmul. Однако результат - это матрица, а я - после скаляра.
Существует ли такой оператор, как tf.matmul, который специфичен для векторов?
Ответы
Ответ 1
Один из самых простых способов вычислить скалярное произведение между двумя тензорами (вектор является 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
Ответ 2
В дополнение к tf.reduce_sum(tf.multiply(x, y))
вы также можете сделать tf.matmul(x, tf.reshape(y, [-1, 1]))
.
Ответ 3
вы можете использовать tf.matmul и tf.transpose
tf.matmul(x,tf.transpose(y))
или
tf.matmul(tf.transpose(x),y)
в зависимости от размеров x и y
Ответ 4
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)
Ответ 5
Вы можете сделать tf.mul(x, y), а затем tf.reduce_sum()
Ответ 6
В более новых версиях (я думаю, начиная с 0.12) вы должны иметь возможность делать
tf.einsum('i,i->', x, y)
(До этого, сокращение до скаляра казалось недопустимым/возможным.)
Ответ 7
Возможно, с новыми документами вы можете просто установить для параметра транспонирования значение 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)
Ответ 8
Просто используйте * и 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
Ответ 9
Предположим, что у вас есть два вектора столбца
u = tf.constant([[2.], [3.]])
v = tf.constant([[5.], [7.]])
Если вам нужна матрица 1x1, вы можете использовать
tf.einsum('ij,ik->jk',x,y)
Если вас интересует скаляр, вы можете использовать
tf.einsum('ij,ik->',x,y)
Ответ 10
#You have to import numpy and the vectors should be written as python arrays
import numpy as np
# construct two vectors a and b a =(1,2), b=(3,4)
a = np.array([1, 2])
b = np.array([3, 4])
#calculate the dot product
np.dot(a, b)
# as simple as that ;)