विषय - सूची[छिपाना][प्रदर्शन]
मस्तिष्क तंत्रिका नेटवर्क के बराबर है। यह वह सादृश्य है जो आमतौर पर मशीन सीखने और कृत्रिम तंत्रिका नेटवर्क के पीछे के विचारों को समझने के लिए किसी नए व्यक्ति की सहायता के लिए उपयोग किया जाता है।
चूंकि पर्दे के पीछे गणितीय और सांख्यिकीय गणनाओं की कई परतें चल रही हैं, इसलिए इन नेटवर्कों को गणितीय फ़ंक्शन के रूप में परिभाषित करना एक अधिक उन्नत तरीका है।
यह उन लोगों के लिए है जो वास्तव में मशीन लर्निंग में रुचि रखते हैं और देखना चाहते हैं कि पायथन न्यूरल नेटवर्क कोड कैसे लिखा जाता है।
इस लेख में, हम प्रदर्शित करेंगे कि स्क्रैच से पूरी तरह से जुड़े गहरे तंत्रिका नेटवर्क (डीएनएन) का निर्माण कैसे करें अजगर 3.
हमारे पायथन न्यूरल नेटवर्क कोड के लिए फ़ाइल संरचना का अवलोकन
यहां तीन फाइलें बनाई जाएंगी। पहली सरल nn.py फ़ाइल है, जिस पर "सेटिंग अप हेल्पर फ़ंक्शंस" और "स्क्रैच से तंत्रिका नेटवर्क का निर्माण" में चर्चा की जाएगी।
परीक्षण डेटा लोड करने के लिए हमारे पास mnist loader.py नाम की एक फ़ाइल भी होगी, जैसा कि "MNIST डेटा लोड करना" में वर्णित है।
अंत में, हमारे पास test.py नाम की एक फ़ाइल होगी जो हमारे तंत्रिका नेटवर्क का परीक्षण करने के लिए टर्मिनल में लॉन्च की जाएगी।
इस फ़ाइल का "रनिंग टेस्ट" में विस्तार से वर्णन किया गया है।
स्थापना
इस ट्यूटोरियल का अनुसरण करने के लिए NumPy Python लाइब्रेरी को डाउनलोड किया जाना चाहिए। आप टर्मिनल पर निम्न आदेश का उपयोग करके इसे पूरा कर सकते हैं:
मॉड्यूल आयात करना और हेल्पर फ़ंक्शन सेट करना
हमें केवल दो पुस्तकालयों की आवश्यकता है जो यादृच्छिक और NumPy हैं, जिन्हें हम तुरंत आयात करेंगे। हमारे तंत्रिका नेटवर्क के प्रारंभिक भार के लिए, हम उन्हें यादृच्छिक पुस्तकालय का उपयोग करके फेरबदल करेंगे।
अपनी गणना में तेजी लाने के लिए, हम NumPy या np का उपयोग करेंगे (सम्मेलन के अनुसार, इसे अक्सर np के रूप में आयात किया जाता है)। हमारे आयात के बाद हमारे दो सहायक कार्य किए जाएंगे। सिग्मॉइड के दो कार्य: एक और सिग्मॉइड प्राइम।
लॉजिस्टिक रिग्रेशन सिग्मॉइड फ़ंक्शन का उपयोग करके डेटा को वर्गीकृत करेगा, जबकि बैकप्रोपेगेशन सिग्मॉइड प्राइम फ़ंक्शन का उपयोग करके डेल्टा या ग्रेडिएंट की गणना करेगा।
नेटवर्क क्लास बनाना
पूरी तरह से जुड़े हुए तंत्रिका नेटवर्क का निर्माण इस खंड का एकमात्र फोकस है। नेटवर्क वर्ग बाद में आने वाले सभी कार्यों को शामिल करेगा। फ़ंक्शन ऑब्जेक्ट () { [मूल कोड] } शुरू में हमारे नेटवर्क वर्ग में बनाया जाएगा।
एक तर्क, आकार, फ़ंक्शन ऑब्जेक्ट () {[मूल कोड]} द्वारा आवश्यक है। आकार चर संख्यात्मक मानों का एक संग्रह है जो हमारे तंत्रिका नेटवर्क की प्रत्येक परत में मौजूद इनपुट नोड्स की संख्या का प्रतिनिधित्व करता है।
हम अपनी __init__ पद्धति में चार गुणों को इनिशियलाइज़ करते हैं। इनपुट चर, आकार, क्रमशः परत आकार और परतों की संख्या, संख्या परतों की सूची निर्धारित करने के लिए उपयोग किए जाते हैं।
पहला कदम बेतरतीब ढंग से हमारे नेटवर्क के प्रारंभिक पूर्वाग्रहों को इनपुट परत का अनुसरण करने वाली प्रत्येक परत को असाइन करना है।
अंत में, इनपुट और आउटपुट लेयर्स के बीच प्रत्येक लिंक का अपना वज़न बेतरतीब ढंग से उत्पन्न होता है। Np.Random.Randn() संदर्भ के लिए सामान्य वितरण से लिया गया एक यादृच्छिक नमूना देता है।
फीड फॉरवर्ड फंक्शन
एक तंत्रिका नेटवर्क में, फीडफॉरवर्ड फ़ंक्शन द्वारा सूचना को आगे भेजा जाता है। एक तर्क, ए, वर्तमान सक्रियण वेक्टर को इंगित करता है, इस फ़ंक्शन द्वारा आवश्यक होगा।
यह फ़ंक्शन नेटवर्क में सभी पूर्वाग्रहों और भारों पर पुनरावृति करके प्रत्येक परत पर सक्रियता का अनुमान लगाता है। दिया गया उत्तर भविष्यवाणी है, जो अंतिम परत की सक्रियता है।
मिनी-बैच ग्रेडिएंट डिसेंट
हमारे नेटवर्क क्लास का वर्कहॉर्स ग्रेडिएंट डिसेंट है। इस संस्करण में, हम मिनी-बैच (स्टोकेस्टिक) ग्रेडिएंट डिसेंट का उपयोग करते हैं, ग्रेडिएंट डिसेंट का एक संशोधित रूपांतर।
यह इंगित करता है कि हमारे मॉडल को अपडेट करने के लिए डेटा बिंदुओं के एक छोटे बैच का उपयोग किया जाएगा। इस पद्धति के लिए चार आवश्यक और एक वैकल्पिक तर्क पारित किए जाते हैं। चार आवश्यक चर प्रशिक्षण डेटा सेट, युगों की संख्या, मिनी-बैच का आकार और सीखने की दर (ईटा) हैं।
परीक्षण डेटा अनुरोध पर उपलब्ध हैं। जब हम अंततः इस नेटवर्क का मूल्यांकन करेंगे तो हम परीक्षण डेटा की आपूर्ति करेंगे। प्रशिक्षण डेटा को सूची प्रकार में बदलने के बाद, इस फ़ंक्शन में नमूनों की संख्या शुरू में सूची की लंबाई पर सेट की जाती है।
हम डेटा का परीक्षण करने के लिए भी वही प्रक्रिया लागू करते हैं जो इसमें दिया गया है। ऐसा इसलिए है क्योंकि सूचियों के रूप में हमें वापस करने के बजाय, वे वास्तव में सूचियों के ज़िप हैं। जब हम MNIST डेटा नमूने बाद में लोड करते हैं, तो हम इसके बारे में और जानेंगे।
यदि हम यह सुनिश्चित कर सकते हैं कि हम दोनों प्रकार के डेटा को सूचियों के रूप में प्रदान करते हैं, तो यह टाइप-कास्टिंग आवश्यक नहीं है।
एक बार हमारे पास डेटा होने के बाद, हम प्रशिक्षण युगों को एक लूप में देखते हैं। एक प्रशिक्षण अवधि तंत्रिका नेटवर्क प्रशिक्षण का केवल एक दौर है। हम मिनी-बैच की सूची बनाने से पहले यादृच्छिकता सुनिश्चित करने के लिए पहले प्रत्येक युग में डेटा को फेरबदल करते हैं।
अद्यतन मिनी बैच फ़ंक्शन, जिसकी चर्चा नीचे की गई है, प्रत्येक मिनी-बैच के लिए कॉल की जाएगी। परीक्षण डेटा उपलब्ध होने पर परीक्षण सटीकता भी वापस कर दी जाएगी।
लागत-व्युत्पन्न सहायक कार्य
इससे पहले कि हम वास्तव में बैकप्रोपेगेशन कोड बनाएं, आइए पहले लागत व्युत्पन्न नामक एक सहायक फ़ंक्शन विकसित करें। अगर हम अपने आउटपुट लेयर में कोई गलती करते हैं, तो कॉस्ट डेरीवेटिव फंक्शन इसे दिखाएगा।
इसके लिए दो इनपुट की आवश्यकता होती है: आउटपुट सक्रियण सरणी और प्रत्याशित आउटपुट मानों के y-निर्देशांक।
बैकप्रोपेगेशन फ़ंक्शन
हमारे वर्तमान सक्रियण वेक्टर, सक्रियण, साथ ही किसी भी अन्य सक्रियण वैक्टर, सक्रियण, और z-वेक्टर, zs, सभी को ध्यान में रखा जाना चाहिए। इनपुट लेयर नामक एक परत पहले सक्रिय होती है।
हम प्रत्येक पूर्वाग्रह और वजन को ऊपर रखने के बाद लूप करेंगे। प्रत्येक लूप में z वेक्टर को वज़न और सक्रियण के डॉट उत्पाद के रूप में गणना करना, इसे zs की सूची में जोड़ना, सक्रियण की पुनर्गणना करना और सक्रियकरण की सूची में अद्यतन सक्रियण जोड़ना शामिल है।
अंत में, गणित। डेल्टा, जो पिछली परत से त्रुटि के बराबर है, जो कि zs वैक्टर के अंतिम तत्व के सिग्मॉइड प्राइम से गुणा किया जाता है, की गणना हमारे बैकवर्ड पास को शुरू करने से पहले की जाती है।
नाबला बी की अंतिम परत डेल्टा होने के लिए निर्धारित है, और नाबला डब्ल्यू की अंतिम परत डेल्टा के डॉट उत्पाद और सक्रियण की दूसरी-से-अंतिम परत के रूप में सेट है (स्थानांतरित ताकि हम वास्तव में गणित कर सकें) .
हम पहले की तरह आगे बढ़ते हैं, दूसरी परत से शुरू करते हैं और आखिरी के साथ समाप्त करते हैं, और इन अंतिम परतों को पूरा करने के बाद प्रक्रिया को दोहराते हैं। फिर नाबला को टुपल के रूप में वापस दिया जाता है।
मिनी-बैच ग्रेडिएंट डिसेंट को अपडेट करना
पहले से हमारी SGD (स्टोकेस्टिक ग्रेडिएंट डिसेंट) पद्धति में मिनी-बैच अपडेटिंग शामिल है। चूंकि इसका उपयोग SGD में किया जाता है, लेकिन इसके लिए बैकप्रॉप की भी आवश्यकता होती है, मैंने इस बात पर बहस की कि इस फ़ंक्शन को कहाँ रखा जाए।
अंत में, मैंने इसे यहां पोस्ट करने का विकल्प चुना। यह हमारे बैकप्रॉप फंक्शन की तरह ही बायस और वेट नाब्लास के 0 वैक्टर उत्पन्न करके शुरू होता है।
इसके दो इनपुट के रूप में मिनी-बैच और ईटा लर्निंग रेट की आवश्यकता होती है। मिनी-बैच में, हम तब प्रत्येक इनपुट, x, और आउटपुट, y के लिए प्रत्येक नाबला सरणी का डेल्टा प्राप्त करने के लिए बैकप्रॉप फ़ंक्शन का उपयोग करते हैं। नाबला सूचियों को फिर इन डेल्टाओं के साथ अद्यतन किया जाता है।
अंत में, हम नेटवर्क के वज़न और पूर्वाग्रहों को अद्यतन करने के लिए सीखने की दर और नाब्लास का उपयोग करते हैं। प्रत्येक मान को नवीनतम मान में अपडेट किया जाता है, सीखने की दर को कम करके, मिनीबैच के आकार से गुणा किया जाता है, और फिर नाबला मान में जोड़ा जाता है।
फ़ंक्शन का मूल्यांकन करें
मूल्यांकन फ़ंक्शन अंतिम है जिसे हमें लिखने की आवश्यकता है। इस फ़ंक्शन के लिए परीक्षण डेटा एकमात्र इनपुट है। इस फ़ंक्शन में, हम केवल अनुमानित परिणाम, y के साथ नेटवर्क के आउटपुट की तुलना करते हैं। इनपुट, x, फॉरवर्ड को फीड करके, नेटवर्क के आउटपुट निर्धारित किए जाते हैं।
पूरा कोड
जब हम सभी कोड को मिलाते हैं, तो यह ऐसा दिखाई देता है।
तंत्रिका नेटवर्क का परीक्षण
एमएनआईएसटी डेटा लोड हो रहा है
RSI एमएनआईएसटी डेटा .pkl.gz प्रारूप में है, जिसे हम GZIP का उपयोग करके खोलेंगे और अचार के साथ लोड करेंगे। आइए इस डेटा को तीन आकार के टपल के रूप में लोड करने के लिए एक त्वरित विधि लिखें, जिसे प्रशिक्षण, सत्यापन और परीक्षण डेटा में विभाजित किया गया है।
हमारे डेटा को प्रबंधित करना आसान बनाने के लिए, हम y को 10-आइटम सरणी में एन्कोड करने के लिए एक और फ़ंक्शन लिखेंगे। छवि के उचित अंक से मेल खाने वाले 0 को छोड़कर सरणी सभी 1s होगी।
हम अपने डेटा को एक पठनीय प्रारूप में लोड करने के लिए मूल लोड डेटा और एक हॉट एन्कोड विधि का उपयोग करेंगे। एक अन्य फ़ंक्शन लिखा जाएगा जो हमारे x मानों को 784 आकार की सूची में परिवर्तित करेगा, छवि के 784 पिक्सेल से मेल खाएगा, और हमारे y मानों को उनके एकल हॉट एन्कोडेड वेक्टर रूप में बदल देगा।
फिर हम x और y मानों को इस प्रकार जोड़ेंगे कि एक अनुक्रमणिका दूसरे से मेल खाती है। यह प्रशिक्षण, सत्यापन और परीक्षण डेटा सेट पर लागू होता है। फिर हम बदले हुए डेटा को वापस करते हैं।
टेस्ट चल रहे हैं
हम "mnist लोडर" नामक एक नई फ़ाइल बनाएंगे जो परीक्षण शुरू करने से पहले हमारे द्वारा पहले स्थापित किए गए तंत्रिका नेटवर्क (सरल nn) और MNIST डेटा सेट लोडर दोनों को आयात करेगा।
इस फ़ाइल में, हमें केवल डेटा आयात करना है, 784 के इनपुट लेयर आकार और 10 के आउटपुट लेयर आकार के साथ एक नेटवर्क बनाना है, प्रशिक्षण डेटा पर नेटवर्क के SGD फ़ंक्शन को चलाना है, फिर परीक्षण डेटा का उपयोग करके इसका परीक्षण करना है।
ध्यान रखें कि इनपुट लेयर्स की हमारी सूची के लिए, इससे कोई फर्क नहीं पड़ता कि 784 और 10 के बीच कोई भी संख्या क्या है। हम अन्य लेयर्स को अपनी पसंद के अनुसार बदल सकते हैं; बस इनपुट और आउटपुट आकार तय हो गए हैं।
तीन परतें आवश्यक नहीं हैं; हम चार, पाँच, या यहाँ तक कि सिर्फ दो का उपयोग कर सकते हैं। इसके साथ एक्सपेरिमेंट करने में मजा लें।
निष्कर्ष
यहां, पायथन 3 का उपयोग करके, हम खरोंच से एक तंत्रिका नेटवर्क बनाते हैं। हमने उच्च-स्तरीय गणित के साथ-साथ कार्यान्वयन की बारीकियों पर भी चर्चा की।
हमने सहायक कार्यों को लागू करके शुरू किया। न्यूरॉन्स के काम करने के लिए, सिग्मॉइड और सिग्मॉइड प्राइम फ़ंक्शन महत्वपूर्ण हैं। फिर हम फीडफॉरवर्ड फ़ंक्शन को व्यवहार में लाते हैं, जो तंत्रिका नेटवर्क में डेटा फीड करने की मूलभूत प्रक्रिया है।
इसके बाद, हमने पायथन में ग्रेडिएंट डिसेंट फ़ंक्शन बनाया, जो इंजन हमारे तंत्रिका नेटवर्क को चलाता है। "स्थानीय मिनीमा" का पता लगाने और उनके वजन और पूर्वाग्रहों को अनुकूलित करने के लिए, हमारा तंत्रिका नेटवर्क ग्रेडिएंट डिसेंट का उपयोग करता है। हमने बैकप्रॉपैगेशन फ़ंक्शन का उपयोग करके बनाया ढतला हुआ वंश.
जब आउटपुट उचित लेबल से मेल नहीं खाते तो अपडेट वितरित करके, यह फ़ंक्शन तंत्रिका नेटवर्क को "सीखने" में सक्षम बनाता है।
अंत में, हमने अपना बिल्कुल नया पायथन रखा तंत्रिका नेटवर्क MNIST डेटा सेट का उपयोग करके परीक्षण के लिए। सब कुछ सुचारू रूप से चलता रहा।
हैप्पी कोडिंग!
एक जवाब लिखें