بسم الله الرحمن الرحیم
توضیح و نحوه انجام fine tuning با شکل
برای تنظیم دقیق یا همان fine-tuning یک مدل (شبکه), بصورت کلی مراحل زیر بایستی طی شوند:
- ابتدا داده ها به یک دیتابیس (مثل LMDB و یا LEVELDB و …)تبدیل میشوند
- یک شبکه در قالب یک فایل ptototxt تعریف میشود
- در زمان تنظیم دقیق, ما ابتدا فایل prototxt مربوط به تعریف شبکه ای که قصد تنظیم دقیق آنرا داریم کپی کرده و سپس تغییرات لازم را بصورت زیر در آن میدهیم
- name و num_output لایه خروجی را تغییر میدهیم
- در صورت داشتن GPU ضعیفتر, مقدار batch_size را کاهش میدهیم
- در زمان تنظیم دقیق, ما ابتدا فایل prototxt مربوط به تعریف شبکه ای که قصد تنظیم دقیق آنرا داریم کپی کرده و سپس تغییرات لازم را بصورت زیر در آن میدهیم
- برای ثابت نگه داشتن لایه ها, مقدار blobs_lr را برابر ۰ قرار میدهیم
- یک solver را نیز به همین شکل در قالب یک فایل prototxt تعریف میکنیم
- در زمان تنظیم دقیق, مثل بالا عمل کرده و ابتدا فایل solver مربوط به شبکه مورد نظر را کپی کرده و سپس تغییرات زیر را در آن اعمال میکنیم :
- در فایل solver مسیر فایل تعریف شبکه (مقدار پارامتر net) را به شبکه جدید تغییر میدهیم
- مقدار snapshot_prefix را با توجه به مکان خروجی خود تغییر میدهیم
- در زمان تنظیم دقیق, مثل بالا عمل کرده و ابتدا فایل solver مربوط به شبکه مورد نظر را کپی کرده و سپس تغییرات زیر را در آن اعمال میکنیم :
- اندازه نرخ یادگیری را کاهش میدهیم (تقسیم بر ۱۰۰ میکنیم )
- ممکن است مقادیر max_iter و snapshot را هم تغییر دهیم
- با استفاده از وزنهای از پیش آموزش داده شده, آموزش را شروع میکنیم
مثال از تنظیم دقیق یک شبکه :
تغییر نام لایه هایی که قصد داریم مقادیر اولیه بگیرند (اگه نام لایه ها مثل قبل باشد از وزنهای قبلی استفاده میشود.)
بعد ازتغییر نام لایه ها, وزنها دوباره برای این لایه ها مقدار دهی اولیه میشوند
بعد از اینکه تغییرات مورد نظر رو در معماری شبکه اتون دادید (بعنوان مثال نام آخرین لایه رو عوض کردید و تغییرات خودتون رو لحاظ کردید) میتونید از سویچ weights یا model یا حتی snapshot برای شروع پروسه فاین تونینگ استفاده کنید :
دقت کنید که اگر میخوایید از weigths استفاده کنید باید caffemodel رو استفاده کنید. مدل هم به همین شکل قابل استفاده است. اما snapshot فقط با solverstate قابل استفاده است. (زمانی که شما یک اسنپ شات رو سیو میکنید دوتا فایل ایجاد میشه یکی با پسوند caffemodl و دیگری با نام solverstate . چیزی که از مدلهای مختلف معمولا ارائه میشه همون فایل caffemodel هست که ازش برای فاین تونینگ استفاده میشه.
1 2 3 |
caffe.exe train --solver=examples/mnist/lenet_solver.prototxt --weights=examples/mnist/lenet_iter_6000.caffemodel |
دقت کنید اگر از سویچ snapshot که پیشفرض برای resume کردن آموزش استفاده میشه بخوایید برای فاین تونینگ استفاده کنید باید حواستون باشه solver رو تغییر ندید. سویچ های weights و model این مشکل رو ندارن و میتونید هر نوع solver یی رو استفاده کنید در فاین تونیننگ
[…] بخش بعدی : fine-tuning بخش قبلی : تنظیمات Solver […]
[…] بخش قبلی : fine-tuning […]
[…] بخش بعدی : fine-tuning بخش قبلی : تنظیمات Solver […]
سلام .
اینجایی که فرمودید نام لایه هایی که می خواهیم مقداردهی اولیه بشوند رو باید تغییر بدیم منظور این هست که اگر نام لایه ای رو تغییر بدیم مقدار اولیه ی اون در train مقدار رندم خواهد بود و اگر تغییر ندیم با مقادیر شبکه آموزش داده شده مقدار دهی اولیه میشه ؟ درسته ؟
سلام
اگه اسم لایه شما با مدلی که از قبل اموزش داده شده یکی باشه همون وزنها لود میشه براش اما اگه تغییرش بدید بصورت رندوم (براساس روشی که برای اون لایه مشخص کردید,Xavier,msra,LSUV,gaussian,..) مقدار دهی میشه.
سلام .
در تغییرات مربوط به فایل prototxt فرمودید که « برای ثابت نگه داشتن لایه ها, مقدار blobs_lr را برابر ۰ قرار میدهیم » – ؛ اگر ممکن هست کمی بیشتر در مورد این جمله توضیح بدید ؟
ممنون
کجا مشکل دارید؟ با blobs_lr?
بجای اون الان باید از lr_mult استفاده کنید (اگه از layer استفاده میکنید . اگه از layers استفاده میکنید blobs_lr استفاده کنید (ورژن قدیمی هست این ))
در مورد ثابت نگه داشتن هم منظور اینه که پارامترهای اون لایه ها دیگه بروز نشن (تغییر نکنن – بک پراپگیشن اونجا اعمال نشه روشون) . با استفاده از این راه شما میتونید هر لایه ای رو خواستید فاین تون کنید یا کل شبکه با هم تنظیم بشه یا اینکه بخشی از شبکه ثابت و اموزش تنها روی یک یا چند لایه خاص انجام بشه.
سلام
ببخشید من این بخشو نفهمیدم اصلا
۱-میشه یه توضیح راجب fine-tuning و اینکه کجا و چرا انجام میشه بدید (یا رفرنس معرفی کنیدم ممنون میشم)
۲-چرا باید لایه اخر رو اسمشو عوض کنیم؟
۳-شکل اولتون متوجه شدم که اسم لایه اخر و خروجیشو تغییر دادید ولی شکل دو و سه نفهمیدم هدف چیه ؟
۴- تو من گفته شده “تغییر نام لایه هایی که قصد داریم مقادیر اولیه بگیرند (اگه نام لایه ها مثل قبل باشد از وزنهای قبلی استفاده میشود.)” این یعنی لایه هایی که تغییر نام بدیم مقدار دهی اولیه میشن ولی لایه هایی که تغییر ندیم از همون وضنهای از قبل اموزش دیده شده مدل استفاده میکنن ؟
۵-جواب یکی از دوستان فرمودید که blobs_lr همون lr_mult هست ببینید برداشتم درسته اگر بخوایم لایه فقط از وزنهای از قبل آموزش داده شده مدل استفاده کنن و با داده های جدید بروز نشن مقدار lr_mult را برابر صفر قرار میدیم ولی اگر بخوایم وزنهای از قبل آموزش دیده شده که لایه با اونا مقدار دیهی شدن با داده های جدید بروز بشن مقدار lr_mult را مقدار غیر صف میدیم ، برداشتم درسته ؟
۶-ببخشید چرا فقط درمورد تغیرات درلایه کاملا متصل گفتید بقیه لایه ها مثل کانولوشن چی ؟ اونا تغییری داده نمیشن یا تاثیری نمیگیرن
ببخشید اگر سوال هام زیاد و خیلی سطحی بود چون واقعا اطلاعی راحبش نداشتم
با تشکر
سلام
تقریبا جواب تماما سوالهایی که کردید تو متن یا داده شده یا تو کامنتا یا تو بخش پیشینه تحقیق یا در بخش پرسش و پاسخ و اینکه خودتون هم جواب رو گفتین .
بله اسم لایه ها رو عوض میکنیم تا از مقادیر جدید برای اونها استفاده بشه تا عمل یادگیری دوباره برای اون لایه ها انجام بشه . لایه های اخر حاوی سطح بالاترین انتزاعات هستن و خاص دامنه .
برای همین وقتی قراره تو یک موضوع جدید استفاده بشن این کار صورت میگیره تا برای موضوع تازه تنظیمات مورد نیاز انجام بشه
بسته به میزان تفاوت بین دامنه ای که شبکه روش اموزش دیده با دامنه جدید تعداد لایه های بیشتری نامهاشون تغییر پیدا میکنه .
میشه میزان تغییرات لایه ها رو با همون ضریب که سوال کردید مشخص کرد.
و اینکه لایه های کانولوشن هم میتونن تغییر کنن با توجه به حرفی که تازه زدم این قضیه بستگی به میزان تغییر بین دامنه مبدا و مقصد داره .
من یه خواهشی دارم شما لطف کنید حتما مطالب رو خوب بخونید. و موقع سوال کردن هم سعی کنید از بخش پرسش و پاسخ استفاده کنید تا هم بتونید سوالات مشابه رو ببینید و هم سوالات شما برای بقیه هم قابل استفاده باشه .
اینجا سوال و جواب بشه خوبی های خودش رو داره اما خب تو جستجوها نمیشه ازش استفاده کرد و تاکید من خصوصا اینه که کاری کنیم که برای همه قابل استفاده باشه و مثلا شمایی که چیزی رو بلد نیستید با سرچ کردن بتونید سریع پیداش کنید و معطل مثلا ایکس و ایگرگ نباشید که کی بخوان جواب بدن یا ندن.
سلام وقت بخیر من یه سوال دارم که خیلی ضروریه لطف جواب بدید :
من کد یک مقاله رو دارم که شامل فایل های
.prototxt
.solver
.caffemodel
است و یک دمو از کار هم گذاشته که شامل فایل های
.caffemodel
.prototxt
.py
است و دمو به راحتی اجرا میشه و ورودی و خروجی رو میده
حالا من میخوام خودم مراحل train رو انجام بدم یعنی با استفاده از فایل ها بالا از اول شبکه رو خودم راه اندازی کنم
الان هرچقدر سرچ میزنم نمیتونم بفهمم چطوری میتونم این کارو انجام بدم
یه جا خوندم که کفی با استفاده از همون معماری شبکه و فایل solver میتونی train کنی
ممنون میشم رهنماییم کنید الان باید فایل ها رو با چه ترتیبی و چجوری ران کنم که دقیقا شبکه از اول مراحل خودش رو انجام بده و ترین رو انجام بده
چون تو فایل دمو در واقع مدل ترین شده رو گذاشته که ورودی میدم بهش خروجی میده بهم
ممنونم
سلام کد یا ریپازیتوری رو بزارید تا راهنماییتون کنم .
بصورت پیشفرض این طور هست که کفی رو میشه بصورت های مختلف ترین کرد عموما از طریق ترمینال ترین میکنن بعد برای استفاده از رپر پایتون یا سی++ استفاده میکنند .
کد رو بزارید تا ببینم به چه صورتی هست و بهتر بشه راهنماییتون کرد
اقای حسن پور کل کد رو بفرستم ؟چون حجمش زیاده همان طور که خدمتتون عرض کردم فایل دمو هم داره بخاطر همین حجیش زیاده
امکانش هست دستور عمل ترین کفی رو بهم بگید
یا لینکی که خودتون توضیح داده باشید . همانطور که گفتم این فایل ها رو داره کد :
Solver
caffrmodel
prototxt
الان ترتیب و نحوه ی کنار هم قرار دارن اینا به چه صورته ؟
همینا برای یک شبکه ی کفی نیازه یا فایل دیگه ای هم نیاز داره ؟
ممنونم
سلام
برای ترین کردن هم میتونید اینجا رو ببینید! و هم میتونید اینجا رو ببینید مثل همین فاین تونینگ کردنه با این تفاوت که دیگه ارگومان وزن رو نمیفرستید.
به مثالهایی که در نسخه ویندوزی کفی (برنچی که لینک کردم) بندازید مشخص هست شیوه کار
کلا برای ترین کردن یک سالور یک فایل prototxt که معماری هست نیاز هست. برای فاین تون هم یک caffemodel به این فایلها اضافه میشه. برای ریزوم ترینینگ هم علاوه بر فایل caffemodel یه solverstate هم نیاز هست .
سلام وقت بخیر
من روی موضوع تشخیص جنسیت ار روی چهره با استفتده از یادگیری عمیق کار میکنم
یک کد دارم میخام معماری شبکه رو عوض کنم و از resnet استفاده کنم
کسی میتونه کمک کنه که چجوری این کار رو انجام بدم؟؟
https://github.com/arunponnusamy/gender-detection-keras
این هم لینک کد