بناء نموذج Resnet-34 باستخدام Pytorch - دليل للمبتدئين

عقدة المصدر: 1075632

تم نشر هذه المقالة كجزء من مدونة علوم البيانات

المُقدّمة

تعلم عميق لقد تطورت كثيرًا في السنوات الأخيرة ونحن جميعًا متحمسون لبناء شبكات معمارية أعمق لاكتساب المزيد من الدقة لنماذجنا. تمت تجربة هذه التقنيات على نطاق واسع للأعمال المتعلقة بالصور مثل التصنيف أو التجميع أو التوليف. قد يبدو التعمق في الأمر رائعًا ولكنه لن يساعد لأن الشبكات العصبية تواجه مشكلة تسمى التدهور.

الدقة تتأثر إلى حد كبير هنا. يؤدي هذا أيضًا إلى مشكلة تسمى هبوط التدرج التلاشي. لن يسمح لنا هذا بتحديث الأوزان بشكل صحيح أثناء خطوة backpropagation. أثناء خطوة التكاثر العكسي ، نستخدم قاعدة السلسلة ، حيث تتضاعف مشتقات كل طبقة أثناء نزولنا إلى أسفل الشبكة.

إذا استخدمنا طبقات أعمق ولدينا طبقات مخفية مثل السيني ، فسيتم تصغير المشتقات إلى أقل من 0.25 داخل كل طبقة. لذلك عندما يتم ضرب الكثير من مشتقات الطبقات ، يتناقص التدرج أضعافًا مضاعفة ونحصل على قيمة صغيرة جدًا لا تفيد في حساب التدرج. أدى هذا إلى إنشاء Resnet بواسطة Microsoft Research الذي يستخدم الاتصالات المتخطية لتجنب التدهور. في هذه المقالة ، سنناقش تنفيذ 34 بنية ResNet ذات طبقات باستخدام إطار عمل Pytorch في Python.

مشكلة التدرج المتلاشي Resnet-34
صورة 1

كما نوقش أعلاه يوضح لنا هذا الرسم البياني مشكلة التدرج المتلاشي. يتم تصغير مشتقات الدوال السينية إلى أقل من 0.25 وهذا يفقد الكثير من المعلومات أثناء تحديث التدرجات.

مشكلة شبكات الطائرة

مشكلة مع الشبكات العادية
صورة 2

كما هو موضح في الشكل ، نرى الشبكات المستوية التي لها طبقات أعمق. على اليسار ، لدينا خطأ في القطار وخطأ اختبار على اليمين. سوف نفكر في أن هذا يمكن أن يكون دعوى ضد فرط التجهيز ، ولكن هنا الخطأ ٪ من شبكة 56 طبقة أسوأ بكثير في كل من التدريب وكذلك بيانات الاختبار التي لا تحدث عندما يكون النموذج غير مناسب. هذا يسمى التدهور.

عمارة Resnet-34

عمارة Resnet-34
صورة 3

في البداية ، لدينا طبقة تلافيفية بها 64 مرشحًا بحجم نواة 7 × 7 وهذا هو الإلتواء الأول ثم متبوعة بطبقة max-pooling. لدينا الخطوة المحددة 2 في كلتا الحالتين. بعد ذلك ، في conv2_x لدينا طبقة التجميع وطبقات الالتفاف التالية. عادة ما يتم تجميع هذه الطبقات في أزواج بسبب الطريقة التي يتم بها توصيل المخلفات (تظهر الأسهم أنها تقفز كل طبقتين).

هنا ، لدينا طبقتان لهما حجم_نواة 2 × 3 ، وعدد_فلترات 3 ، وكل هذه تتكرر x64 ، والتي تتوافق مع الطبقات بين التجمع ، / 3 والمرشح 2 طبقة ، 128 طبقات في المجموع (واحدة مرات الزوج 6). هاتان الطبقتان هما kernel_size 3 × 2 ، و num_filters هو 3 ، وتتكرر هذه أيضًا ولكن في هذه الأوقات 3. يستمر هذا حتى وظيفة avg_pooling ووظيفة softmax. في كل مرة يتضاعف فيها عدد المرشحات ، يمكننا رؤية تحديد الطبقة الأولى عدد_فلاتر / 2.

رمز لتعريف Resnet-34 في Pytorch:

فئة ResNet34 (nn.Module): def __init __ (self): super (ResNet34، self) .__ init __ () self.block1 = nn.Sequential (nn.Conv2d (1,64،2، kernel_size = 2، stride = 3، padding = 2، bias = False)، nn.BatchNorm64d (2)، nn.ReLU (True)) self.block2 = nn.Sequential (nn.MaxPool1,1d (64,64،64,64,2)، ResidualBlock (3،64,128)، ResidualBlock (128,128,2،4) ، 128,256)) self.block256,256,2 = nn.Sequential (ResidualBlock (5،256,512)، ResidualBlock (512,512,2،2،2)) self.block1 = nn.Sequential (ResidualBlock (512,11،2)، ResidualBlock (512,168،3،512,7)) self.block1 = nn. متسلسلة (ResidualBlock (2،3)، ResidualBlock (4،5،0)) self.avgpool = nn.AvgPool1d (1) # vowel_diacritic self.fc1 = nn.Linear (2،2) # grapheme_root self.fc3 = nn.Linear (3،1) # silant_diacritic self.fc2 = nn.inear (3،XNUMX) def forward (self، x): x = self.blockXNUMX (x) x = self.blockXNUMX (x) x = self.blockXNUMX (x) x = self. blockXNUMX (x) x = self.blockXNUMX (x) x = self.avgpool (x) x = x.view (x.size (XNUMX)، - XNUMX) xXNUMX = self.fcXNUMX (x) xXNUMX = self.fcXNUMX ( x) xXNUMX = self.fcXNUMX (x) تُرجع xXNUMX ، xXNUMX ، xXNUMX

يمنحنا هذا الرمز التنفيذ الكامل لوحدة نمطية لـ Resnet-34. الآن دعونا نتعمق في فهم كيفية عمل كل سطر. لهذا دعونا نقصر البنية التي رأيناها سابقًا. راجع الرسوم التخطيطية ذات الطبقات الـ 34 أدناه.

إخراج الكود
صورة 4

يمكننا أن نرى أننا بحاجة إلى تنفيذ أي بنية Resnet في 5 كتل. تحتوي الكتلة الأولى على 64 مرشحًا بخطوة 2. متبوعة بالتجمع الأقصى مع الخطوة 2. تستخدم البنية حشوة 3. نظرًا لوجود فرصة لتغيير المتغير الداخلي ، يجب علينا تثبيت الشبكة عن طريق تسوية الدُفعات. نستخدم تنشيط ReLU في النهاية. الكتلة الأولى هي نفسها لأي بنية ويتم تغيير الكتل الباقية لطبقات مختلفة وتتكرر في نمط معين. يمكن تنفيذ الكتلة الأولى على النحو التالي:

nn.Conv2d(1,64,kernel_size=2,stride=2,padding=3,bias=False),
nn.BatchNorm2d(64),
nn.ReLU(True)

في هذه المرحلة ، لدينا اتصال تخطي. وهي الفكرة الرئيسية للشبكات المتبقية. الرسم التخطيطي للهندسة المعمارية الذي رأيناه سابقًا قد تخطى الروابط التي تظهر بأسهم منقطة ومظلمة. الخط المنقط هو ما يحدث هنا لأننا ننتقل إلى قناة بحجم أكبر من القناة السابقة. تحتوي الكتلة الثانية على مجموعة أولية بحد أقصى 1 * 1 بحجم نواة 3 * 3 وكتلتين متبقيتين كما هو موضح في الكود أدناه. يأخذ هذان الرقمان 64 كقنوات إدخال وإخراج ويتكرر 3 مرات كما هو موضح في الهندسة المعمارية. في النهاية ، يتم توصيل الأخير بالكتلة التالية بخطوة 2.

nn.MaxPool2d (1,1،64,64)، ResidualBlock (64,64,2،XNUMX)، ResidualBlock (XNUMX،XNUMX،XNUMX)

تم تكرار محتوى الكتلة الأخيرة 3 مرات وقد أشرنا إلى أنه مع وجود السهم المظلم في مخطط البنية ويظل حجم قناة الإدخال والإخراج كما هو. يخبرنا "/ 2" الموضح في الرسم التخطيطي للهندسة المعمارية عن الخطوة المستخدمة.

الكتلة الثالثة تأخذ حجم نواة 3 * 3 مع قناة إدخال قادمة من الكتلة الأخيرة 64 وتعطي قناة إخراج 128. ثم نأخذ نفس 128 كمدخل و 128 كقناة إخراج. نكرر هذا 4 مرات كما هو موضح في الرسم التخطيطي للهندسة المعمارية السابق.

ResidualBlock (64,128،128,128,2)، ResidualBlock (XNUMX،XNUMX،XNUMX)

وبالمثل ، فإننا نبني كتلنا الرابعة والخامسة التي تحتوي على 4 و 5 كأحجام نواة.

ResidualBlock (128,256،256,256,2)، ResidualBlock (XNUMX،XNUMX،XNUMX)
ResidualBlock (256,512،512,512,2)، ResidualBlock (XNUMX،XNUMX،XNUMX)

تساعد الوظائف الخطية على ربط هذا أخيرًا بالمهمة النهائية التي قد تتضمن خطوات مثل تصنيف مجموعات بيانات سيفار 10 ، وما إلى ذلك ، والفكرة هي تسوية الطبقات وإعطاء قيمة احتمالية للعثور على الحد الأقصى. والدالة الأمامية التي حددناها لربط كل من الكتل. لتطبيق Python الكامل بما في ذلك التدريب ، يمكنك الرجوع إلى هذا موقع الكتروني. يمكننا أيضًا الاستفادة من تقنية تعلم النقل الخاصة بـ Pytorch ومن أجل هذا الرمز ، يمكنك الرجوع إلى GitHub هذا الريبو.

الخلاصة:

مرجع:

  1. https://www.kaggle.com/khoongweihao/resnet-34-pytorch-starter-kit
  2. https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types

عني: أنا طالب باحث مهتم بمجال التعلم العميق ومعالجة اللغة الطبيعية وأتابع حاليًا التخرج في الذكاء الاصطناعي.

مصدر الصورة

  1. الصورة 1,2 ، 69: https://towardsdatascience.com/the-vanishing-gradient-problem-08bf15484bXNUMX
  2. الصورة 3,4،33022: https://datascience.stackexchange.com/questions/50/how-to-interpert-resnetXNUMX-layer-types
  3. معاينة الصورة: https://www.zdnet.com/pictures/10-cool-robots-at-this-years-robobusiness-conference/2/

لا تتردد في التواصل معي على:

  1. لينكد إن: https://www.linkedin.com/in/siddharth-m-426a9614a/
  2. جيثب: https://github.com/Siddharth1698

الوسائط الموضحة في هذه المقالة على ResNet-34 ليست مملوكة لشركة Analytics Vidhya ويتم استخدامها وفقًا لتقدير المؤلف.

المصدر: https://www.analyticsvidhya.com/blog/2021/09/building-resnet-34-model-using-pytorch-a-guide-for-beginners/

الطابع الزمني:

اكثر من تحليلات Vidhya