Вычисление косинусного подобия двух наборов векторов в тензорном потоке - PullRequest
0 голосов
/ 23 октября 2018

Здравствуйте, пользователи Stackoverflow,

В настоящее время я борюсь с решением этой проблемы:

У меня 2 2d тензора:

a = Tensor(shape=[600,52]) # 600 vectors of length 52
b = Tensor(shape=[16000,52]) # 1600 vectors of length 52

Япытаясь вычислить косинусное сходство всех комбинаций векторов и сохранить их в третьем тензоре.

similarity = Tensor(shape=[600, 16000])

Теперь у меня следующие вопросы

a) Я не совсем уверен, как реализоватьэто не итеративным способом, я думал об использовании семантики вещания в сочетании с tf.losses.cosine_distance, но я не могу полностью обернуть голову, как это будет на самом деле выглядеть.

b) В зависимости отреализация (если используется tf.losses.cosine_distance, которая требует совпадения размеров для обоих входных тензоров), объем памяти может стать довольно большим, так как потребуется создать два тензора формы [600, 1600, 52] для вычислениярасстояния для всех комбинаций векторов.Не могли бы вы подумать о возможности обойти это?

Я надеюсь, что смог донести свои мысли понятным образом, спасибо за вашу помощь

Best,

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете вычислить это просто так:

import tensorflow as tf

# Vectors
a = tf.placeholder(tf.float32, shape=[600, 52])
b = tf.placeholder(tf.float32, shape=[16000, 52])
# Cosine similarity
similarity = tf.reduce_sum(a[:, tf.newaxis] * b, axis=-1)
# Only necessary if vectors are not normalized
similarity /= tf.norm(a[:, tf.newaxis], axis=-1) * tf.norm(b, axis=-1)
# If you prefer the distance measure
distance = 1 - similarity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...