Paarweise Distanz in einer Charge berechnen, ohne Tensor in Tensorflow zu replizieren?

Ich möchte den paarweisen quadratischen Abstand eines Merkmalsstapels in Tensorflow berechnen. Ich habe eine einfache Implementierung mit + und * Operationen durch Kacheln des ursprünglichen Tensors:

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

Diese Funktion verwendet als Eingabe zwei Matrizen der Größe (m, d) und (n, d) und berechnet den quadratischen Abstand zwischen den einzelnen Zeilenvektoren. Die Ausgabe ist eine Matrix der Größe (m, n) mit dem Element 'd_ij = dist (x_i, y_j)'.

Das Problem ist, dass ich eine große Charge und hochdimmbare Features habe, die den Tensor replizieren und viel Speicher verbrauchen. Ich suche nach einer anderen Möglichkeit, dies zu implementieren, ohne die Speichernutzung zu erhöhen und nur den endgültigen Abstandstensor zu speichern. Art der Doppelschleife des ursprünglichen Tensors.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage