پست وبلاگ

آموزش Caffe بخش چهارم : fine-tuning

بسم الله الرحمن الرحیم

توضیح و نحوه انجام fine tuning با شکل

برای تنظیم دقیق یا همان fine-tuning یک مدل (شبکه), بصورت کلی مراحل زیر بایستی طی شوند:

  1. ابتدا داده ها به یک دیتابیس (مثل LMDB و یا LEVELDB و …)تبدیل میشوند
  2. یک شبکه در قالب یک فایل ptototxt تعریف میشود
    1. در زمان تنظیم دقیق, ما ابتدا فایل  prototxt مربوط به تعریف شبکه ای که قصد تنظیم دقیق آنرا داریم کپی کرده و سپس تغییرات لازم را بصورت زیر در آن میدهیم
      1. name و num_output لایه خروجی را تغییر میدهیم
      2. در صورت داشتن GPU ضعیفتر, مقدار batch_size را کاهش میدهیم
  • برای ثابت نگه داشتن لایه ها, مقدار blobs_lr را برابر ۰ قرار میدهیم
  1. یک solver را نیز به همین شکل در قالب یک فایل prototxt تعریف میکنیم
    1. در زمان تنظیم دقیق, مثل بالا عمل کرده و ابتدا فایل solver مربوط به شبکه مورد نظر را کپی کرده و سپس تغییرات زیر را در آن اعمال میکنیم :
      1. در فایل solver مسیر فایل تعریف شبکه (مقدار پارامتر net) را به شبکه جدید تغییر میدهیم
      2. مقدار snapshot_prefix را با توجه به مکان خروجی خود تغییر میدهیم
  • اندازه نرخ یادگیری را کاهش میدهیم (تقسیم بر ۱۰۰ میکنیم )
  1. ممکن است مقادیر max_iter و snapshot را هم تغییر دهیم
  1. با استفاده از وزنهای از پیش آموزش داده شده, آموزش را شروع میکنیم

 

مثال از تنظیم دقیق یک شبکه :

image006

تغییر نام لایه هایی که قصد داریم مقادیر اولیه بگیرند (اگه نام لایه ها مثل قبل باشد از وزنهای قبلی استفاده میشود.)

image007

بعد ازتغییر نام لایه ها, وزنها دوباره برای این لایه ها مقدار دهی اولیه میشوند

image008

 

 

بعد از اینکه تغییرات مورد نظر رو در معماری شبکه اتون دادید (بعنوان مثال نام آخرین لایه رو عوض کردید و تغییرات خودتون رو لحاظ کردید) میتونید از سویچ weights یا model یا حتی snapshot برای شروع پروسه فاین تونینگ استفاده کنید :

دقت کنید که اگر میخوایید از weigths استفاده کنید باید caffemodel رو استفاده کنید. مدل هم به همین شکل قابل استفاده است. اما snapshot فقط با solverstate قابل استفاده است. (زمانی که شما یک اسنپ شات رو سیو میکنید دوتا فایل ایجاد میشه یکی با پسوند caffemodl و دیگری با نام solverstate . چیزی که از مدلهای مختلف معمولا ارائه میشه همون فایل caffemodel هست که ازش برای فاین تونینگ استفاده میشه.

دقت کنید اگر از سویچ snapshot که پیشفرض برای resume کردن آموزش استفاده میشه بخوایید برای فاین تونینگ استفاده کنید باید حواستون باشه solver رو تغییر ندید. سویچ های weights و model این مشکل رو ندارن و میتونید هر نوع solver یی رو استفاده کنید در فاین تونیننگ

بخش بعدی : مثال عملی
بخش قبلی : اینترفیس ها و نحوه اجرا

سید حسین حسن پور متی کلایی

درباره ی سید حسین حسن پور متی کلایی

موسس و مدیر سایت. اطلاعات در مورد فعالیت های کاری و تحصیلی : linkedIn . برای ارتباط از بخش تماس با ما یا در باره من استفاده کنید.

مقالات مرتبط

9 دیدگاه در “آموزش Caffe بخش چهارم : fine-tuning

  1. سلام .
    اینجایی که فرمودید نام لایه هایی که می خواهیم مقداردهی اولیه بشوند رو باید تغییر بدیم منظور این هست که اگر نام لایه ای رو تغییر بدیم مقدار اولیه ی اون در train مقدار رندم خواهد بود و اگر تغییر ندیم با مقادیر شبکه آموزش داده شده مقدار دهی اولیه میشه ؟ درسته ؟

  2. سلام .
    در تغییرات مربوط به فایل prototxt فرمودید که « برای ثابت نگه داشتن لایه ها, مقدار blobs_lr را برابر ۰ قرار میدهیم » – ؛ اگر ممکن هست کمی بیشتر در مورد این جمله توضیح بدید ؟
    ممنون

    1. کجا مشکل دارید؟ با blobs_lr?
      بجای اون الان باید از lr_mult استفاده کنید (اگه از layer استفاده میکنید . اگه از layers استفاده میکنید blobs_lr استفاده کنید (ورژن قدیمی هست این ))
      در مورد ثابت نگه داشتن هم منظور اینه که پارامترهای اون لایه ها دیگه بروز نشن (تغییر نکنن – بک پراپگیشن اونجا اعمال نشه روشون) . با استفاده از این راه شما میتونید هر لایه ای رو خواستید فاین تون کنید یا کل شبکه با هم تنظیم بشه یا اینکه بخشی از شبکه ثابت و اموزش تنها روی یک یا چند لایه خاص انجام بشه.

  3. سلام
    ببخشید من این بخشو نفهمیدم اصلا
    ۱-میشه یه توضیح راجب fine-tuning و اینکه کجا و چرا انجام میشه بدید (یا رفرنس معرفی کنیدم ممنون میشم)
    ۲-چرا باید لایه اخر رو اسمشو عوض کنیم؟
    ۳-شکل اولتون متوجه شدم که اسم لایه اخر و خروجیشو تغییر دادید ولی شکل دو و سه نفهمیدم هدف چیه ؟
    ۴- تو من گفته شده “تغییر نام لایه هایی که قصد داریم مقادیر اولیه بگیرند (اگه نام لایه ها مثل قبل باشد از وزنهای قبلی استفاده میشود.)” این یعنی لایه هایی که تغییر نام بدیم مقدار دهی اولیه میشن ولی لایه هایی که تغییر ندیم از همون وضنهای از قبل اموزش دیده شده مدل استفاده میکنن ؟
    ۵-جواب یکی از دوستان فرمودید که blobs_lr همون lr_mult هست ببینید برداشتم درسته اگر بخوایم لایه فقط از وزنهای از قبل آموزش داده شده مدل استفاده کنن و با داده های جدید بروز نشن مقدار lr_mult را برابر صفر قرار میدیم ولی اگر بخوایم وزنهای از قبل آموزش دیده شده که لایه با اونا مقدار دیهی شدن با داده های جدید بروز بشن مقدار lr_mult را مقدار غیر صف میدیم ، برداشتم درسته ؟
    ۶-ببخشید چرا فقط درمورد تغیرات درلایه کاملا متصل گفتید بقیه لایه ها مثل کانولوشن چی ؟ اونا تغییری داده نمیشن یا تاثیری نمیگیرن
    ببخشید اگر سوال هام زیاد و خیلی سطحی بود چون واقعا اطلاعی راحبش نداشتم
    با تشکر

    1. سلام
      تقریبا جواب تماما سوالهایی که کردید تو متن یا داده شده یا تو کامنتا یا تو بخش پیشینه تحقیق یا در بخش پرسش و پاسخ و اینکه خودتون هم جواب رو گفتین .
      بله اسم لایه ها رو عوض میکنیم تا از مقادیر جدید برای اونها استفاده بشه تا عمل یادگیری دوباره برای اون لایه ها انجام بشه . لایه های اخر حاوی سطح بالاترین انتزاعات هستن و خاص دامنه .
      برای همین وقتی قراره تو یک موضوع جدید استفاده بشن این کار صورت میگیره تا برای موضوع تازه تنظیمات مورد نیاز انجام بشه
      بسته به میزان تفاوت بین دامنه ای که شبکه روش اموزش دیده با دامنه جدید تعداد لایه های بیشتری نامهاشون تغییر پیدا میکنه .
      میشه میزان تغییرات لایه ها رو با همون ضریب که سوال کردید مشخص کرد.
      و اینکه لایه های کانولوشن هم میتونن تغییر کنن با توجه به حرفی که تازه زدم این قضیه بستگی به میزان تغییر بین دامنه مبدا و مقصد داره .

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

پاسخ دهید

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