Calculer les paires de distance en un lot, sans les reproduire tenseur dans Tensorflow?

Je veux calculer les combinaisons carré de la distance d'un lot de fonctionnalité dans Tensorflow. J'ai une simple mise en œuvre à l'aide de + et * les opérations par
carrelage du tenseur d'origine :

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

Cette fonction prend en entrée deux matrices de taille (m,d) et (n,d), et de calculer la distance au carré entre chaque vecteur ligne. La sortie est une matrice de taille (m,n) avec élément " d_ij = dist(x_i, y_j)'.

Le problème est que j'ai un gros lot et de la haute dim fonctions "m, n, d' reproduisant le tenseur de consommer beaucoup de mémoire.
Je suis à la recherche d'une autre façon de mettre en œuvre ce sans augmentation de l'utilisation de la mémoire et juste que le magasin de la distance finale tenseur. Sorte de double boucle du tenseur d'origine.

  • Il n'est pas évident que votre code est en train de faire 'par paires distance d'un lot de la fonctionnalité". Pouvez-vous préciser la fonction que vous voulez le faire de façon plus formelle? Aussi, avez-vous considéré tf.squared_difference
  • - Je mettre à jour la question de l'expliquer. Si vous mettez un lot de fonctionnalités que l'entrée de cette fonction, il faut calculer la distance entre ses lignes.
InformationsquelleAutor jrabary | 2016-05-03