رفتن به نوشته‌ها

انتقال یادگیری (قسمت دوم)

در قسمت قبل با مفاهیم مربوط به انتقال یادگیری آشنا شدیم. حال میخواهیم همان مفاهیم را در کراس پیاده سازی کنیم. برای پیاده‌سازی از شبکه معروف VGG19 استفاده میکنیم. این شبکه روی دادگان imagenet آموزش داده شده است و معماری آن به صورت زیر است:

این شبکه از چندین لایه کانولوشن تشکیل شده است. در این شبکه ابتدا ویژگی‌های استخراج میشوند و سپس صاف (flatten) و از شبکه پیشرو (Fully connected) دو لایه به اندازه ۴۰۹۶ عبور داده می‌شود. در نهایت توسط یک Softmax classifier دسته‌بندی عکس ورودی حدس زده می‌شود.

از شبکه‌ی بالا میتوان به حالت‌های مختلفی استفاده کرد که به تسک موردنظر و میزان دادگانی که در اختیار دارید بستگی دارد. مثلا به شکل‌های زیر توجه کنید:

در قسمت اول روی تمام دادگان imagenet آموزش داده شده است. در قسمت دوم، شما می‌توانید تنها دو لایه انتهایی را برای تسک خود آموزش دهید و از آن برای تسک موردنظر خود استفاده کنید و مابقی شبکه را فریز (freeze) کنید (آموزش ندهید). در قسمت سوم، اگر دادگان بیشتری در اختیار داشته باشید علاوه بر قسمت دسته‌بندی کننده (قسمت سبز در عکس) میتوانید بخشی از شبکه پیچشی (convulution) را هم آموزش دهید.هر سه قسمت بالا به راحتی در کراس قابل انجام است.

خب بیایید مثلا دادگان (Cifar10) را با استفاده از شبکه از پیش آموزش داده‌ شده VGG ارزیابی کنیم.

 

ابتدا تنسورفلو رو نصب کنید (از کراس روی مخزن تنسورفلو استفاده خواهیم کرد):

pip3 install tensorflow

خوشبختانه در قسمت Application کراس بسیاری از مدل‌ها مثل Inception, VGG, mobileNet و… پیاده‌سازی شده است که شما میتوانید به راحتی از آنها استفاده کنید. در این آموزش ما از VGG19 استفاده کردیم و شما می‌توانید آنها را لوود کنید و معماری آنها را مشاهده کنید:

و یا حتی یه عکس ورودی به آن بدید و براتون حدس بزنه که عکس چی هست:

خب ما می‌خواستیم قسمت دسته‌بندی‌کننده آن را تغییر بدیم. ابتدا include_top رو مساوی False قرار بدید تا از دسته‌بندی که قبلا آموزش داده شده است استفاده نکند. و بعد مدل خودتون رو مشابه زیر بسازید. این مدل هرچیزی که دوست داشته باشید میتواند باشه و صرفا اینجا برای سادگی از یک شبکه دولایه پیشرو استفاده شده است:

همانطور که ملاحضه میکنید ما میخواستیم روی دادگان cifar آموزش را انجام بدهیم. همانطور که میدانید اندازه عکس‌ها در این دادگان ۳۲*۳۲*۳ است. پس ورودی ما باید به این شکل باشد. سپس ورودی را به مدل vgg که از قبل داشتیم میدهیم. از انجایی که قسمت classifier مدل vgg حذف شده است. یک دسته‌بندی کننده جدید میسازیم. این دسته‌بندی کننده بسیار ساده و از دولایه پیشرو با اندازه ۵۱۲ تشکیل شده است.

تنها نکته‌ای که وجود دارد حلقه‌ای (loop) است که روی مدل vgg زده شده است. اینکار به این دلیل انجام شده است تا از آموزش قسمت‌های شبکه جلوگیری شود (اصلاحا شبکه را freeze کرده ایم). اگر دوست داشتید میتوانید کل شبکه را یکجا  آموزش دهید که در این صورت باید این دو خط را حذف کنید.

اگر کد بالا رو اجرا کنید مشاهده میکنید که مشکلی نخواهید داشت و به راحتی میتوانید آن را کامپایل کنید. کل کد را میتوانید در اینجا مشاهده کنید.

همانطور که میبینید شما به تمام شبکه vgg دسترسی دارید و هرکجای آن را که بخواهید میتوانید تغییر دهید به عنوان مثال شما تنها میخواهید لایه نهایی آن را عوض کنید در این صورت خواهیم داشت:

در این آموزش مدلی از پیش آموزش داده شده استفاده کردیم. در قسمت بعدی به سراغ این میریم که چطور مدل خودمون را آموزش بدیم سپس ذخیره کنیم و در نهایت روی دادگان دیگر به ارزیابی آن بپردازیم.

منتشر شده در آموزشیادگیری عمیقیادگیری ماشین

نظر

  1. دانشجو دانشجو

    سلام و تشکر
    ببخشید قسمت بعد رو کجا میتونم دنبال کنم؟

    • هادیفر هادیفر

      سلام
      راستش هنوز ننوشتم 🙂 ولی کار زیاد سختی نیست مخصوصا تو کراس خیلی خیلی راحت میتونید اینکارو انجام بدید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *