alikarimi120
alikarimi120
خواندن ۳ دقیقه·۳ سال پیش

پیاده سازی اولین شبکه عصبی برای طبقه بندی تصاویر با استفاده از پایتورچ (قسمت سوم)


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

کتابخانه PyTorch
کتابخانه PyTorch

روش ساخت و آموزش شبکه در پایتورچ :

پکیج دیگه ای که در کنار AutoGrad باهاش کار داریم پکیج nn.Module هست، در حقیقت این پیکیج دارای تعریف لایه های پیش فرض هست و یک مجموعه template در این پکیج داریم که می تونیم استفاده کنیم.

https://gist.github.com/alikarimi120/3da625140a5af3a7034d872b06263534


یک رویه متداول برای آموزش به این شکل است:

1- ابتدا شبکه رو تعریف می کنیم که حتما یک سری پارامترهای قابل تنظیم داره یا به عبارتی قابل آموزش دادن هستند و به عبارت زبان پایتورچ یک سری تنسور داره که requires_grad اونها True هست.

2 - یک دیتاست داریم که به صورت batch به batch به شبکه می دیم.

3- داده های ورودی پردازش میشه

4 - بر اساس تابع هزینه یا همون loss function مقدار Loss رو محاسبه می کنیم

5 - گرادیان ها رو بدست میاریم

6 - با استفاده از گرادیان ها و قاعده optimizer وزن ها رو آپدیت می کنیم.


تعریف شبکه :

از پکیج nn استفاده می کنیم . هر شبکه رو به صورت یک کلاس تعریف می کنیم و از کلاس instance میسازیم، همه کلاس ها یک ارث بری از nn.Module انجام می دهند. تابع init در اینجا برای مقداردهی اولیه شبکه استفاده میشه، در این تابع همانطور که در کد زیر می بیند تابع init کلاس nn.Module با استفاده از دستور super فراخوانی میشه و در ادامه لایه های کانولوشنی و طبقه بندی تعریف می شوند.

https://gist.github.com/alikarimi120/0f7824fc8dd795333a5ce9dc5c5b6946

در تابع forward اول x دریافت میشه و کانولوشن اعمال میشه سپس تابع فعالساز ReLU اعمال میشه و در نهایت لایه maxpooling اعمال میشه. این روند یک بار دیگه تکرار میشه و در انتها از لایه flatten برای تبدیل feature map ها به یک بردار استفاده میشه و بعد از چند لایه طبقه بند نهایتا خروجی ساخته میشه و برگردانده میشه.

تابع num_flat_features هم تعداد feature ها رو محاسبه میکنه

در نهایت از کلاس Net یک instance ساخته میشه و قابل استفاده هست.

دقت داشته باشید نیازی به تعریف تابع backward نیست، تابع backward با توجه به ساختار شبکه که تعریف کردیم به صورت اتوماتیک درست میشه.

https://gist.github.com/alikarimi120/f1fd4256a0d34379d9d8ee22e5af21e0

همانطور که می بینید یک tensor ورودی ساختیم که به شبکه میدیم که این اجرای گام forward هست و بعد اینکه خروجی حساب شد به گام بعدی میریم

https://gist.github.com/alikarimi120/c572acd00317fd5bd20e3984acbab527

مقدار گرادیان ها رو محاسبه می کنیم.

https://gist.github.com/alikarimi120/8f06ded40165e3be8419fac91c4b5fed

تابع هزینه :

وقتی ورودی رو داریم، که در واقعیت یک دسته از ورودی ها هست، این دسته رو به شبکه میدیم و خروجی بدست میاد، در نظر بگیرید که هدف واقعی رو هم داریم ، یک تابع هزینه هم تعریف می کنیم که در اینجا از mse loss استفاده کردیم، در حقیقت اینجا instance ای از mse loss ایجاد کردیم. اینجا mse loss اختلاف بین هدف و خروجی رو محاسبه میکنه.

https://gist.github.com/alikarimi120/2bcc33b52e82ba66eea36f88e0739e67

گرادیان ها در این مرحله حساب میشن.

https://gist.github.com/alikarimi120/721271175cd09557e2977d431d9f9170

دقت داشته باشید توابع هزینه های مختلفی می تونیم استفاده کنیم و محدود به این توابع هزینه نیست.

به روزرسانی وزن ها:

قاعده های مختلفی مثل SGD داریم ، یا Adam ، می تونید راجع به Optimizer ها از اینجا بخونید.

وقتی از optimizer استفاده می کنیم در حقیقت قاعده به روزرسانی وزن ها رو تنظیم می کنیم، اگه این optimizer های پایتورچ وجود نداشت مجبور بودیم گام به روزرسانی وزن ها رو دستی انجام بدیم.

https://gist.github.com/alikarimi120/fa2343cc9ae0a9db1206b90f7d1e40e3

ماژول optim برای استفاده از optimizer ها هست که ما در اینجا از SGD استفاده می کنیم و اینجا مقدار پارامترها رو به این optimizer پاس میدیم.

https://gist.github.com/alikarimi120/ef7109b49ec53f440891021d94636575

با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت دوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت پایانی به این لینک مراجعه کنید.

شاید از این پست‌ها خوشتان بیاید