python - Producto puntual de dos vectores en tensorflow.
dot-product (10)
Solo usa * y reduce_sum
ab = tf.reduce_sum(a*b)
Tome un ejemplo simple de la siguiente manera:
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
Me preguntaba si hay una manera fácil de calcular el producto de punto de dos vectores (es decir, tensores 1-d) y devolver un valor escalar en tensorflow.
Dado dos vectores X = (x1, ..., xn) e Y = (y1, ..., yn), el producto punto es un punto (X, Y) = x1 * y1 + ... + xn * yn
Sé que es posible lograr esto transmitiendo primero los vectores X e Y a un tensor 2-d y luego usando tf.matmul. Sin embargo, el resultado es una matriz, y estoy después de un escalar.
¿Hay un operador como tf.matmul que sea específico de vectores?
Además de tf.reduce_sum(tf.multiply(x, y))
, también puede hacer tf.matmul(x, tf.reshape(y, [-1, 1]))
.
En las versiones más nuevas (creo que desde 0.12), deberías poder hacer
tf.einsum(''i,i->'', x, y)
( Antes de eso , la reducción a un escalar parecía no ser permitida / posible).
Puedes hacer tf.mul (x, y), seguido de tf.reduce_sum ()
Supongamos que tiene dos vectores de columna
u = tf.constant([[2.], [3.]])
v = tf.constant([[5.], [7.]])
Si quieres una matriz 1x1 puedes usar
tf.einsum(''ij,ik->jk'',x,y)
Si estás interesado en un escalar puedes usar
tf.einsum(''ij,ik->'',x,y)
Tal vez con los nuevos documentos, simplemente puede establecer la opción de transposición en true para el primer argumento del producto de puntos o el segundo argumento:
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)
líder:
tf.matmul(a, b, transpose_a=True, transpose_b=False)
tf.matmul(a, b, transpose_a=False, transpose_b=True)
puedes usar tf.matmul y tf.transpose
tf.matmul(x,tf.transpose(y))
o
tf.matmul(tf.transpose(x),y)
Dependiendo de las dimensiones de x y y
Una de las formas más fáciles de calcular el producto de punto entre dos tensores (el vector es el tensor 1D) es usar 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
#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 ;)
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
Aquí, xey son ambos vectores. Podemos hacer un producto inteligente y luego usar tf.reduce_sum para sumar los elementos del vector resultante. Esta solución es fácil de leer y no requiere remodelación.
Curiosamente, no parece que haya un operador de producto de punto integrado en los docs .
Tenga en cuenta que puede verificar fácilmente los pasos intermedios:
In [48]: tf.multiply(x, y).eval()
Out[48]: array([-1, -4, -9], dtype=int32)