2017-02-14 6 views
2

У меня есть два tensorflow объектов следующегоtensorflow: Как вычислить разницу L1 между партией (матрица размера B X DIM) и лексикой (матрица размера V X DIM)?

batch = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3,2], name='batch') 
vocab = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0,1.0,2.0,3.0,4.0,5.0,6.0], shape=[6,2], name='vocab') 

партии имеет 3 векторов, каждый из 2-й измерений. vocab имеет 6 векторов, каждый из которых имеет 2 измерения. Я хочу вычислить разницу L1 между всеми возможными парами векторов (генерируя 18 значений). , например. L1 [1,2] будет

|1-1|+|2-2|, |1-3|+|2-4|, |1-5|+|2-6|, |1-1|+|2-2|, |1-3|+|2-4|, |1-5|+|2-6|, 

Как это сделать с помощью функций тензорного потока? Результирующая матрица может быть 6 X 3 (партия X vocab). Матричным умножением, по-видимому, является вычисление, которое будет генерировать ожидаемый порядок матрицы. Но есть ли способ переопределить основную операцию умножения матрицы? (т. е. переопределения компонентного умножения с абсолютным значением разности)?

+0

Это может быть тема, связанная с трансляцией (например, в numpy). Вы можете проверить это: https://www.tensorflow.org/versions/r1.0/experimental/xla/broadcasting. Я еще не пробовал это (вы заметите, что это экспериментально). – 0Tech

+0

Вы использовали 'tf.matmul' вместо' * '(что делает продукт Schur, как вы упомянули)? – drpng

+0

@drpng, спасибо. Я попробовал, но это не сработало. – Trojosh

ответ

2

Возможно, этот ответ вам больше не подходит, но я недавно натолкнулся на этот пример k-nearest neighbors с расстоянием L1 и L2. Итак, я думаю, ваша проблема может быть решена как:

batch = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3,2], name='batch') 
vocab = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0,1.0,2.0,3.0,4.0,5.0,6.0], shape=[6,2], name='vocab') 
distance_L1 = tf.reduce_sum(tf.abs(tf.subtract(vocab, tf.expand_dims(batch,1))), axis=2) 

Удачи!

Смежные вопросы