سلام، امیدوارم تا قسمت پایانی خسته نشده باشید، در ادامه مطالب در قسمت پایانی نحوه آموزش یک طبقه بند تصویر رو به شما توضیح بدم، امیدوارم از مطالب استفاده ببرید.
آموزش طبقه بند :
داده ها رو چطور باید استفاده کنیم؟ داده ها می تونن صدا، تصویر، متن یا حتی ویدیو باشند، ابزارهای استانداردی از قبل برای کار با این داده ها وجود داشته که می تونستیم این داده ها رو داخل آرایه های NumPy بارگذاری کنیم، چون پکیج های آماده برای NumPy وجود داره می تونیم اول اونها رو داخل NumPy array بارگذاری کنیم و بعد به تنسور تبدیل کنیم. به طور خاص برای بینایی ماشین کتابخانه Torchvision رو داریم که Dataloader های خوبی برای دیتاست های benchmark تعریف شده مانند CIFAR10 و MNIST ، برای این دیتاست ها loader ها به طور پیش فرض تو کتابخانه تعریف شده است.
برای load کردن داده های CIFAR10 از Torchvision استفاده می کنیم. روند به این صورت است که ابتدا داده ها دریافت میشه ، در ادامه نیاز به نرمالسازی داریم که از تابع transform کتابخانه Torchvision استفاده می کنیم . با استفاده از Torchvision مسیر دانلود مجموعه داده برای آموزش و تست رو تعیین می کنیم. همچنین سایز batch ها رو هم تعیین می کنیم، به طور مثال در اینجا اندازه batch رو 4 تعیین کردیم، همینطور می تونیم تعیین کنیم که آیا داده ها shuffle بشود یا خیر و تعداد worker ها رو هم تعریف کنیم که تعدادشون بستگی به GPU ما داره، در ادامه کلاس های موجود رو هم تعریف می کنیم.
نمونه ای از نحوه نمایش تصاویر مجموعه داده CIFAR10 رو در این قطعه کد مشاهده می کنید.
در ادامه در گام اول آموزش شبکه، شبکه را تعریف می کنیم که شبکه ای تشکیل شده از لایه های کانولوشنی و طبقه بندی هست.
تابع هزینه رو تعریف می کنیم که اینجا تابع هزینه Cross Entropy هست ، همینطور Optimizer رو SGD تعریف می کنیم.
در این مرحله حلقه آموزش شروع میشه، به تعداد epoch ای که میخواهیم شبکه رو آموزش بدیم حلقه for رو اجرا می کنیم که در اینجا برابر با 2 هست. یک حلقه روی batch هایی که از train loader دریافت میشه اجرا میشه . بعد از دریافت داده ها گرادیان رو صفر می کنیم و از روی ورودی با استفاده از شبکه خروجی رو حساب می کنیم و با استفاده از تابع هزینه اختلاف میان هدف و خروجی رو محاسبه می کنیم و نهایتا گرادیان رو بدست میاریم و با استفاده از optimizer وزن های شبکه رو به روزرسانی می کنیم.
یکی از گام های مهم، ذخیره مدل هست که با استفاده از دستور زیر مدل رو ذخیره می کنید.
حالا بعد از آموزش نوبت تست هست و برای این کار از loader مجموعه داده تست استفاده میکنیم با استفاده از تابع iter یک batch برای تست دریافت می کنیم.
حالا این batch رو به شبکه میدیم و برای اینکار یک instance از شبکه میسازیم و وزن های ساخته شده رو load می کنیم و با استفاده از آن ورودی رو به شبکه میدیم و خروجی محاسبه میشه. می دونید که خروجی ما یک بردار هست که به ازای هر دسته احتمال اون دسته هم قرار داره.
در این گام می بینیم حداکثر مقدار بردار خروجی متعلق به کدوم دسته است و آیا شبکه ما به درستی پیش بینی رو انجام داده یا نه.
یک گام خیلی مهم در فرآیند آموزش شبکه عصبی، ارزیابی مناسب مدل است، در انتها تمام داده های تست رو برای ارزیای مدل استفاده می کنیم، یادمون باشه با استفاده از دستور with torch_no_grad مشخص کنیم که شبکه نیاز به بروزرسانی نداره چون فقط داریم ارزیابی می کنیم.
حالا چطور مدل رو روی GPU اجرا کنیم؟
تابع torch.device("gpu") رو فراخوانی می کنیم که اجرای مدل به GPU منتقل بشه.
با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت دوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت سوم به این لینک مراجعه کنید.