¿Cómo calcular la similitud coseno entre dos tensores?

Tengo dos tensores normalizados y necesito calcular la similitud del coseno entre estos tensores. ¿Cómo lo hago con TensorFlow?

cosine(normalize_a,normalize_b) a = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_a") b = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_b") normalize_a = tf.nn.l2_normalize(a,0) normalize_b = tf.nn.l2_normalize(b,0) 

Esto hará el trabajo:

 a = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_a") b = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_b") normalize_a = tf.nn.l2_normalize(a,0) normalize_b = tf.nn.l2_normalize(b,0) cos_similarity=tf.reduce_sum(tf.multiply(normalize_a,normalize_b)) sess=tf.Session() cos_sim=sess.run(cos_similarity,feed_dict={a:[1,2,3],b:[2,4,6]}) 

Esto imprime 0.99999988

Los tiempos cambian. Con la última API de TF, esto puede calcularse llamando a tf.losses.cosine_distance .

Ejemplo:

 import tensorflow as tf import numpy as np x = tf.constant(np.random.uniform(-1, 1, 10)) y = tf.constant(np.random.uniform(-1, 1, 10)) s = tf.losses.cosine_distance(tf.nn.l2_normalize(x, 0), tf.nn.l2_normalize(y, 0), dim=0) print(tf.Session().run(s)) 

Por supuesto, 1 - s es la similitud del coseno!

Puedes normalizar tu vector o matriz así:

 [batch_size*hidden_num] states_norm=tf.nn.l2_normalize(states,dim=1) [batch_size * embedding_dims] embedding_norm=tf.nn.l2_normalize(embedding,dim=1) #assert hidden_num == embbeding_dims after mat [batch_size*embedding] user_app_scores = tf.matmul(states_norm,embedding_norm,transpose_b=True)