केरेस लॉस और मेट्रिक्स मान प्रत्येक में समान फ़ंक्शन से मेल नहीं खाते हैं

Aug 18 2020

मैं नीचे की तरह एक कस्टम लॉस फंक्शन के साथ केर का उपयोग कर रहा हूं:

def custom_fn(y_true, y_pred):
   # changing y_true, y_pred values systematically
   return mean_absolute_percentage_error(y_true, y_pred)
   

तब मैं फोन कर रहा हूं model.compile(loss=custom_fn)औरmodel.fit(X, y,..validation_data=(X_val, y_val)..)

केरस तब सहेज रहा है lossऔर val_lossमॉडल इतिहास में। एक विवेक जांच के रूप में, जब मॉडल प्रशिक्षण पूरा करता है, model.predict(X_val)तो मैं इसका उपयोग कर रहा हूं ताकि मैं custom_fnप्रशिक्षित मॉडल का उपयोग करके मैन्युअल रूप से सत्यापन हानि की गणना कर सकूं ।

मैं इस कॉलबैक का उपयोग करके सर्वश्रेष्ठ युग के साथ मॉडल को सहेज रहा हूं:

callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))

इसलिए यह गणना करने के बाद, सत्यापन की हानि को val_lossसर्वश्रेष्ठ युग के केरस के मूल्य से मेल खाना चाहिए । लेकिन ऐसा नहीं हो रहा है।

इस मुद्दे का पता लगाने के एक और प्रयास के रूप में, मैं यह भी कर रहा हूं:

    model.compile(loss=custom_fn, metrics=[custom_fn])

और मेरे आश्चर्य के लिए, val_lossऔर val_custom_fnमेल नहीं खाते (न तो lossया loss_custom_fnउस मामले के लिए)।

यह वास्तव में अजीब है, मेरा custom_fnअनिवार्य रूप से 'केरस' में बनाया गया mapeहै y_trueऔर y_predथोड़ा हेरफेर किया गया है। यहां क्या हो रहा है?

पुनश्च : मैं जिन परतों का उपयोग कर रहा हूं वे LSTMपरतें और एक अंतिम Denseपरत हैं। लेकिन मुझे लगता है कि यह जानकारी समस्या के लिए प्रासंगिक नहीं है। मैं नियमितीकरण का उपयोग हाइपरपैरमीटर के रूप में भी कर रहा हूं लेकिन ड्रॉपआउट नहीं।

अपडेट करें

यहां तक ​​कि custom_fnकेरेस को हटाने और उपयोग करने के लिए mapeएक नुकसान फ़ंक्शन और मीट्रिक की तरह बनाया गया है:

model.compile(loss='mape', metrics=['mape'])

और सादगी के लिए, ModelCheckpointकॉलबैक को हटाने का एक ही प्रभाव हो रहा है; val_lossऔर val_mapeप्रत्येक युग के लिए बराबर नहीं हैं । यह मेरे लिए बेहद अजीब है। मुझे या तो कुछ याद आ रहा है या केरस कोड में एक बग है..पहले और अधिक यथार्थवादी हो सकता है।

जवाब

3 user7331538 Aug 18 2020 at 19:34

यह ब्लॉग पोस्ट बताता है कि सत्यापन हानि की गणना करते समय प्रशिक्षण में उपयोग किए जाने वाले किसी भी नियमितीकरण को केरस जोड़ता है। और जाहिर है, पसंद की मीट्रिक की गणना करते समय कोई नियमितीकरण लागू नहीं किया जाता है। यही कारण है कि यह पसंद के किसी भी नुकसान समारोह के साथ होता है जैसा कि प्रश्न में कहा गया है।

यह कुछ ऐसा है जिसे मैं केरस से कोई दस्तावेज नहीं पा सका। हालाँकि, ऐसा लगता है कि जब से मैं सभी नियमितीकरण हाइपरपरमेटर्स को हटाता हूं, val_lossऔर val_custom_fnप्रत्येक युग में बिल्कुल मेल खाता है।

एक आसान समाधान या तो custom_fnएक मीट्रिक के रूप में उपयोग करना है और मीट्रिक ( val_custom_fn) पर आधारित सर्वोत्तम मॉडल को सहेजना है val_loss। या फिर प्रत्येक युग के माध्यम से मैन्युअल रूप से लूप करें और प्रत्येक युग val_lossको प्रशिक्षित करने के बाद मैन्युअल रूप से सही गणना करें । उत्तरार्द्ध अधिक समझ में आता है क्योंकि custom_fnदोनों में एक मीट्रिक के रूप में और एक हानि फ़ंक्शन के रूप में शामिल करने का कोई कारण नहीं है ।

अगर किसी को Keras प्रलेखन में इसका कोई प्रमाण मिल सकता है जो मददगार होगा।