سلام ، امیدوارم از مطالب تا اینجا استفاده برده باشید، تو این قسمت میخوام در مورد نحوه ساخت و آموزش شبکه عصبی در پایتورچ صحبت کنم.
روش ساخت و آموزش شبکه در پایتورچ :
پکیج دیگه ای که در کنار AutoGrad باهاش کار داریم پکیج nn.Module هست، در حقیقت این پیکیج دارای تعریف لایه های پیش فرض هست و یک مجموعه template در این پکیج داریم که می تونیم استفاده کنیم.
یک رویه متداول برای آموزش به این شکل است:
1- ابتدا شبکه رو تعریف می کنیم که حتما یک سری پارامترهای قابل تنظیم داره یا به عبارتی قابل آموزش دادن هستند و به عبارت زبان پایتورچ یک سری تنسور داره که requires_grad اونها True هست.
2 - یک دیتاست داریم که به صورت batch به batch به شبکه می دیم.
3- داده های ورودی پردازش میشه
4 - بر اساس تابع هزینه یا همون loss function مقدار Loss رو محاسبه می کنیم
5 - گرادیان ها رو بدست میاریم
6 - با استفاده از گرادیان ها و قاعده optimizer وزن ها رو آپدیت می کنیم.
تعریف شبکه :
از پکیج nn استفاده می کنیم . هر شبکه رو به صورت یک کلاس تعریف می کنیم و از کلاس instance میسازیم، همه کلاس ها یک ارث بری از nn.Module انجام می دهند. تابع init در اینجا برای مقداردهی اولیه شبکه استفاده میشه، در این تابع همانطور که در کد زیر می بیند تابع init کلاس nn.Module با استفاده از دستور super فراخوانی میشه و در ادامه لایه های کانولوشنی و طبقه بندی تعریف می شوند.
در تابع forward اول x دریافت میشه و کانولوشن اعمال میشه سپس تابع فعالساز ReLU اعمال میشه و در نهایت لایه maxpooling اعمال میشه. این روند یک بار دیگه تکرار میشه و در انتها از لایه flatten برای تبدیل feature map ها به یک بردار استفاده میشه و بعد از چند لایه طبقه بند نهایتا خروجی ساخته میشه و برگردانده میشه.
تابع num_flat_features هم تعداد feature ها رو محاسبه میکنه
در نهایت از کلاس Net یک instance ساخته میشه و قابل استفاده هست.
دقت داشته باشید نیازی به تعریف تابع backward نیست، تابع backward با توجه به ساختار شبکه که تعریف کردیم به صورت اتوماتیک درست میشه.
همانطور که می بینید یک tensor ورودی ساختیم که به شبکه میدیم که این اجرای گام forward هست و بعد اینکه خروجی حساب شد به گام بعدی میریم
مقدار گرادیان ها رو محاسبه می کنیم.
تابع هزینه :
وقتی ورودی رو داریم، که در واقعیت یک دسته از ورودی ها هست، این دسته رو به شبکه میدیم و خروجی بدست میاد، در نظر بگیرید که هدف واقعی رو هم داریم ، یک تابع هزینه هم تعریف می کنیم که در اینجا از mse loss استفاده کردیم، در حقیقت اینجا instance ای از mse loss ایجاد کردیم. اینجا mse loss اختلاف بین هدف و خروجی رو محاسبه میکنه.
گرادیان ها در این مرحله حساب میشن.
دقت داشته باشید توابع هزینه های مختلفی می تونیم استفاده کنیم و محدود به این توابع هزینه نیست.
به روزرسانی وزن ها:
قاعده های مختلفی مثل SGD داریم ، یا Adam ، می تونید راجع به Optimizer ها از اینجا بخونید.
وقتی از optimizer استفاده می کنیم در حقیقت قاعده به روزرسانی وزن ها رو تنظیم می کنیم، اگه این optimizer های پایتورچ وجود نداشت مجبور بودیم گام به روزرسانی وزن ها رو دستی انجام بدیم.
ماژول optim برای استفاده از optimizer ها هست که ما در اینجا از SGD استفاده می کنیم و اینجا مقدار پارامترها رو به این optimizer پاس میدیم.
با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت دوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت پایانی به این لینک مراجعه کنید.