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

سلام، امیدوارم تا قسمت پایانی خسته نشده باشید، در ادامه مطالب در قسمت پایانی نحوه آموزش یک طبقه بند تصویر رو به شما توضیح بدم، امیدوارم از مطالب استفاده ببرید.کتابخانه pyTorchآموزش طبقه بند :داده ها رو چطور باید استفاده کنیم؟ داده ها می تونن صدا، تصویر، متن یا حتی ویدیو باشند، ابزارهای استانداردی از قبل برای کار با این داده ها وجود داشته که می تونستیم این داده ها رو داخل آرایه های NumPy بارگذاری کنیم، چون پکیج های آماده برای NumPy وجود داره می تونیم اول اونها رو داخل NumPy array بارگذاری کنیم و بعد به تنسور تبدیل کنیم. به طور خاص برای بینایی ماشین کتابخانه Torchvision رو داریم که Dataloader های خوبی برای دیتاست های benchmark تعریف شده مانند CIFAR10 و MNIST ، برای این دیتاست ها loader ها به طور پیش فرض تو کتابخانه تعریف شده است.برای load کردن داده های CIFAR10 از Torchvision استفاده می کنیم. روند به این صورت است که ابتدا داده ها دریافت میشه ، در ادامه نیاز به نرمالسازی داریم که از تابع transform کتابخانه Torchvision استفاده می کنیم . با استفاده از Torchvision مسیر دانلود مجموعه داده برای آموزش و تست رو تعیین می کنیم. همچنین سایز batch ها رو هم تعیین می کنیم، به طور مثال در اینجا اندازه batch رو 4 تعیین کردیم، همینطور می تونیم تعیین کنیم که آیا داده ها shuffle بشود یا خیر و تعداد worker ها رو هم تعریف کنیم که تعدادشون بستگی به GPU ما داره، در ادامه کلاس های موجود رو هم تعریف می کنیم. https://gist.github.com/alikarimi120/05b44233e26248531597842185d652f2 نمونه ای از نحوه نمایش تصاویر مجموعه داده CIFAR10 رو در این قطعه کد مشاهده می کنید. https://gist.github.com/alikarimi120/d5f078dcd56fe91f5cae1408fc6f0855 نمونه داده های CIFAR10در ادامه در گام اول آموزش شبکه، شبکه را تعریف می کنیم که شبکه ای تشکیل شده از لایه های کانولوشنی و طبقه بندی هست. https://gist.github.com/alikarimi120/f6b5eab238c2d5a907c56695a860ec44 تابع هزینه رو تعریف می کنیم که اینجا تابع هزینه Cross Entropy هست ، همینطور Optimizer رو SGD تعریف می کنیم. https://gist.github.com/alikarimi120/0567dc483a2215e461a6fab43b953d90 در این مرحله حلقه آموزش شروع میشه، به تعداد epoch ای که میخواهیم شبکه رو آموزش بدیم حلقه for رو اجرا می کنیم که در اینجا برابر با 2 هست. یک حلقه روی batch هایی که از train loader دریافت میشه اجرا میشه . بعد از دریافت داده ها گرادیان رو صفر می کنیم و از روی ورودی با استفاده از شبکه خروجی رو حساب می کنیم و با استفاده از تابع هزینه اختلاف میان هدف و خروجی رو محاسبه می کنیم و نهایتا گرادیان رو بدست میاریم و با استفاده از optimizer وزن های شبکه رو به روزرسانی می کنیم. https://gist.github.com/alikarimi120/e915ca3207c507f4a2d28e1fc43f4dea یکی از گام های مهم، ذخیره مدل هست که با استفاده از دستور زیر مدل رو ذخیره می کنید. https://gist.github.com/alikarimi120/1c32717795b33f094cca0ff1bffcd39e حالا بعد از آموزش نوبت تست هست و برای این کار از loader مجموعه داده تست استفاده میکنیم با استفاده از تابع iter یک batch برای تست دریافت می کنیم. https://gist.github.com/alikarimi120/086724c7a6f526035d3db0b28cdcf698 حالا این batch رو به شبکه میدیم و برای اینکار یک instance از شبکه میسازیم و وزن های ساخته شده رو load می کنیم و با استفاده از آن ورودی رو به شبکه میدیم و خروجی محاسبه میشه. می دونید که خروجی ما یک بردار هست که به ازای هر دسته احتمال اون دسته هم قرار داره. https://gist.github.com/alikarimi120/b52c0222490b4970d0b02561361511ee در این گام می بینیم حداکثر مقدار بردار خروجی متعلق به کدوم دسته است و آیا شبکه ما به درستی پیش بینی رو انجام داده یا نه. https://gist.github.com/alikarimi120/c39fd4d74db5d478c97461e8d4d3cd9b یک گام خیلی مهم در فرآیند آموزش شبکه عصبی، ارزیابی مناسب مدل است، در انتها تمام داده های تست رو برای ارزیای مدل استفاده می کنیم، یادمون باشه با استفاده از دستور with torch_no_grad مشخص کنیم که شبکه نیاز به بروزرسانی نداره چون فقط داریم ارزیابی می کنیم. https://gist.github.com/alikarimi120/02913836281c2add982fad4ae76d8264 حالا چطور مدل رو روی GPU اجرا کنیم؟تابع torch.device("gpu") رو فراخوانی می کنیم که اجرای مدل به GPU منتقل بشه. https://gist.github.com/alikarimi120/935efd64e3ce227512344c8184163e03 با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت دوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت سوم به این لینک مراجعه کنید.