2017-04-11 12 views
5

मेरे पास दो सामान्यीकृत टेंसर हैं और मुझे इन टेंसर के बीच कोसाइन समानता की गणना करने की आवश्यकता है। मैं इसे टेंसरफ्लो के साथ कैसे करूं?दो टेंसर के बीच कोसाइन समानता की गणना कैसे करें?

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) 

उत्तर

9

यह काम करेगा:

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]}) 

यह प्रिंट 0.99999988

+0

आप अपने जवाब के लिए एक बहुत धन्यवाद। क्या इनपुट को सामान्यीकृत करके कोसाइन समानता सूत्र सरल हो रहा है? आपके सूत्र में विकिपीडिया https://en.wikipedia.org/wiki/Cosine_similarity – Matias

+3

से कम चीजें हैं, यदि आप पहले सामान्य नहीं करेंगे, तो आप आंतरिक उत्पाद की गणना करने के बाद * बी को उत्पाद द्वारा विभाजित करना होगा ए और बी के मानदंडों के। हालांकि, अगर आप पहले से सामान्यीकृत करते हैं, तो आपको ऐसा करने की आवश्यकता नहीं है। ऐसा इसलिए है क्योंकि normalize_a = a/|| a || (और इसी तरह बी के लिए)। –

+0

क्यों matmul नहीं? –

10

टाइम्स परिवर्तन। नवीनतम टीएफ एपीआई के साथ, tf.losses.cosine_distance पर कॉल करके इसकी गणना की जा सकती है।

उदाहरण:

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)) 
बेशक

, 1 - s कोज्या समानता है!

+0

1-कोसाइन समानता क्यों है? –

+2

क्योंकि '' '' '' '' '' '' cosine दूरी है, समानता नहीं। –

+0

'' '1-s''' की आवश्यकता नहीं है। समारोह को दूरी कहा जाता है, लेकिन समानता देता है। मुझे लगता है क्योंकि यह tf.losses में है। कोड पर एक नज़र डालें, मैं गलत हो सकता हूं। रेखा 274. नुकसान = 1 - math_ops.reduce_sum (radial_diffs, axis = (dim,), keep_dims = True) https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/python/ops/losses/ losses_impl.py –

0

आप इस तरह वेक्टर या मैट्रिक्स को सामान्य कर सकते हैं:

[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) 
संबंधित मुद्दे