Вычисление расстояния между 2 тензорами всех элементов

#python #tensorflow

#python #tensorflow

Вопрос:

Я хочу вычислить расстояние между всеми элементами тензора1 и тензора2. тензор1 и тензор 2 имеют разные размеры. Существует ли существующий метод для этого, также, какой наиболее эффективный способ сделать это?

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

Я хочу найти расстояние между тензором 1 [0,0] и всеми элементами тензора 2, и одинаковое для всех индексов.

Комментарии:

1. Какой результат вы ожидаете? Можете ли вы привести пример?

2. Разве тензоры не должны быть трехмерными? Ваши выглядят как матрицы

3. [[dist(1,11),dist(1,12), dist (1,13), dist (1,14), dist (1,15), dist(1,16)], [dist (2,11), dist(2,12), dist(2,3), dist (2,14), dist(2,15), dist(2,16)],….]

4. @Albert да, я просто демонстрирую идею, естественно, они будут трехмерными…

Ответ №1:

Я думаю, это делает то, что вы хотите:

 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))
  

Вывод:

 [[[[-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]]]]
  

Результатом является такой тензор, который dists[i1, .., in, j1, .., jm] равен a[i1, .., in] - b[j1, .., jm] , где n и m являются числом измерений a и b соответственно.

Ответ №2:

Вы также можете использовать tf.meshgrid для достижения этого.

 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.]]]