Je veux calculer la distance entre tous les éléments du tenseur1 et du tenseur2. le tenseur 1 et le tenseur 2 sont de tailles différentes. Existe-t-il également une méthode pour cela, quelle est la manière la plus efficace de procéder?

tensor1   tensor2
[1 2 3]   [11 12]
[4 5 6]   [13 14]
[7 8 9]   [15 16]

Je veux trouver la distance entre tensor1 [0,0] et tous les éléments de tensor2, et la même chose pour tous les indices.

1
MasterWizard 15 mars 2019 à 12:37

2 réponses

Meilleure réponse

Je pense que cela fait ce que vous voulez:

import tensorflow as tf

def all_distances(a, b):
    dists = tf.expand_dims(tf.reshape(a, [-1]), 1) - tf.reshape(b, [-1])
    return tf.reshape(dists, tf.concat([tf.shape(a), tf.shape(b)], axis=0))

with tf.Graph().as_default(), tf.Session() as sess:
    a = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    b = tf.constant([[11, 12], [13, 14], [15, 16]])
    dists = all_distances(a, b)
    print(sess.run(dists))

Production:

[[[[-10 -11]
   [-12 -13]
   [-14 -15]]

  [[ -9 -10]
   [-11 -12]
   [-13 -14]]

  [[ -8  -9]
   [-10 -11]
   [-12 -13]]]


 [[[ -7  -8]
   [ -9 -10]
   [-11 -12]]

  [[ -6  -7]
   [ -8  -9]
   [-10 -11]]

  [[ -5  -6]
   [ -7  -8]
   [ -9 -10]]]


 [[[ -4  -5]
   [ -6  -7]
   [ -8  -9]]

  [[ -3  -4]
   [ -5  -6]
   [ -7  -8]]

  [[ -2  -3]
   [ -4  -5]
   [ -6  -7]]]]

Le résultat est un tenseur tel que dists[i1, .., in, j1, .., jm] est a[i1, .., in] - b[j1, .., jm], avec n et m étant le nombre de dimensions de a et b respectivement.

1
jdehesa 15 mars 2019 à 10:14

Vous pouvez également utiliser tf.meshgrid pour y parvenir.

import tensorflow as tf
import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[11,12],[13,14],[15,16]])

a_tf = tf.placeholder(shape=(None,None),dtype=tf.float32)
b_tf = tf.placeholder(shape=(None,None),dtype=tf.float32)

A,B = tf.meshgrid(a_tf,b_tf)
result = tf.transpose(A-B) # two dimension
result = tf.reshape(result,shape=(-1,tf.shape(b_tf)[0],tf.shape(b_tf)[1]))  # three dimension

with tf.Session() as sess:
    print(sess.run(result, feed_dict={a_tf: a, b_tf: b}))

[[[-10. -11.]
  [-12. -13.]
  [-14. -15.]]

 [[ -9. -10.]
  [-11. -12.]
  [-13. -14.]]

 [[ -8.  -9.]
  [-10. -11.]
  [-12. -13.]]

 [[ -7.  -8.]
  [ -9. -10.]
  [-11. -12.]]

 [[ -6.  -7.]
  [ -8.  -9.]
  [-10. -11.]]

 [[ -5.  -6.]
  [ -7.  -8.]
  [ -9. -10.]]

 [[ -4.  -5.]
  [ -6.  -7.]
  [ -8.  -9.]]

 [[ -3.  -4.]
  [ -5.  -6.]
  [ -7.  -8.]]

 [[ -2.  -3.]
  [ -4.  -5.]
  [ -6.  -7.]]]
0
giser_yugang 15 mars 2019 à 10:21