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