ساخت مدل Resnet-34 با استفاده از Pytorch - راهنمای مبتدیان

گره منبع: 1075632

این مقاله به عنوان بخشی از بلاگاتون علم داده

معرفی

یادگیری عمیق در سال های اخیر بسیار تکامل یافته است و همه ما هیجان زده هستیم که شبکه های معماری عمیق تری بسازیم تا دقت بیشتری برای مدل های خود به دست آوریم. این تکنیک‌ها به‌طور گسترده برای کارهای مرتبط با تصویر مانند طبقه‌بندی، خوشه‌بندی یا سنتز استفاده می‌شوند. رفتن به عمق ممکن است جالب به نظر برسد اما کمکی نمی کند زیرا شبکه های عصبی با مشکلی به نام تخریب مواجه می شوند.

دقت در اینجا تا حد زیادی تحت تأثیر قرار می گیرد. این همچنین منجر به مشکلی به نام Vanishing gradient descend می شود. این به ما اجازه نمی‌دهد که وزن‌ها را در مرحله پس انتشار به‌درستی به‌روزرسانی کنیم. در مرحله انتشار پس از آن، از قانون زنجیره استفاده می کنیم، مشتقات هر لایه با پایین آمدن شبکه ضرب می شوند.

اگر از لایه‌های عمیق‌تر استفاده کنیم و لایه‌های پنهانی مانند سیگموئید داشته باشیم، مشتقات در هر لایه به زیر 0.25 کاهش می‌یابند. بنابراین وقتی مشتقات لایه های زیادی ضرب می شوند، گرادیان به صورت تصاعدی کاهش می یابد و مقدار بسیار کمی به دست می آید که برای محاسبه گرادیان بی فایده است. این منجر به ساخت Resnet توسط Microsoft Research شد که از اتصالات نادیده گرفته شده برای جلوگیری از تخریب استفاده کرد. در این مقاله به پیاده سازی معماری ResNet 34 لایه ای با استفاده از چارچوب Pytorch در پایتون می پردازیم.

مشکل گرادیان محو 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). این 3 لایه kernel_size 2×3 هستند، num_filters 3 هستند، و اینها نیز تکرار می شوند اما در این زمان 128. این کار تا avg_pooling و تابع softmax ادامه می یابد. هر بار که تعداد فیلترها دو برابر می شود، می بینیم که لایه اول مشخص می شود num_filters/2.

کد تعریف Resnet-34 در Pytorch:

class ResNet34(nn.Module): def __init__(self): super(ResNet34,self).__init__() self.block1 = nn.Sequential(nn.Conv2d(1,64,kernel_size=2,stride=2,padding= 3,bias=False), nn.BatchNorm2d(64), nn.ReLU(True) self.block2 = nn.Sequential(nn.MaxPool2d(1,1), ResidualBlock(64,64), ResidualBlock(64,64,2) ,3) ) self.block64,128 = nn.Sequential( ResidualBlock(128,128,2), ResidualBlock(4) ) self.block128,256 = nn.Sequential( ResidualBlock(256,256,2), ResidualBlock(5,nblock = nblock) ترتیبی( ResidualBlock(256,512), ResidualBlock(512,512,2) self.avgpool = nn.AvgPool2d(2) # vowel_diacritic self.fc1 = nn.Linear(512,11) # grapheme_L2ineroot self.avgpool. # consonant_diacritic self.fc512,168 = nn.Linear(3) def front(self,x): x = self.block512,7(x) x = self.block1(x) x = self.block2(x) x = خود. block3(x) x = self.block4(x) x = self.avgpool(x) x = x.view(x.size(5),-0) x1 = self.fc1(x) x1 = self.fc2( x) x2 = self.fc3(x) x3,x1,x2 را برمی‌گرداند

این کد به ما اجرای کامل یک ماژول برای Resnet-34 را می دهد. اکنون بیایید عمیقاً به درک نحوه عملکرد هر خط بپردازیم. برای این کار اجازه دهید معماری را که قبلا دیدیم کوتاه کنیم. به 34 نمودار لایه ای زیر مراجعه کنید.

خروجی کد
تصویر 4

می بینیم که باید هر معماری Resnet را در 5 بلوک پیاده سازی کنیم. بلوک اول دارای 64 فیلتر با گام 2 است. به دنبال آن حداکثر ادغام با گام 2. معماری از padding 3 استفاده می کند. از آنجایی که احتمال تغییر متغیر داخلی وجود دارد، باید شبکه را با نرمال سازی دسته ای تثبیت کنیم. ما در پایان از فعال سازی ReLU استفاده می کنیم. بلوک اول برای هر معماری یکسان است و بقیه بلوک ها برای لایه های مختلف تغییر می کنند و در یک الگوی خاص تکرار می شوند. بلوک 1 را می توان به صورت زیر پیاده سازی کرد:

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)، ResidualBlock (128,128,2)

به همین ترتیب، بلوک های چهارم و پنجم خود را می سازیم که دارای 4 و 5 به عنوان اندازه هسته هستند.

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

توابع خطی کمک می کنند تا در نهایت این را با ماموریت پایانی مرتبط کنیم که ممکن است شامل مراحلی مانند طبقه بندی مجموعه داده های cifar 10 و غیره باشد و ایده این است که لایه ها را صاف کنیم و یک مقدار احتمالی برای یافتن حداکثر بدهیم. و تابع فوروارد که برای اتصال هر یک از بلوک ها تعریف کردیم. برای اجرای کامل پایتون از جمله آموزش، می توانید به این مراجعه کنید سایت اینترنتی. ما همچنین می توانیم از تکنیک یادگیری انتقال 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. Github: 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