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

14 5,097

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

توضیح و نحوه انجام 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 یی رو استفاده کنید در فاین تونیننگ

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

14 نظرات
  1. […] بخش بعدی : fine-tuning بخش قبلی : تنظیمات Solver […]

  2. […] بخش بعدی : fine-tuning بخش قبلی : تنظیمات Solver […]

  3. سودابه می گوید

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

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

      سلام
      اگه اسم لایه شما با مدلی که از قبل اموزش داده شده یکی باشه همون وزنها لود میشه براش اما اگه تغییرش بدید بصورت رندوم (براساس روشی که برای اون لایه مشخص کردید,Xavier,msra,LSUV,gaussian,..) مقدار دهی میشه.

  4. soodabeh می گوید

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

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

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

  5. m.javad rezaei می گوید

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

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

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

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

  6. کاوه می گوید

    سلام وقت بخیر من یه سوال دارم که خیلی ضروریه لطف جواب بدید :
    من کد یک مقاله رو دارم که شامل فایل های
    .prototxt
    .solver
    .caffemodel
    است و یک دمو از کار هم گذاشته که شامل فایل های
    .caffemodel
    .prototxt
    .py
    است و دمو به راحتی اجرا میشه و ورودی و خروجی رو میده

    حالا من میخوام خودم مراحل train رو انجام بدم یعنی با استفاده از فایل ها بالا از اول شبکه رو خودم راه اندازی کنم
    الان هرچقدر سرچ میزنم نمیتونم بفهمم چطوری میتونم این کارو انجام بدم
    یه جا خوندم که کفی با استفاده از همون معماری شبکه و فایل solver میتونی train کنی

    ممنون میشم رهنماییم کنید الان باید فایل ها رو با چه ترتیبی و چجوری ران کنم که دقیقا شبکه از اول مراحل خودش رو انجام بده و ترین رو انجام بده
    چون تو فایل دمو در واقع مدل ترین شده رو گذاشته که ورودی میدم بهش خروجی میده بهم

    ممنونم

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

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

  7. کاوه می گوید

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

    امکانش هست دستور عمل ترین کفی رو بهم بگید
    یا لینکی که خودتون توضیح داده باشید . همانطور که گفتم این فایل ها رو داره کد :
    Solver
    caffrmodel
    prototxt

    الان ترتیب و نحوه ی کنار هم قرار دارن اینا به چه صورته ؟
    همینا برای یک شبکه ی کفی نیازه یا فایل دیگه ای هم نیاز داره ؟
    ممنونم

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

      سلام
      برای ترین کردن هم میتونید اینجا رو ببینید! و هم میتونید اینجا رو ببینید مثل همین فاین تونینگ کردنه با این تفاوت که دیگه ارگومان وزن رو نمیفرستید.
      به مثالهایی که در نسخه ویندوزی کفی (برنچی که لینک کردم) بندازید مشخص هست شیوه کار
      کلا برای ترین کردن یک سالور یک فایل prototxt که معماری هست نیاز هست. برای فاین تون هم یک caffemodel به این فایلها اضافه میشه. برای ریزوم ترینینگ هم علاوه بر فایل caffemodel یه solverstate هم نیاز هست .

  8. فاطمه می گوید

    سلام وقت بخیر
    من روی موضوع تشخیص جنسیت ار روی چهره با استفتده از یادگیری عمیق کار میکنم
    یک کد دارم میخام معماری شبکه رو عوض کنم و از resnet استفاده کنم
    کسی میتونه کمک کنه که چجوری این کار رو انجام بدم؟؟
    https://github.com/arunponnusamy/gender-detection-keras
    این هم لینک کد

آدرس ایمیل شما منتشر نخواهد شد.

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.