अच्छा प्रश्न।
मुझे इस घटना के बारे में कई बार पता चला। यहाँ मेरी टिप्पणियों हैं:
धीरे-धीरे झटका
कारण: बड़े ग्रेडिएंट सीखने की प्रक्रिया को बंद कर देते हैं।
आपको क्या उम्मीद करनी चाहिए: रनटाइम लॉग को देखते हुए, आपको प्रति चलना नुकसान मानों को देखना चाहिए। आप ध्यान देंगे कि नुकसान की शुरुआत से पुनरावृत्ति में काफी वृद्धि होने लगती है , अंततः नुकसान एक अस्थायी बिंदु चर द्वारा प्रतिनिधित्व करने के लिए बहुत बड़ा होगा और यह बन जाएगा nan
।
आप क्या कर सकते हैं:base_lr
(कम से कम) परिमाण के क्रम से (solver.prototxt में) घटाएं । यदि आपके पास कई नुकसान परतें हैं, तो आपको यह देखने के लिए लॉग का निरीक्षण करना चाहिए कि कौन सी परत ढाल के लिए जिम्मेदार है और loss_weight
सामान्य के बजाय उस विशिष्ट परत के लिए (train_val.prototxt में) कमी करें base_lr
।
खराब सीखने की दर नीति और पारमेस
कारण: Caffe एक वैध सीखने दर की गणना करने में विफल रहता है और हो जाता है 'inf'
या 'nan'
बजाय, इस अवैध दर पलता सभी अद्यतन और इस प्रकार सभी मापदंडों अमान्य।
आपको क्या उम्मीद करनी चाहिए: रनटाइम लॉग को देखते हुए, आपको यह देखना चाहिए कि सीखने की दर स्वयं बन जाती है 'nan'
, उदाहरण के लिए:
... sgd_solver.cpp:106] Iteration 0, lr = -nan
आप क्या कर सकते हैं: अपनी 'solver.prototxt'
फ़ाइल में सीखने की दर को प्रभावित करने वाले सभी मापदंडों को ठीक करें ।
उदाहरण के लिए, यदि आप उपयोग करते हैं lr_policy: "poly"
और आप max_iter
पैरामीटर को परिभाषित करना भूल जाते हैं , तो आप समाप्त कर देंगे lr = nan
...
कैफ में सीखने की दर के बारे में अधिक जानकारी के लिए, यह धागा देखें ।
दोषपूर्ण नुकसान समारोह
कारण: कभी-कभी नुकसान परतों में नुकसान की गणना nan
दिखाई देने लगती है। उदाहरण के लिए, InfogainLoss
गैर-सामान्यीकृत मूल्यों के साथ खिला परत , कीड़े के साथ कस्टम हानि परत का उपयोग करना, आदि।
आपको क्या उम्मीद करनी चाहिए: रनटाइम लॉग को देखते हुए आप शायद कुछ भी असामान्य नहीं देखेंगे: नुकसान धीरे-धीरे कम हो रहा है, और अचानक nan
प्रकट होता है।
आप क्या कर सकते हैं: देखें कि क्या आप त्रुटि को पुन: उत्पन्न कर सकते हैं, हानि परत में प्रिंटआउट जोड़ें और त्रुटि को डीबग करें।
उदाहरण के लिए: एक बार जब मैंने एक नुकसान का उपयोग किया था जो एक बैच में लेबल घटना की आवृत्ति द्वारा जुर्माना को सामान्य करता है। यह सिर्फ इतना हुआ कि यदि प्रशिक्षण लेबल में से एक बैच में बिल्कुल भी प्रकट नहीं हुआ - नुकसान की गणना उत्पादित nan
एस। उस स्थिति में, इस त्रुटि से बचने के लिए बड़े पर्याप्त बैचों (सेट में लेबल की संख्या के संबंध में) के साथ काम करना पर्याप्त था।
दोषपूर्ण इनपुट
कारण: आपके पास nan
इसके साथ एक इनपुट है!
आपको क्या उम्मीद करनी चाहिए: एक बार सीखने की प्रक्रिया इस दोषपूर्ण इनपुट "हिट" के बाद - आउटपुट बन जाती है nan
। रनटाइम लॉग को देखते हुए आप शायद कुछ भी असामान्य नहीं देखेंगे: नुकसान धीरे-धीरे कम हो रहा है, और अचानक nan
प्रकट होता है।
आप क्या कर सकते हैं: अपने इनपुट डेटासेट (lmdb / leveldn / hdf5 ...) को फिर से बनाएं, सुनिश्चित करें कि आपके पास अपने प्रशिक्षण / सत्यापन सेट में खराब छवि फ़ाइलें नहीं हैं। डीबग के लिए आप एक साधारण नेट बना सकते हैं जो इनपुट लेयर को पढ़ता है, उसके ऊपर एक डमी लॉस होता है और सभी इनपुट्स के माध्यम से चलता है: यदि उनमें से एक दोषपूर्ण है, तो यह डमी नेट भी उत्पन्न होना चाहिए nan
।
"Pooling"
परत में कर्नेल आकार से बड़ा
किसी कारण से, चुनने stride
> kernel_size
के साथ परिणाम हो सकता है पूलिंग के लिए nan
है। उदाहरण के लिए:
layer {
name: "faulty_pooling"
type: "Pooling"
bottom: "x"
top: "y"
pooling_param {
pool: AVE
stride: 5
kernel: 3
}
}
साथ परिणाम nan
में y
।
में अस्थिरता "BatchNorm"
यह बताया गया कि कुछ सेटिंग्स "BatchNorm"
परत के तहत nan
संख्यात्मक अस्थिरताओं के कारण उत्पादन हो सकता है ।
यह मुद्दा bvlc / caffe में उठाया गया था और PR # 5136 इसे ठीक करने का प्रयास कर रहा है।
हाल ही में, मैं के बारे में पता बन गया debug_info
झंडा: सेटिंग debug_info: true
में 'solver.prototxt'
प्रशिक्षण के दौरान अधिक डिबग जानकारी (ढाल परिमाण और सक्रियण मूल्यों सहित) लॉग इन करने के Caffe प्रिंट कर देगा: यह जानकारी कर सकते हैं प्रशिक्षण प्रक्रिया में ढाल blowups और अन्य समस्याओं खोलना में मदद ।