मैं कैफे के SigmoidCrossEntropyLoss layer और docs के कोड को देख रहा था और मैं थोड़ा उलझन में हूं। दस्तावेज़ हानि फ़ंक्शन को लॉजिट लॉस के रूप में सूचीबद्ध करते हैं (मैं इसे यहां दोहराना चाहता हूं, लेकिन लेटेक्स के बिना, सूत्र को पढ़ना मुश्किल होगा। दस्तावेज़ लिंक देखें, यह बहुत ऊपर है)।कैफे सिग्मोइड क्रॉसइंटरोपॉइस लेयर लॉस फ़ंक्शन
हालांकि, कोड में ही (Forward_cpu(...)
) से पता चलता एक अलग सूत्र
Dtype loss = 0;
for (int i = 0; i < count; ++i) {
loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) -
log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0)));
}
top[0]->mutable_cpu_data()[0] = loss/num;
यह है क्योंकि इस अवग्रह समारोह के लिए लेखांकन पहले से ही इनपुट के लिए लागू किया गया है है?
हालांकि, (input_data[i] >= 0)
स्निपेट भी मुझे भ्रमित कर रहे हैं। वे दस्तावेजों में हानि सूत्र से p_hat के स्थान पर दिखाई देते हैं, जो सिग्मोइड फ़ंक्शन द्वारा निर्धारित भविष्यवाणी माना जाता है। तो वे सिर्फ बाइनरी थ्रेसहोल्ड क्यों ले रहे हैं? यह और भी भ्रमित हो गया है क्योंकि इस हानि की भविष्यवाणी [0,1] आउटपुट है, इसलिए (input_data[i] >= 0)
1
होगा जब तक कि यह 100% सुनिश्चित न हो।
क्या कोई मुझे यह समझा सकता है?
तो अगर कोई नरम ग्राउंड सच्चाई लेबल (यानी [0,1] के बजाय {0,1] का उपयोग करना था, तो क्या कुछ भी बदलना होगा? – marcman
यदि ग्राउंड सच्चाई लेबल का योग 1 के बराबर है, तो इस परत में कोई बदलाव नहीं होना चाहिए। अन्यथा, आपको कुछ बदलाव करना चाहिए जो नेटवर्क के प्रत्येक आउटपुट पर क्रॉस एन्ट्रॉपी लागू करता है। @marcman – Dale
मुझे लगता है कि मैं समझता हूं कि यह मामला क्यों नहीं है, लेकिन व्यवहार में, जब मैंने प्रत्येक लेबल को सामान्यीकृत किया, तो मुझे नाएन हानि मिलनी शुरू हुई, हालांकि यह एक सीखने की दर मुद्दा हो सकता है – marcman