it-swarm.com.de

Punktprodukt von zwei Vektoren im Tensorflow

Ich habe mich gefragt, ob es einen einfachen Weg gibt, das Punktprodukt von zwei Vektoren (d. H. 1-D-Tensoren) zu berechnen und einen Skalarwert im Tensorfluss zurückzugeben.

Wenn zwei Vektoren X = (x1, ..., xn) und Y = (y1, ..., yn) gegeben sind, lautet das Punktprodukt Punkt (X, Y) = x1 * y1 + ... + xn * yn 

Ich weiß, dass dies möglich ist, indem zuerst die Vektoren X und Y an einen 2-d-Tensor gesendet werden und dann tf.matmul verwendet wird. Das Ergebnis ist jedoch eine Matrix, und ich bin nach einem Skalar.

Gibt es einen für Vektoren spezifischen Operator wie tf.matmul?

22
user6952886

Eine der einfachsten Methoden zur Berechnung des Punktprodukts zwischen zwei Tensoren (Vektor ist 1D-Tensor) ist die Verwendung von 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

Zusätzlich zu tf.reduce_sum(tf.multiply(x, y)) können Sie auch tf.matmul(x, tf.reshape(y, [-1, 1])) ausführen.

17
yuefengz

sie können tf.matmul und tf.transpose verwenden

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

oder 

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

abhängig von den Abmessungen von x und 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

Hier sind x und y beide Vektoren. Wir können elementweise Produkte erstellen und dann mit tf.reduce_sum die Elemente des resultierenden Vektors summieren. Diese Lösung ist leicht zu lesen und muss nicht umgeformt werden.

Interessanterweise scheint es nicht so zu sein, als ob in docs ein integrierter Punktproduktoperator vorhanden ist. 

Beachten Sie, dass Sie leicht Zwischenschritte überprüfen können:

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

In neueren Versionen (ich glaube seit 0.12) sollte man das können

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

( Davor schien die Reduktion auf einen Skalar nicht erlaubt/möglich.)

1
phg

Vielleicht können Sie mit den neuen Dokumenten die Transponierungsoption entweder für das erste Argument des dot-Produkts oder für das zweite Argument auf true setzen:

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)

führend:

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

Sie können tf.mul (x, y) ausführen, gefolgt von tf.reduce_sum ().

1
David Wong

Nehmen wir an, Sie haben zwei Spaltenvektoren

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

Wenn Sie eine 1x1-Matrix benötigen, können Sie diese verwenden

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

Wenn Sie an einem Skalar interessiert sind, können Sie verwenden

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

Verwenden Sie einfach * und verkleinern_sum

ab = tf.reduce_sum(a*b)

Nehmen Sie ein einfaches Beispiel wie folgt:

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