केरेस लॉस और मेट्रिक्स मान प्रत्येक में समान फ़ंक्शन से मेल नहीं खाते हैं
मैं नीचे की तरह एक कस्टम लॉस फंक्शन के साथ केर का उपयोग कर रहा हूं:
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
प्रत्येक युग के लिए बराबर नहीं हैं । यह मेरे लिए बेहद अजीब है। मुझे या तो कुछ याद आ रहा है या केरस कोड में एक बग है..पहले और अधिक यथार्थवादी हो सकता है।
जवाब
यह ब्लॉग पोस्ट बताता है कि सत्यापन हानि की गणना करते समय प्रशिक्षण में उपयोग किए जाने वाले किसी भी नियमितीकरण को केरस जोड़ता है। और जाहिर है, पसंद की मीट्रिक की गणना करते समय कोई नियमितीकरण लागू नहीं किया जाता है। यही कारण है कि यह पसंद के किसी भी नुकसान समारोह के साथ होता है जैसा कि प्रश्न में कहा गया है।
यह कुछ ऐसा है जिसे मैं केरस से कोई दस्तावेज नहीं पा सका। हालाँकि, ऐसा लगता है कि जब से मैं सभी नियमितीकरण हाइपरपरमेटर्स को हटाता हूं, val_loss
और val_custom_fn
प्रत्येक युग में बिल्कुल मेल खाता है।
एक आसान समाधान या तो custom_fn
एक मीट्रिक के रूप में उपयोग करना है और मीट्रिक ( val_custom_fn
) पर आधारित सर्वोत्तम मॉडल को सहेजना है val_loss
। या फिर प्रत्येक युग के माध्यम से मैन्युअल रूप से लूप करें और प्रत्येक युग val_loss
को प्रशिक्षित करने के बाद मैन्युअल रूप से सही गणना करें । उत्तरार्द्ध अधिक समझ में आता है क्योंकि custom_fn
दोनों में एक मीट्रिक के रूप में और एक हानि फ़ंक्शन के रूप में शामिल करने का कोई कारण नहीं है ।
अगर किसी को Keras प्रलेखन में इसका कोई प्रमाण मिल सकता है जो मददगार होगा।