web-dev-qa-db-fra.com

Produit scalaire de deux vecteurs en tensorflow

Je me demandais s’il existait un moyen facile de calculer le produit scalaire de deux vecteurs (c’est-à-dire des tenseurs 1D) et de renvoyer une valeur scalaire en tensorflow.

Étant donné deux vecteurs X = (x1, ..., xn) et Y = (y1, ..., yn), le produit scalaire est Point (X, Y) = x1 * y1 + ... + xn * yn 

Je sais qu'il est possible d'y parvenir en diffusant d'abord les vecteurs X et Y à un tenseur 2D, puis en utilisant tf.matmul. Cependant, le résultat est une matrice, et je suis après un scalaire.

Existe-t-il un opérateur comme tf.matmul spécifique aux vecteurs?

22
user6952886

L’un des moyens les plus simples de calculer le produit scalaire entre deux tenseurs (le vecteur est 1D) consiste à utiliser 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
20
Ishant Mrinal

En plus de tf.reduce_sum(tf.multiply(x, y)), vous pouvez également effectuer tf.matmul(x, tf.reshape(y, [-1, 1])).

17
yuefengz

vous pouvez utiliser tf.matmul et tf.transpose

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

ou 

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

en fonction des dimensions de x et y

10
aarbelle
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

Ici, x et y sont tous deux des vecteurs. Nous pouvons faire produit par élément, puis utiliser tf.reduce_sum pour additionner les éléments du vecteur résultant. Cette solution est facile à lire et ne nécessite pas de refaçonnage.

Fait intéressant, il ne semble pas qu'il y ait un opérateur de produit scalaire intégré dans docs

Notez que vous pouvez facilement vérifier les étapes intermédiaires:

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

Dans les nouvelles versions (je pense depuis 0.12), vous devriez pouvoir faire

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

( Avant cela , la réduction à un scalaire semblait interdite/possible.)

1
phg

Peut-être qu'avec les nouveaux documents, vous pouvez simplement définir l'option transpose sur true pour le premier argument du produit scalaire ou le second argument:

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)

de premier plan:

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

Vous pouvez faire tf.mul (x, y), suivi de tf.reduce_sum ()

1
David Wong

Supposons que vous avez deux vecteurs de colonne

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

Si vous voulez une matrice 1x1, vous pouvez utiliser

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

Si vous êtes intéressé par un scalaire, vous pouvez utiliser

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

Il suffit d'utiliser * et réduire_sum

ab = tf.reduce_sum(a*b)

Prenons un exemple simple comme suit:

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
0
罗福莉