web-dev-qa-db-fra.com

Multiplication efficace d'une matrice et d'un vecteur par élément dans TensorFlow

Quel serait le moyen le plus efficace de multiplier (élément par élément) un tenseur 2D (matrice):

x11 x12 .. x1N
...
xM1 xM2 .. xMN

par un vecteur vertical:

w1
...
wN

pour obtenir une nouvelle matrice:

x11*w1 x12*w2 ... x1N*wN
...
xM1*w1 xM2*w2 ... xMN*wN

Pour donner un peu de contexte, nous avons M échantillons de données dans un lot qui peut être traité en parallèle, et chaque échantillon de N- élément doit être multiplié par des poids w stockés dans un fichier. variable pour éventuellement choisir le plus grand Xij*wj pour chaque ligne i.

32
Andrzej Pronobis

Le code le plus simple à faire repose sur le comportement de diffusion de tf.multiply()*, qui est basé sur comportement de numpy en matière de diffusion :

x = tf.constant(5.0, shape=[5, 6])
w = tf.constant([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
xw = tf.multiply(x, w)
max_in_rows = tf.reduce_max(xw, 1)

sess = tf.Session()
print sess.run(xw)
# ==> [[0.0, 5.0, 10.0, 15.0, 20.0, 25.0],
#      [0.0, 5.0, 10.0, 15.0, 20.0, 25.0],
#      [0.0, 5.0, 10.0, 15.0, 20.0, 25.0],
#      [0.0, 5.0, 10.0, 15.0, 20.0, 25.0],
#      [0.0, 5.0, 10.0, 15.0, 20.0, 25.0]]

print sess.run(max_in_rows)
# ==> [25.0, 25.0, 25.0, 25.0, 25.0]

* Dans les anciennes versions de TensorFlow, tf.multiply() était appelé tf.mul(). Vous pouvez également utiliser l'opérateur * (C'est-à-dire xw = x * w) Pour effectuer la même opération.

41
mrry