Tensorflowで一組のフィーチャのペアごとの二乗距離を計算したいとします。私は、元のテンソルをタイル によって+及び*操作を使用して単純な実装を持っている: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)との間の二乗距離を計算します各行ベクトル。出力は、要素 'd_ij = dist(x_i、y_j)'を持つサイズ(m、n)の行列です。
問題は、テンソルを複製することで、大量のメモリを消費する大きなバッチと高いディム機能を持つことです。 私はメモリ使用量を増やすことなくこれを実装する別の方法を探していて、最後の距離のテンソルだけを保存します。元のテンソルの二重ループの種類。
コードが「機能のバッチのペアワイズ距離」を実行していることは明らかではありません。より正式にやりたい機能を指定できますか?また、あなたは[tf.squared_difference](https://www.tensorflow.org/versions/r0.8/api_docs/python/math_ops.html#squared_difference)を考慮しました – keveman
私はこれを説明するために質問を更新します。この機能の入力としてフィーチャーのバッチを配置すると、その行の間の距離を計算する必要があります。 – jrabary