विषयसूची[लुकाउनुहोस्][देखाउनु]
मस्तिष्क न्यूरल नेटवर्कसँग तुलना गर्न सकिन्छ। यो समानता हो जुन सामान्यतया यस विषयमा नयाँ कसैलाई मेसिन लर्निङ र कृत्रिम न्यूरल नेटवर्कहरू पछाडिका विचारहरू बुझ्न मद्दत गर्न प्रयोग गरिन्छ।
किनभने त्यहाँ गणितीय र सांख्यिकीय गणनाका धेरै तहहरू पर्दा पछाडि चलिरहेका छन्, यी नेटवर्कहरूलाई गणितीय प्रकार्यको रूपमा परिभाषित गर्नु अझ उन्नत विधि हो।
यो ती मानिसहरूका लागि हो जो वास्तवमा मेसिन लर्निङमा रुचि राख्छन् र पाइथन न्यूरल नेटवर्क कोड कसरी लेखिएको छ भनेर हेर्न चाहन्छन्।
यस लेखमा, हामी स्क्र्याचबाट पूर्ण रूपमा जडान गरिएको गहिरो न्यूरल नेटवर्क (DNN) कसरी निर्माण गर्ने भनेर प्रदर्शन गर्नेछौं। अजगर 3.
हाम्रो पाइथन न्यूरल नेटवर्क कोडको लागि फाइल संरचनाको एक सिंहावलोकन
यहाँ तीनवटा फाइलहरू सिर्जना हुनेछन्। पहिलो सरल nn.py फाइल हो, जसलाई "सेटिङ अप हेल्पर फंक्शनहरू" र "स्क्र्याचबाट न्यूरल नेटवर्क निर्माण गर्ने" मा छलफल गरिनेछ।
हामीसँग परीक्षण डाटा लोड गर्न mnist loader.py नामक फाइल पनि हुनेछ, जसमा "MNIST डाटा लोड गर्दै" मा वर्णन गरिएको छ।
अन्तमा, हामीसँग test.py नामक फाइल हुनेछ जुन हाम्रो तंत्रिका नेटवर्क परीक्षण गर्न टर्मिनलमा सुरु हुनेछ।
यो फाइल "दौड परीक्षणहरू" मा विस्तृत रूपमा वर्णन गरिएको छ।
स्थापना
यो ट्यूटोरियल पछ्याउनको लागि NumPy पाइथन पुस्तकालय डाउनलोड हुनुपर्छ। तपाइँ टर्मिनलमा निम्न आदेश प्रयोग गरेर यो पूरा गर्न सक्नुहुन्छ:
मोड्युलहरू आयात गर्दै र हेल्पर प्रकार्य सेटअप गर्दै
हामीलाई चाहिने दुईवटा पुस्तकालयहरू अनियमित र NumPy हुन्, जुन हामीले तुरुन्तै आयात गर्नेछौं। हाम्रो न्यूरल नेटवर्कको प्रारम्भिक वजनहरूको लागि, हामी तिनीहरूलाई अनियमित पुस्तकालय प्रयोग गरेर फेरबदल गर्नेछौं।
हाम्रो गणनाको गति बढाउनको लागि, हामी NumPy वा np प्रयोग गर्नेछौं (संसदद्वारा, यो प्रायः np को रूपमा आयात गरिन्छ)। हाम्रा दुई सहायक कार्यहरू हाम्रो आयात पछि बनाइनेछ। दुई सिग्मोइड प्रकार्यहरू: एक र सिग्मोइड प्राइम।
लजिस्टिक रिग्रेसनले सिग्मोइड प्रकार्य प्रयोग गरेर डेटा वर्गीकृत गर्नेछ, जबकि ब्याकप्रोपेगेशनले सिग्मोइड प्राइम प्रकार्य प्रयोग गरेर डेल्टा वा ग्रेडियन्ट गणना गर्नेछ।
नेटवर्क क्लास सिर्जना गर्दै
पूर्ण रूपमा लिङ्क गरिएको न्यूरल नेटवर्क निर्माण गर्नु यस खण्डको एकमात्र फोकस हो। नेटवर्क वर्गले पछि आउने सबै प्रकार्यहरू समावेश गर्दछ। प्रकार्य वस्तु() { [नेटिभ कोड] } सुरुमा हाम्रो नेटवर्क क्लासमा सिर्जना गरिनेछ।
एउटा तर्क, आकार, प्रकार्य वस्तु() { [स्थानीय कोड] } द्वारा आवश्यक छ। साइज चर भनेको संख्यात्मक मानहरूको संग्रह हो जसले हाम्रो न्यूरल नेटवर्कको प्रत्येक तहमा उपस्थित इनपुट नोडहरूको संख्या प्रतिनिधित्व गर्दछ।
हामीले हाम्रो __init__ विधिमा चार गुणहरू प्रारम्भ गर्छौं। इनपुट चर, आकारहरू, क्रमशः तह आकार र तहहरूको संख्या, संख्या तहहरूको सूची सेट गर्न प्रयोग गरिन्छ।
पहिलो चरण भनेको आगत तहलाई पछ्याउने प्रत्येक तहमा हाम्रो नेटवर्कको प्रारम्भिक पूर्वाग्रहहरू अनियमित रूपमा असाइन गर्नु हो।
अन्तमा, इनपुट र आउटपुट तहहरू बीचको प्रत्येक लिङ्कको वजन अनियमित रूपमा उत्पन्न हुन्छ। Np.Random.Randn() ले सन्दर्भको लागि सामान्य वितरणबाट कोरिएको अनियमित नमूना दिन्छ।
फिड फर्वार्ड प्रकार्य
न्यूरल नेटवर्कमा, जानकारी फिडफर्वार्ड प्रकार्य द्वारा अगाडि पठाइन्छ। एक तर्क, a, वर्तमान सक्रियता भेक्टर संकेत गर्दै, यो प्रकार्य द्वारा आवश्यक हुनेछ।
यो प्रकार्यले नेटवर्कमा सबै पूर्वाग्रह र वजनहरू दोहोर्याएर प्रत्येक तहमा सक्रियताहरू अनुमान गर्दछ। दिइएको जवाफ भविष्यवाणी हो, जुन अन्तिम तहको सक्रियता हो।
मिनी ब्याच ग्रेडियन्ट डिसेन्ट
हाम्रो नेटवर्क क्लासको वर्कहोर्स ग्रेडियन्ट डिसेन्ट हो। यस संस्करणमा, हामी मिनी-ब्याच (स्टोकास्टिक) ग्रेडियन्ट डिसेन्ट प्रयोग गर्छौं, ग्रेडियन्ट डिसेन्टको परिमार्जित भिन्नता।
यसले संकेत गर्दछ कि डेटा पोइन्टहरूको सानो ब्याच हाम्रो मोडेल अपडेट गर्न प्रयोग गरिनेछ। चार आवश्यक र एक ऐच्छिक तर्क यस विधिमा पारित गरिएको छ। चार आवश्यक चरहरू प्रशिक्षण डेटा सेट, युगहरूको संख्या, मिनी-ब्याचहरूको आकार, र सिक्ने दर (eta) हुन्।
परीक्षण डाटा अनुरोध मा उपलब्ध छन्। हामीले अन्ततः यो नेटवर्कको मूल्याङ्कन गर्दा हामी परीक्षण डेटा उपलब्ध गराउने छौँ। यस प्रकार्यमा नमूनाहरूको संख्या प्रारम्भिक रूपमा सूचीको लम्बाइमा सेट गरिन्छ एक पटक प्रशिक्षण डेटालाई सूची प्रकारमा रूपान्तरण गरिसकेपछि।
हामी पनि त्यहि प्रकृया लागू गर्छौं जुन डाटामा दिइएको छ परीक्षण गर्नको लागि। यो कारणले गर्दा हामीलाई सूचीको रूपमा फिर्ता गर्नुको सट्टा, तिनीहरू साँच्चै सूचीहरूको जिप हुन्। जब हामीले MNIST डेटा नमूनाहरू पछि लोड गर्छौं, हामी यस बारे थप जान्ने छौं।
यदि हामी यो सुनिश्चित गर्न सक्छौं कि हामी दुबै प्रकारका डेटालाई सूचीको रूपमा प्रदान गर्छौं, तब यो प्रकार-कास्टिङ आवश्यक छैन।
एकचोटि हामीसँग डाटा छ, हामी तालिम युगहरू लूपमा जान्छौं। एक प्रशिक्षण अवधि तंत्रिका नेटवर्क प्रशिक्षण को एक राउन्ड मात्र हो। हामीले मिनी-ब्याचहरूको सूची बनाउनु अघि अनियमितता सुनिश्चित गर्न प्रत्येक युगमा डेटा फेरबदल गर्छौं।
अपडेट मिनी ब्याच प्रकार्य, जुन तल छलफल गरिएको छ, प्रत्येक मिनी-ब्याचको लागि बोलाइनेछ। यदि परीक्षण डाटा उपलब्ध छ भने परीक्षण शुद्धता पनि फिर्ता गरिनेछ।
लागत-व्युत्पन्न सहायक प्रकार्य
हामीले वास्तवमै ब्याकप्रोपेगेशन कोड सिर्जना गर्नु अघि पहिले लागत व्युत्पन्न भनिने सहायक प्रकार्य विकास गरौं। यदि हामीले हाम्रो आउटपुट तहमा गल्ती गर्छौं भने, लागत व्युत्पन्न प्रकार्यले यसलाई देखाउनेछ।
यसलाई दुई इनपुटहरू चाहिन्छ: आउटपुट सक्रियता एरे र अपेक्षित आउटपुट मानहरूको y-निर्देशनहरू।
ब्याकप्रोपेगेशन प्रकार्य
हाम्रो वर्तमान सक्रियता भेक्टर, सक्रियता, साथै अन्य कुनै पनि सक्रियता भेक्टरहरू, सक्रियताहरू, र z-भेक्टरहरू, zs, सबैलाई ध्यानमा राख्नुपर्छ। आगत तह भनिने तह पहिले सक्रिय हुन्छ।
हामी तिनीहरूलाई राखे पछि प्रत्येक पूर्वाग्रह र वजन मार्फत लुप गर्नेछौं। प्रत्येक लूपले z भेक्टरलाई वजन र सक्रियताको डट उत्पादनको रूपमा गणना गर्ने, यसलाई zs को सूचीमा थप्ने, सक्रियता पुन: गणना गर्ने, र सक्रियताहरूको सूचीमा अद्यावधिक गरिएको सक्रियता थप्ने समावेश गर्दछ।
अन्तमा, गणित। डेल्टा, जुन zs भेक्टरहरूको अन्तिम तत्वको सिग्मोइड प्राइमले गुणन गरिएको अघिल्लो तहको त्रुटि बराबर छ, हामीले हाम्रो ब्याकवर्ड पास सुरु गर्नु अघि गणना गरिन्छ।
nabla b को अन्तिम तह डेल्टा हुन सेट गरिएको छ, र nabla w को अन्तिम तह डेल्टाको डट उत्पादन र सक्रियताको दोस्रो-देखि-अन्तिम तहको रूपमा सेट गरिएको छ (ट्रान्सपोज गरिएको छ ताकि हामी वास्तवमा गणित गर्न सक्छौं) ।
हामी पहिले जस्तै अगाडि बढ्छौं, दोस्रो तहबाट सुरु गरेर अन्तिममा समाप्त गर्दै, र यी अन्तिम तहहरू पूरा गरेपछि प्रक्रिया दोहोर्याउनुहोस्। नाबलाहरू त्यसपछि टपलको रूपमा फिर्ता दिइन्छ।
Mini-batch gradient decent लाई अद्यावधिक गर्दै
हाम्रो SGD (स्टोकास्टिक ग्रेडियन्ट डिसेन्ट) विधिले मिनि-ब्याच अद्यावधिकलाई समावेश गर्दछ। किनकि यो SGD मा प्रयोग गरिन्छ तर ब्याकप्रप पनि चाहिन्छ, मैले यो प्रकार्य कहाँ राख्ने भनेर बहस गरें।
अन्तमा, मैले यसलाई यहाँ पोस्ट गर्ने छनौट गरें। यो हाम्रो ब्याकप्रप प्रकार्यले जस्तै, पूर्वाग्रह र तौलको नाब्लासको ० भेक्टरहरू उत्पन्न गरेर सुरु हुन्छ।
यसलाई यसको दुई इनपुटको रूपमा मिनी-ब्याच र ईटा सिकाइ दर चाहिन्छ। मिनी-ब्याचमा, हामी प्रत्येक इनपुट, x, र आउटपुट, y को लागि प्रत्येक नाबला एरेको डेल्टा प्राप्त गर्न ब्याकप्रप प्रकार्य प्रयोग गर्छौं। नाबला सूचीहरू त्यसपछि यी डेल्टाहरूसँग अद्यावधिक हुन्छन्।
अन्तमा, हामी नेटवर्कको वजन र पूर्वाग्रहहरू अद्यावधिक गर्न सिकाउने दर र नाब्लास प्रयोग गर्छौं। प्रत्येक मानलाई सबैभन्दा भर्खरको मानमा अद्यावधिक गरिन्छ, कम सिकाइ दर, मिनिब्याच साइजले गुणन गरिन्छ, र त्यसपछि नाब्ला मानमा थपिन्छ।
कार्य मूल्याङ्कन गर्नुहोस्
मूल्याङ्कन प्रकार्य अन्तिम हो जुन हामीले लेख्न आवश्यक छ। परीक्षण डाटा यो प्रकार्यको लागि मात्र इनपुट हो। यस प्रकार्यमा, हामी केवल नेटवर्कको आउटपुटहरू अपेक्षित परिणामसँग तुलना गर्छौं, y। इनपुट, x, अगाडि खुवाएर, नेटवर्कको आउटपुटहरू निर्धारण गरिन्छ।
पूरा कोड
जब हामी सबै कोड मिलाउँछौं, यो कसरी देखिन्छ।
न्यूरल नेटवर्क परीक्षण
MNIST डेटा लोड गर्दै
यो MNIST डाटा .pkl.gz ढाँचामा छ, जुन हामी GZIP प्रयोग गरेर खोल्नेछौं र अचारसँग लोड गर्नेछौं। प्रशिक्षण, प्रमाणीकरण, र परीक्षण डेटामा विभाजित गरी आकार तीनको टुपलको रूपमा यो डेटा लोड गर्न द्रुत विधि लेखौं।
हाम्रो डेटा व्यवस्थापन गर्न सजिलो बनाउनको लागि, हामी y लाई 10-वस्तु एरेमा इन्कोड गर्न अर्को प्रकार्य लेख्नेछौं। छविको उचित अंकसँग मेल खाने १ बाहेक सबै ० सेकेन्डहरू हुनेछन्।
हामी हाम्रो डेटा पढ्न योग्य ढाँचामा लोड गर्न आधारभूत लोड डाटा र एउटा तातो इन्कोड विधि प्रयोग गर्नेछौं। अर्को प्रकार्य लेखिनेछ जसले हाम्रो x मानहरूलाई आकार 784 को सूचीमा रूपान्तरण गर्नेछ, छविको 784 पिक्सेलसँग मिल्ने, र हाम्रो y मानहरूलाई तिनीहरूको एकल हट इन्कोड गरिएको भेक्टर फारममा।
त्यसपछि हामी x र y मानहरू संयोजन गर्नेछौं कि एउटा अनुक्रमणिका अर्कोसँग मेल खान्छ। यो प्रशिक्षण, प्रमाणीकरण, र परीक्षण डेटा सेटहरूमा लागू हुन्छ। हामी त्यसपछि परिवर्तन डाटा फिर्ता।
चलिरहेको परीक्षणहरू
हामी "mnist लोडर" नामक नयाँ फाइल बनाउनेछौं जसले हामीले परीक्षण सुरु गर्नु अघि हामीले पहिले स्थापना गरेको न्यूरल नेटवर्क (सरल nn) र MNIST डेटा सेट लोडर दुवै आयात गर्नेछ।
यस फाइलमा, हामीले डेटा आयात गर्न, 784 को इनपुट तह आकार र 10 को आउटपुट तह आकारको नेटवर्क निर्माण गर्न, प्रशिक्षण डेटामा नेटवर्कको SGD प्रकार्य चलाउन, त्यसपछि परीक्षण डेटा प्रयोग गरेर परीक्षण गर्न आवश्यक छ।
ध्यानमा राख्नुहोस् कि हाम्रो इनपुट तहहरूको सूचीको लागि, 784 र 10 बीचको कुनै पनि संख्याले फरक पार्दैन। हामी अन्य तहहरूलाई आफूले चाहेअनुसार परिवर्तन गर्न सक्छौं; केवल इनपुट र आउटपुट आकारहरू निश्चित छन्।
तीन तह आवश्यक छैन; हामी चार, पाँच, वा दुई मात्र प्रयोग गर्न सक्छौं। यसको प्रयोग गरेर मजा लिनुहोस्।
निष्कर्ष
यहाँ, पाइथन 3 प्रयोग गरेर, हामी स्क्र्याचबाट एक न्यूरल नेटवर्क सिर्जना गर्दछौं। उच्च स्तरको गणितको साथसाथै हामीले कार्यान्वयनको विशिष्टताहरू पनि छलफल गर्यौं।
हामीले सहायक कार्यहरू लागू गरेर सुरु गर्यौं। न्यूरोन्सले काम गर्नको लागि, सिग्मोइड र सिग्मोइड प्राइम प्रकार्यहरू महत्त्वपूर्ण छन्। त्यसपछि हामीले फिडफर्वार्ड प्रकार्यलाई अभ्यासमा राख्छौं, जुन न्यूरल नेटवर्कमा डाटा फिड गर्ने आधारभूत प्रक्रिया हो।
अर्को, हामीले पाइथनमा ग्रेडियन्ट डिसेन्ट प्रकार्य सिर्जना गर्यौं, हाम्रो न्यूरल नेटवर्क चलाउने इन्जिन। "स्थानीय मिनिमा" पत्ता लगाउन र तिनीहरूको तौल र पूर्वाग्रहहरू अनुकूलन गर्नको लागि, हाम्रो न्यूरल नेटवर्कले ग्रेडियन्ट डिसेन्ट प्रयोग गर्दछ। हामीले ब्याकप्रोपेगेशन प्रकार्य प्रयोग गरेर सिर्जना गर्यौं ढाल वंश.
आउटपुटहरू उचित लेबलहरूसँग नमिल्दा अद्यावधिकहरू प्रदान गरेर, यो प्रकार्यले तंत्रिका नेटवर्कलाई "सिक्न" सक्षम बनाउँछ।
अन्तमा, हामीले हाम्रो ब्रान्ड-नयाँ पाइथन राख्यौं तंत्रिका सञ्जाल MNIST डाटा सेट प्रयोग गरेर परीक्षण गर्न। सबै कुरा सुचारु रूपमा चल्यो।
खुशीको कोडिंग!
जवाफ छाड्नुस्