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