Flatten () का उपयोग न करें - TensorFlow और Keras प्लेटोब्लॉकचैन डेटा इंटेलिजेंस के साथ CNN के लिए ग्लोबल पूलिंग। लंबवत खोज। ऐ.

फ़्लैटन () का उपयोग न करें - TensorFlow और Keras . के साथ CNN के लिए ग्लोबल पूलिंग

अधिकांश प्रैक्टिशनर, पहले कनवल्शनल न्यूरल नेटवर्क (सीएनएन) आर्किटेक्चर के बारे में सीखते हुए - सीखते हैं कि इसमें तीन बुनियादी खंड शामिल हैं:

  • कनवल्शनल लेयर्स
  • पूलिंग परतें
  • पूरी तरह से जुड़ी हुई परतें

अधिकांश संसाधनों के पास है कुछ इस विभाजन पर भिन्नता, मेरी अपनी पुस्तक सहित। विशेष रूप से ऑनलाइन - पूरी तरह से जुड़ी हुई परतें a . को संदर्भित करती हैं चपटी परत और (आमतौर पर) एकाधिक घनी परतें.

यह आदर्श हुआ करता था, और प्रसिद्ध आर्किटेक्चर जैसे वीजीजीनेट्स ने इस दृष्टिकोण का इस्तेमाल किया, और इसमें समाप्त होगा:

model = keras.Sequential([
    
    keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'), 
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dense(n_classes, activation='softmax')
])

हालांकि, किसी कारण से - यह अक्सर भूल जाता है कि वीजीजीनेट व्यावहारिक रूप से इस दृष्टिकोण का उपयोग करने के लिए अंतिम वास्तुकला था, क्योंकि यह स्पष्ट कम्प्यूटेशनल अड़चन पैदा करता है। जैसे ही ResNets, VGGNets (और 7 साल पहले) के ठीक एक साल बाद प्रकाशित हुआ, सभी मुख्यधारा के आर्किटेक्चर ने अपनी मॉडल परिभाषाओं को समाप्त कर दिया:

model = keras.Sequential([
    
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(n_classes, activation='softmax')
])

सीएनएन में चपटा 7 साल से अटका हुआ है। 7 साल! और ऐसा लगता है कि पर्याप्त लोग आपके सीखने के अनुभव और आपके द्वारा उपयोग किए जा रहे कम्प्यूटेशनल संसाधनों दोनों पर पड़ने वाले हानिकारक प्रभाव के बारे में बात नहीं कर रहे हैं।

ग्लोबल एवरेज पूलिंग कई खातों में फ़्लैटनिंग की तुलना में बेहतर है। यदि आप एक छोटे सीएनएन का प्रोटोटाइप बना रहे हैं - ग्लोबल पूलिंग का उपयोग करें। यदि आप किसी को सीएनएन के बारे में सिखा रहे हैं - ग्लोबल पूलिंग का उपयोग करें। यदि आप एमवीपी बना रहे हैं - ग्लोबल पूलिंग का उपयोग करें। अन्य उपयोग के मामलों के लिए समतल परतों का उपयोग करें जहां उनकी वास्तव में आवश्यकता होती है।

केस स्टडी - फ़्लैटनिंग बनाम ग्लोबल पूलिंग

ग्लोबल पूलिंग सभी फीचर मैप्स को एक में संघनित करता है, सभी प्रासंगिक सूचनाओं को एक ही मैप में पूल करता है जिसे कई परतों के बजाय एकल घने वर्गीकरण परत द्वारा आसानी से समझा जा सकता है। इसे आम तौर पर औसत पूलिंग के रूप में लागू किया जाता है (GlobalAveragePooling2D) या अधिकतम पूलिंग (GlobalMaxPooling2D) और 1D और 3D इनपुट के लिए भी काम कर सकता है।

फीचर मैप को समतल करने के बजाय जैसे (7, 7, 32) 1536 की लंबाई के एक वेक्टर में और इस लंबे वेक्टर से पैटर्न को समझने के लिए एक या कई परतों को प्रशिक्षित करना: हम इसे एक में संघनित कर सकते हैं (7, 7) वेक्टर और वहां से सीधे वर्गीकृत करें। यह इत्ना आसान है!

ध्यान दें कि ResNets जैसे नेटवर्क के लिए अड़चन परतों की गिनती केवल 1536 में नहीं, बल्कि हजारों सुविधाओं में होती है। समतल करते समय, आप अपने नेटवर्क को बहुत ही अक्षम तरीके से विषम-आकार वाले वैक्टर से सीखने के लिए यातना दे रहे हैं। कल्पना करें कि प्रत्येक पिक्सेल पंक्ति पर एक 2D छवि काटा जा रहा है और फिर एक फ्लैट वेक्टर में संयोजित किया गया है। दो पिक्सेल जो लंबवत रूप से 0 पिक्सेल अलग हुआ करते थे, वे नहीं हैं feature_map_width पिक्सेल क्षैतिज रूप से दूर! हालांकि यह एक वर्गीकरण एल्गोरिथ्म के लिए बहुत अधिक मायने नहीं रखता है, जो स्थानिक अपरिवर्तन का पक्षधर है - यह कंप्यूटर दृष्टि के अन्य अनुप्रयोगों के लिए भी अवधारणात्मक रूप से अच्छा नहीं होगा।

आइए एक छोटे प्रदर्शनकारी नेटवर्क को परिभाषित करें जो कुछ घनी परतों के साथ एक सपाट परत का उपयोग करता है:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.summary()

सारांश कैसा दिखता है?

...                                                              
 dense_6 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 11,574,090
Trainable params: 11,573,898
Non-trainable params: 192
_________________________________________________________________

एक खिलौना नेटवर्क के लिए 11.5M पैरामीटर - और बड़े इनपुट के साथ मापदंडों को विस्फोट करते हुए देखें। 11.5M पैरामीटर. EfficientNets, सबसे अच्छा प्रदर्शन करने वाले नेटवर्कों में से एक, जिसे ~ 6M मापदंडों पर काम करने के लिए डिज़ाइन किया गया है, और वास्तविक प्रदर्शन और डेटा से सीखने की क्षमता के मामले में इसकी तुलना इस सरल मॉडल से नहीं की जा सकती है।

हम नेटवर्क को गहरा बनाकर इस संख्या को काफी कम कर सकते हैं, जो फीचर मैप्स को समतल करने से पहले उन्हें कम करने के लिए अधिक अधिकतम पूलिंग (और संभावित रूप से स्ट्राइड कनवल्शन) पेश करेगा। हालांकि, इस बात पर विचार करें कि हम नेटवर्क को अधिक जटिल बनाने के लिए इसे कम कम्प्यूटेशनल रूप से महंगा बनाने के लिए, सभी एक परत के लिए जो योजनाओं में एक रिंच फेंक रहा है।

परतों के साथ गहराई तक जाना डेटा बिंदुओं के बीच अधिक सार्थक, गैर-रैखिक संबंधों को निकालने के लिए होना चाहिए, न कि एक समतल परत को पूरा करने के लिए इनपुट आकार को कम करना।

यहां ग्लोबल पूलिंग वाला नेटवर्क है:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(10, activation='softmax')
])

model.summary()

सारांश?

 dense_8 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 66,602
Trainable params: 66,410
Non-trainable params: 192
_________________________________________________________________

काफी बेहतर! यदि हम इस मॉडल के साथ गहराई से जाते हैं, तो पैरामीटर की संख्या बढ़ जाएगी, और हम नई परतों के साथ डेटा के अधिक जटिल पैटर्न को कैप्चर करने में सक्षम हो सकते हैं। हालांकि अगर इसे भोलेपन से किया जाता है, तो वही मुद्दे सामने आएंगे जो वीजीजीनेट को बाध्य करते हैं।

आगे बढ़ रहे हैं - हाथ से आयोजित एंड-टू-एंड प्रोजेक्ट

आपका जिज्ञासु स्वभाव आपको और आगे जाना चाहता है? हम अनुशंसा करते हैं कि हमारी जाँच करें निर्देशित परियोजना: "कन्वेंशनल न्यूरल नेटवर्क्स - बेसिक आर्किटेक्चर से परे".

सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!

मैं आपको कुछ समय की यात्रा पर ले जाऊंगा - 1998 से 2022 तक, पूरे वर्षों में विकसित परिभाषित आर्किटेक्चर पर प्रकाश डालना, जो उन्हें अद्वितीय बनाता है, उनकी कमियां क्या हैं, और उल्लेखनीय लोगों को खरोंच से लागू करें। जब इनकी बात आती है तो आपके हाथों पर कुछ गंदगी होने से बेहतर कुछ नहीं होता है।

आप यह जाने बिना कार चला सकते हैं कि इंजन में 4 या 8 सिलेंडर हैं और इंजन के भीतर वाल्वों की स्थिति क्या है। हालाँकि - यदि आप एक इंजन (कंप्यूटर विज़न मॉडल) को डिज़ाइन और उसकी सराहना करना चाहते हैं, तो आप थोड़ा और गहराई में जाना चाहेंगे। यहां तक ​​​​कि अगर आप आर्किटेक्चर डिजाइन करने में समय नहीं लगाना चाहते हैं और इसके बजाय उत्पादों का निर्माण करना चाहते हैं, जो कि ज्यादातर करना चाहते हैं - तो आपको इस पाठ में महत्वपूर्ण जानकारी मिलेगी। आप सीखेंगे कि वीजीजीनेट जैसे पुराने आर्किटेक्चर का उपयोग करने से आपके उत्पाद और प्रदर्शन को नुकसान क्यों पहुंचेगा, और यदि आप कुछ भी आधुनिक बना रहे हैं तो आपको उन्हें क्यों छोड़ना चाहिए, और आप सीखेंगे कि व्यावहारिक समस्याओं को हल करने के लिए आप किन आर्किटेक्चर पर जा सकते हैं और क्या पेशेवरों और विपक्ष प्रत्येक के लिए हैं।

यदि आप इस पाठ के संसाधनों का उपयोग करके अपने क्षेत्र में कंप्यूटर विज़न लागू करना चाह रहे हैं - तो आप नवीनतम मॉडल ढूंढ पाएंगे, समझ पाएंगे कि वे कैसे काम करते हैं और आप किस मानदंड से उनकी तुलना कर सकते हैं और निर्णय ले सकते हैं कि किस पर उपयोग।

आप नहीं करते आर्किटेक्चर और उनके कार्यान्वयन के लिए Google के पास है - उन्हें आम तौर पर कागजात में बहुत स्पष्ट रूप से समझाया जाता है, और केरस जैसे ढांचे इन कार्यान्वयन को पहले से कहीं ज्यादा आसान बनाते हैं। इस गाइडेड प्रोजेक्ट का मुख्य उद्देश्य आपको आर्किटेक्चर और पेपर्स को खोजना, पढ़ना, कार्यान्वित करना और समझना सिखाना है। दुनिया में कोई भी संसाधन सभी नवीनतम विकासों को बनाए रखने में सक्षम नहीं होगा। मैंने यहां नवीनतम पेपर शामिल किए हैं - लेकिन कुछ महीनों में, नए पेपर सामने आएंगे, और यह अपरिहार्य है। यह जानने के लिए कि विश्वसनीय कार्यान्वयन कहाँ से प्राप्त करें, उनकी तुलना कागज़ात से करें और उन्हें ट्वीक करें, आपको कई कंप्यूटर विज़न उत्पादों के लिए आवश्यक प्रतिस्पर्धात्मक बढ़त प्रदान कर सकते हैं जिन्हें आप बनाना चाहते हैं।

निष्कर्ष

इस संक्षिप्त मार्गदर्शिका में, हमने CNN आर्किटेक्चर डिज़ाइन में फ़्लैटनिंग के विकल्प पर एक नज़र डाली है। अलबीट शॉर्ट - गाइड प्रोटोटाइप या एमवीपी डिजाइन करते समय एक सामान्य मुद्दे को संबोधित करता है, और आपको फ़्लैटनिंग के बेहतर विकल्प का उपयोग करने की सलाह देता है।

कोई भी अनुभवी कंप्यूटर विजन इंजीनियर इस सिद्धांत को जानेगा और लागू करेगा, और अभ्यास को मान लिया गया है। दुर्भाग्य से, यह नए अभ्यासियों के लिए ठीक से संबंधित नहीं लगता है जो अभी-अभी क्षेत्र में प्रवेश कर रहे हैं, और चिपचिपी आदतें पैदा कर सकते हैं जिनसे छुटकारा पाने में थोड़ा समय लगता है।

यदि आप कंप्यूटर विज़न में प्रवेश कर रहे हैं - अपने आप पर एक एहसान करें और अपनी सीखने की यात्रा में वर्गीकरण शीर्षों से पहले समतल परतों का उपयोग न करें।

समय टिकट:

से अधिक स्टैकब्यूज