Я хочу вычислить парное квадратное расстояние партии функции в Tensorflow. У меня простая реализация с использованием операций + и * разбив исходный тензор:
def pairwise_l2_norm2(x, y, scope=None):
with tf.op_scope([x, y], scope, 'pairwise_l2_norm2'):
size_x = tf.shape(x)[0]
size_y = tf.shape(y)[0]
xx = tf.expand_dims(x, -1)
xx = tf.tile(xx, tf.pack([1, 1, size_y]))
yy = tf.expand_dims(y, -1)
yy = tf.tile(yy, tf.pack([1, 1, size_x]))
yy = tf.transpose(yy, perm=[2, 1, 0])
diff = tf.sub(xx, yy)
square_diff = tf.square(diff)
square_dist = tf.reduce_sum(square_diff, 1)
return square_dist
Эта функция принимает в качестве входных данных две матрицы размера (m, d) и (n, d) и вычисляет квадрат расстояния между каждым вектором строки. Вывод представляет собой матрицу размера (m, n) с элементом 'd_ij = dist (x_i, y_j)'.
Проблема в том, что у меня есть большие пакетные и сильно тусклые функции. Репликация тензора m, n, d 'потребляет много памяти. Я ищу другой способ реализовать это без увеличения использования памяти и просто сохранить только конечный тензор расстояния. Вид двойной петли исходного тензора.