2016-05-19 4 views
46

मैं हाल ही में tf.nn.sparse_softmax_cross_entropy_with_logits में आए और मैं समझ नहीं क्या अंतर tf.nn.softmax_cross_entropy_with_logits की तुलना में है।टेंसरफ्लो: sparse_softmax_cross_entropy_with_logits और softmax_cross_entropy_with_logits के बीच क्या अंतर है?

है फर्क सिर्फ इतना है कि प्रशिक्षण वैक्टर one-hot encoded होना जरूरी y जब sparse_softmax_cross_entropy_with_logits का उपयोग कर?

एपीआई पढ़ना मैं softmax_cross_entropy_with_logits की तुलना में कोई अन्य अंतर नहीं ढूंढ पाया ... लेकिन हमें अतिरिक्त कार्य की आवश्यकता क्यों है?

softmax_cross_entropy_with_logitssparse_softmax_cross_entropy_with_logits के समान परिणाम नहीं दे सकते हैं, अगर इसे एक गर्म एन्कोडेड प्रशिक्षण डेटा/वैक्टर के साथ आपूर्ति की जाती है?

+0

का उत्पादन करता है, यदि दोनों का उपयोग किया जा सकता है (उदाहरण के लिए विशेष छवि लेबल के साथ) तो मैं उनके प्रदर्शन की तुलना देखने में रूचि रखता हूं; मैं उम्मीद करता हूं कि स्पैस संस्करण कम से कम स्मृति-वार, अधिक कुशल होना चाहिए। –

+0

यह भी देखें [यह प्रश्न] (https://stackoverflow.com/q/47034888/712995), जो टेंसफोर्लो में * सभी क्रॉस-एन्ट्रॉपी फ़ंक्शंस * पर चर्चा करता है (उनमें से बहुत सारे हैं)। – Maxim

उत्तर

81

दो अलग-अलग फ़ंक्शन होने के कारण सुविधा है, क्योंकि वे एक ही परिणाम उत्पन्न करते हैं।

अंतर सरल है:

  • sparse_softmax_cross_entropy_with_logits के लिए, लेबल आकार [batch_size] और dtype int32 या int64 होना आवश्यक है। प्रत्येक लेबल [0, num_classes-1] श्रेणी में एक int है।
  • softmax_cross_entropy_with_logits के लिए, लेबल आकार [batch_size, num_classes] है और float32 या float64 dtype चाहिए।

लेबल softmax_cross_entropy_with_logits में इस्तेमाल sparse_softmax_cross_entropy_with_logits में इस्तेमाल किया लेबल की एक हॉट संस्करण हैं।

एक और छोटा अंतर यह है कि sparse_softmax_cross_entropy_with_logits के साथ, आप इस लेबल पर 0 हानि रखने के लिए लेबल के रूप में 1 दे सकते हैं।

+5

-1 सही है? जैसा कि प्रलेखन पढ़ता है: "लेबल में प्रत्येक प्रविष्टि [0, num_classes) में एक अनुक्रमणिका होनी चाहिए। अन्य मान एक अपवाद बढ़ाएंगे जब यह ऑप CPU पर चल रहा है, और GPU पर संबंधित हानि और ढाल पंक्तियों के लिए NaN लौटाता है।" – user1761806

12

मैं सिर्फ स्वीकार किए जाते हैं जवाब यह है कि आप भी TF दस्तावेज में पा सकते हैं करने के लिए 2 बातें जोड़ना चाहते हैं।

पहले:

tf.nn.softmax_cross_entropy_with_logits

नोट: एक ओर जहां कक्षाओं परस्पर अनन्य हैं, उनके संभावनाओं होने की जरूरत नहीं। यह आवश्यक है कि लेबल की प्रत्येक पंक्ति वैध संभाव्यता वितरण है। यदि वे नहीं हैं, तो की गणना ग्रिडेंट गलत होगी।

दूसरा:

tf.nn.sparse_softmax_cross_entropy_with_logits

नोट: इस आपरेशन के लिए, किसी दिए गए लेबल की संभावना अनन्य माना जाता है। यही है, मुलायम वर्गों की अनुमति नहीं है, और लेबल वेक्टर को प्रत्येक वर्ग की लॉग (प्रत्येक मिनीबैच प्रविष्टि) के लिए वास्तविक वर्ग के लिए एक विशिष्ट सूचकांक प्रदान करना होगा।

+4

कक्षाओं परस्पर अनन्य नहीं होने पर हमें क्या उपयोग करना चाहिए। मेरा मतलब है कि अगर हम कई स्पष्ट लेबल जोड़ रहे हैं? – Hayro

+0

मैंने इसे भी पढ़ा। तो इसका मतलब है कि हम इसे एक वनॉट वेक्टर के रूप में लेने के बजाय क्रॉस एंट्रॉपी पर कक्षा की संभावना लागू करते हैं। –

+0

@ हायरो - क्या आपका मतलब है कि आप एक गर्म एन्कोडिंग करने में असमर्थ हैं? मुझे लगता है कि आपको एक अलग मॉडल देखना होगा। [यह] (http://ufldl.stanford.edu/wiki/index.php/Softmax_Regression) ने कुछ बताया "यह 4 बाइनरी लॉजिस्टिक रिग्रेशन क्लासिफायर बनाने के लिए अधिक उपयुक्त होगा" पहले यह सुनिश्चित करने के लिए कि आप कक्षाएं अलग कर सकते हैं। – ashley

8

दोनों कार्यों एक ही परिणाम की गणना करता है और sparse_softmax_cross_entropy_with_logits बजाय विरल लेबल पर सीधे पार एन्ट्रापी गणना करता है उन्हें one-hot encoding साथ परिवर्तित करने की।

आप नीचे दिए गए कार्यक्रम चलाकर पुष्टि कर सकते हैं:

import tensorflow as tf 
from random import randint 

dims = 8 
pos = randint(0, dims - 1) 

logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32) 
labels = tf.one_hot(pos, dims) 

res1 = tf.nn.softmax_cross_entropy_with_logits(  logits=logits, labels=labels) 
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos)) 

with tf.Session() as sess: 
    a, b = sess.run([res1, res2]) 
    print a, b 
    print a == b 

यहाँ मैं लंबाई dims के एक यादृच्छिक logits वेक्टर बना सकते हैं और एक गर्म इनकोडिंग लेबल उत्पन्न (जहां pos में तत्व 1 है और दूसरों को 0 कर रहे हैं) ।

इसके बाद मैं सॉफ्टमैक्स और स्पैस सॉफ्टमैक्स की गणना करता हूं और उनके आउटपुट की तुलना करता हूं। यह सुनिश्चित करने के लिए कुछ बार पुन: प्रयास करें कि यह हमेशा एक ही आउटपुट

संबंधित मुद्दे