machine learning - डीबग_इनफो के साथ कैफ लॉग की व्याख्या कैसे करें?



machine-learning neural-network (1)

पहली नज़र में आप इस लॉग सेक्शन को दो में विभाजित देख सकते हैं: [Forward] और [Backward] । याद रखें कि तंत्रिका नेटवर्क प्रशिक्षण आगे-पीछे प्रचार के माध्यम से किया जाता है:
एक प्रशिक्षण उदाहरण (बैच) नेट को खिलाया जाता है और एक फॉरवर्ड पास वर्तमान भविष्यवाणी को आउटपुट करता है।
इस भविष्यवाणी के आधार पर नुकसान की गणना की जाती है। नुकसान तब प्राप्त होता है, और एक ढाल का अनुमान लगाया जाता है और चेन नियम का उपयोग करते हुए पिछड़े प्रचारित किया जाता है।

कैफ Blob डेटा संरचना
बस एक त्वरित फिर से टोपी। Caffe डेटा / वेट / पैरामीटर आदि को स्टोर करने के लिए Blob डेटा संरचना का उपयोग करता है। इस चर्चा के लिए यह ध्यान रखना महत्वपूर्ण है कि Blob के दो "भाग" हैं: data और diffBlob मान data भाग में संग्रहीत किए जाते हैं। अलग-अलग भाग का उपयोग बैकपोरोपेशन स्टेप के लिए तत्व-वार ग्रेडिएंट्स को स्टोर करने के लिए किया जाता है।

अग्रवर्ती पारण

आप लॉग के इस हिस्से में नीचे से ऊपर तक सभी परतें देखेंगे। प्रत्येक परत के लिए आप देखेंगे:

I1109 ...]     [Forward] Layer conv1, top blob conv1 data: 0.0645037
I1109 ...]     [Forward] Layer conv1, param blob 0 data: 0.00899114
I1109 ...]     [Forward] Layer conv1, param blob 1 data: 0

लेयर "conv1" एक कनवल्शन लेयर है जिसमें 2 परम "conv1" : फिल्टर और पूर्वाग्रह। नतीजतन, लॉग में तीन लाइनें हैं। फ़िल्टर बूँद ( param blob 0 ) में data

 I1109 ...]     [Forward] Layer conv1, param blob 0 data: 0.00899114

यह वर्तमान एल 2 मानदंड फ़िल्टरिंग वज़न 0.00899 है।
वर्तमान पूर्वाग्रह ( param blob 1 ):

 I1109 ...]     [Forward] Layer conv1, param blob 1 data: 0

जिसका अर्थ है कि वर्तमान में पूर्वाग्रह 0 पर सेट है।

अंतिम लेकिन कम से कम, "conv1" परत का आउटपुट नहीं है, "top" जिसका नाम "conv1" (मूल कैसे ...)। आउटपुट का L2 मानदंड है

 I1109 ...]     [Forward] Layer conv1, top blob conv1 data: 0.0645037

ध्यान दें कि प्रश्न में ब्लब्स के data भाग पर [Forward] पास के सभी एल 2 मूल्यों की सूचना दी गई है।

हानि और ढाल
[Forward] पास के अंत में नुकसान की परत आती है:

I1109 ...]     [Forward] Layer loss, top blob loss data: 2031.85
I1109 ...]     [Backward] Layer loss, bottom blob fc1 diff: 0.124506

इस उदाहरण में बैच का नुकसान 2031.85 है, नुकसान wrt fc1 की ढाल की गणना की जाती है और fc1 ब्लॉब के हिस्से को fc1 करने के लिए इसे पारित किया जाता है। ग्रेडिएंट का L2 परिमाण 0.1245 है।

पिछड़ा पास
शेष सभी परतें इस भाग में ऊपर से नीचे तक सूचीबद्ध हैं। आप देख सकते हैं कि L2 परिमाण की रिपोर्ट की गई अब ब्लब्स (पैराम्स और लेयर्स इनपुट) के अलग-अलग हिस्से हैं।

आखिरकार
इस पुनरावृत्ति की अंतिम लॉग लाइन:

[Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07)

डेटा और ग्रेडिएंट दोनों के कुल L1 और L2 परिमाण की रिपोर्ट करता है।

मुझे क्या खोजना चाहिए?

  1. यदि आपके पास अपने नुकसान में nan एस है , तो देखें कि आपका डेटा किस बिंदु पर है या नैनो में बदल जाता है: किस परत पर? किस पुनरावृत्ति पर?

  2. ग्रेडिएंट परिमाण को देखें, तो वे उचित होना चाहिए। यदि आप e+8 साथ मान देखना शुरू कर रहे हैं, तो आपके डेटा / ग्रेडिएंट को उड़ाने की शुरुआत हो रही है। अपने सीखने की दर कम करें!

  3. देखें कि diff एस शून्य नहीं हैं। शून्य भिन्न का मतलब है कोई ग्रेडिएंट = कोई अपडेट नहीं = कोई सीख नहीं। यदि आप यादृच्छिक वजन से शुरू करते हैं, तो उच्च विचरण के साथ यादृच्छिक भार उत्पन्न करने पर विचार करें।

  4. सक्रियण (ग्रेडिएंट के बजाय) शून्य पर जाएं। यदि आप "ReLU" का उपयोग कर रहे हैं, तो इसका मतलब है कि आपके इनपुट / वेट आपको उन क्षेत्रों में ले जाते हैं जहाँ ReLU गेट "सक्रिय नहीं हैं" जो "मृत न्यूरॉन्स" के लिए अग्रणी हैं। शून्य इनपुट होने के लिए अपने इनपुट को सामान्य करने पर विचार करें "BatchNorm"][6] layers, setting ReLU में negative_slope` को "BatchNorm"][6] layers, setting [ "BatchNorm"][6] layers, setting जोड़ें।

जब प्रशिक्षण के दौरान कठिनाइयों का सामना करना पड़ रहा है ( nan एस , लॉस debug_info: true नहीं होता है , आदि) debug_info: true 'solver.prototxt' फाइल में सही है।

प्रशिक्षण लॉग तब कुछ इस तरह दिखता है:

I1109 ...]     [Forward] Layer data, top blob data data: 0.343971    
I1109 ...]     [Forward] Layer conv1, top blob conv1 data: 0.0645037
I1109 ...]     [Forward] Layer conv1, param blob 0 data: 0.00899114
I1109 ...]     [Forward] Layer conv1, param blob 1 data: 0
I1109 ...]     [Forward] Layer relu1, top blob conv1 data: 0.0337982
I1109 ...]     [Forward] Layer conv2, top blob conv2 data: 0.0249297
I1109 ...]     [Forward] Layer conv2, param blob 0 data: 0.00875855
I1109 ...]     [Forward] Layer conv2, param blob 1 data: 0
I1109 ...]     [Forward] Layer relu2, top blob conv2 data: 0.0128249
. 
.
.
I1109 ...]     [Forward] Layer fc1, top blob fc1 data: 0.00728743
I1109 ...]     [Forward] Layer fc1, param blob 0 data: 0.00876866
I1109 ...]     [Forward] Layer fc1, param blob 1 data: 0
I1109 ...]     [Forward] Layer loss, top blob loss data: 2031.85
I1109 ...]     [Backward] Layer loss, bottom blob fc1 diff: 0.124506
I1109 ...]     [Backward] Layer fc1, bottom blob conv6 diff: 0.00107067
I1109 ...]     [Backward] Layer fc1, param blob 0 diff: 0.483772
I1109 ...]     [Backward] Layer fc1, param blob 1 diff: 4079.72
.
.
.
I1109 ...]     [Backward] Layer conv2, bottom blob conv1 diff: 5.99449e-06
I1109 ...]     [Backward] Layer conv2, param blob 0 diff: 0.00661093
I1109 ...]     [Backward] Layer conv2, param blob 1 diff: 0.10995
I1109 ...]     [Backward] Layer relu1, bottom blob conv1 diff: 2.87345e-06
I1109 ...]     [Backward] Layer conv1, param blob 0 diff: 0.0220984
I1109 ...]     [Backward] Layer conv1, param blob 1 diff: 0.0429201
E1109 ...]     [Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07)

इसका क्या मतलब है?





gradient-descent