केरस से मॉडल.प्रिक्ट फंक्शन के आउटपुट का क्या मतलब है?


15

मैंने Quora आधिकारिक डेटासेट पर डुप्लिकेट प्रश्नों की भविष्यवाणी करने के लिए एक LSTM मॉडल बनाया है। परीक्षण लेबल 0 या 1. 1 हैं जो इंगित करता है कि प्रश्न युग्म डुप्लिकेट है। मॉडल का उपयोग करने के निर्माण के बाद model.fit, मैं model.predictपरीक्षण डेटा पर उपयोग करके मॉडल का परीक्षण करता हूं । आउटपुट कुछ नीचे दिए गए मानों की एक सरणी है:

 [ 0.00514298]
 [ 0.15161049]
 [ 0.27588326]
 [ 0.00236167]
 [ 1.80067325]
 [ 0.01048524]
 [ 1.43425131]
 [ 1.99202418]
 [ 0.54853892]
 [ 0.02514757]

मैं केवल सरणी में पहले 10 मान दिखा रहा हूं। मुझे समझ नहीं आ रहा है कि इन मूल्यों का क्या मतलब है और प्रत्येक प्रश्न जोड़ी के लिए अनुमानित लेबल क्या है?


1
मुझे लगता है कि आपको अपने नेटवर्क में समस्या है .. संभावनाएं 0-1 के पैमाने में होनी चाहिए .. लेकिन आपके पास 1.99 है!, मुझे लगता है कि आपके पास कुछ गलत है ..
घनम

जवाबों:


8

एक तंत्रिका नेटवर्क का आउटपुट कभी भी डिफ़ॉल्ट रूप से बाइनरी नहीं होगा - अर्थात शून्य या वाले। क्रमिक वंश के ढांचे में नुकसान को अधिक स्वतंत्र रूप से अनुकूलित करने के लिए नेटवर्क निरंतर मूल्यों (असतत नहीं) के साथ काम करता है।

एक नज़र ऐसे ही सवाल पर डालते हैं जो कुछ कोड भी दिखाता है।

किसी भी प्रकार के ट्विकिंग और स्केलिंग के बिना, आपके नेटवर्क का आउटपुट आपके इनपुट की सीमा में कहीं भी गिर सकता है, इसके नाममात्र मूल्य के संदर्भ में। आपके मामले में, ऐसा लगता है कि लगभग 0 और 2 के बीच है।

अब आप एक फ़ंक्शन लिख सकते हैं जो आपके मानों को कुछ सीमा के आधार पर 0 या 1 में बदल देता है। उदाहरण के लिए, मानों को श्रेणी [0, 1] में रखें, फिर यदि मान 0.5 से नीचे है, तो 0 लौटाएं, यदि 0.5 से ऊपर है, तो 1 लौटाएं।


धन्यवाद, मैंने भी लेबल को वर्गीकृत करने के लिए एक सीमा मूल्य का उपयोग करने के बारे में सोचा। लेकिन वह आधार क्या होना चाहिए जिस पर सीमा मूल्य तय किया गया?
Dookoto_Sea

@Dookoto_Sea आपको इसे स्वयं तय करना होगा
Jérémy Blain

@Dookoto_Sea कृपया ध्यान दें कि यदि आपका लेबल 0 या 1 है, तो आपका मान उस सीमा में होना चाहिए, [0, 2] की भविष्यवाणियों का मान पेचीदा है, आपको अपना मॉडल आउटपुट बदलने की आवश्यकता है
Jérémy Blac

7

यदि यह एक वर्गीकरण समस्या है, तो आपको 2 आउटपुट न्यूरॉन्स के लिए अपने नेटवर्क को बदलना चाहिए।

आप लेबल का उपयोग करके एक-गर्म एन्कोडेड वैक्टर में परिवर्तित कर सकते हैं

y_train_binary = keras.utils.to_categorical(y_train, num_classes)
y_test_binary = keras.utils.to_categorical(y_test, num_classes)

फिर सुनिश्चित करें कि आपके आउटपुट लेयर में सॉफ्टमैक्स सक्रियण फ़ंक्शन के साथ दो न्यूरॉन्स हैं।

model.add(Dense(num_classes, activation='softmax'))

इसके परिणामस्वरूप आपके model.predict(x_test_reshaped)पास सूचियों की एक सरणी होगी। जहां आंतरिक सूची प्रत्येक वर्ग से संबंधित एक उदाहरण की संभावना है। यह 1 तक बढ़ जाएगा और जाहिर तौर पर तय लेबल उच्चतम संभावना के साथ आउटपुट न्यूरॉन होना चाहिए।

केरस ने इसे अपनी लाइब्रेरी में शामिल किया है इसलिए आपको यह तुलना स्वयं करने की आवश्यकता नहीं है। आप सीधे कक्षा लेबल का उपयोग करके प्राप्त कर सकते हैं model.predict_classes(x_test_reshaped)


3
"अगर यह एक वर्गीकरण समस्या है, तो आपको अपने नेटवर्क को 2 आउटपुट न्यूरॉन्स के लिए बदलना चाहिए।" .. सॉरी जेएएच, लेकिन उसे नहीं करना चाहिए, वह सॉफ्टमैक्स फ़ंक्शन के बजाय एक न्यूरॉन और सिग्मॉयड के साथ कर सकता है।
घनम

@Minion, दोनों विधियाँ अनिवार्य रूप से समतुल्य हैं, थ्रेशोल्डिंग जो आपको अन्यथा एकल आउटपुट न्यूरॉन के साथ करने की आवश्यकता होगी, यह नेटवर्क में अंतर्निहित है। इस प्रकार बाइनरी आउटपुट प्रदान करता है।
JahKnows

1
हां, मैं वाह करता हूं .. मैंने सिर्फ इसलिए टिप्पणी की क्योंकि उन्होंने उल्लेख किया था: "आपके नेटवर्क को 2 आउटपुट न्यूरॉन्स के लिए बदलना चाहिए।" .. थैंक्स
घनम

1

भविष्यवाणियां इस बात पर आधारित हैं कि आप प्रशिक्षण आउटपुट और सक्रियण फ़ंक्शन के रूप में क्या खाते हैं।

उदाहरण के लिए, बाइनरी क्रॉसेंट्रॉपी लॉस के साथ आउटपुट के लिए 0-1 इनपुट और एक सिग्मॉइड सक्रियण फ़ंक्शन के साथ, आपको 1 की संभावना मिलेगी। निर्णय को गलत दिशा में प्राप्त करने की लागत के आधार पर आप फिर आप कैसे तय कर सकते हैं इन संभावनाओं से निपटें (उदाहरण के लिए "1" श्रेणी की भविष्यवाणी करें, यदि संभावना> 0.5 या शायद पहले से ही है जब यह 0.1 है)।

(,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.