به نام خدا
توجه : در این پست فرض شده شما آشنایی کافی را با ابزار caffe دارید. در غیر اینصورت به آموزش ابزار caffe در همین سایت مراجعه کنید و سپس مطالب این پست را مطالعه فرمایید.
ممکن است این سوال در ذهن شما به وجود آمده باشد که چگونه می توان از ابراز Caffe برای پیاده سازی مسائل رگرسیون استفاده کرد.
ابزار Caffe به طور خاص برای classification طراحی شده و از طرفی نوع داده ی LMDB نیز برای داده های با لیبل صحیح (integer) مورد استفاده قرار می گیرد. لذا در صورتی که بخواهیم از داده ها با برچسب های اعشاری استفاده کنیم، دو راه وجود دارد :
- استفاده از فرمت HDF5
- تغییر فایل های Caffe، به نحوی که فرمت LMDB ، برچسب اعشاری را نیز بپذیرد.
با توجه به مزیت هایی که فرمت LMDB دادر لذا در این پست قصد داریم به شما نحوه تغییر ابزار caffe را بدین منظور آموزش دهیم. لازم به ذکر است در صورتی که بدون هیچ تغییری داده های با برچسب اعشاری را به فرمت LMDB تبدیل کنید تمام برچسب های شما صفرخواهند شد. فرض کنید داده هایی دارید که دارای برچسب هایی بین صفر و یک هستند، در این صورت بعد از تبدیل داده، شما داده ها با دوکلاس صفر و یک (اگر برخی از داده های شما برچسب یک داشته باشند) خواهید داشت و بعد از آموزش، شبکه ی شما به کلاس صفر overfit خواهد شد و این ممکن است شما را به اشتباه بیاندازد.
بنابراین تعدادی از فایل ها را به شرح زیر تغییر می دهیم:
در تمام خط های مشخص شده در فایلهای زیر نوع داده ای int را به float تغییر دهید.
- فایل convert_imageset.cpp در مسیر caffe-root/tools :
1 2 3 4 5 |
line 75 : std::vector<std::pair<std::string, int> > lines; .... line 77 : int label; |
- فایل caffe.proto در مسیر caffe-root/src/caffe/proto :
1 2 3 |
line 36 : optional float label; |
- io.hpp در مسیر caffe-root/include/caffe/util :
- تمام متغیرهای label در این فایل از نوع int هستند که به float تغییر دهید.
- فایل io.cpp در مسیر caffe-root/src/caffe/util
1 2 3 4 |
line 119 : bool ReadImageToDatum(const string& filename, const int label, ... line 145 : bool ReadFileToDatum(const string& filename, const int label, ... |
در ادامه توضیح کوتاهی در خصوص اینکه اگر بخواهید شبکه ای را برای مسئله رگرسیون finetune کنید به چه صورت می باشد خواهم داد.
مراحل به شرح زیر می باشد:
- از نسخه ی Caffe ای که تغییر داده اید به منظور تبدیل داده های خود استفاده کنید .
- تغییرات زیر را در فایل train_val.prototxx (فایل ساختار شبکه) مربوط به شبکه ی مورد نظر که قصد تنظیم دقیق آن را داریم را اعمال می کنیم :
- پارامتر name : نام دلخواه خود را برای شبکه انتخاب کنید.
- در لایه Data هم در فاز train و هم در فاز test پارامترهای mean_file و source را با آدرس داده های خود مقداردهی کنید.
- batch_size را با توجه به نیاز خودمان در فاز test و train تغییر می دهیم.
- num_output لایه خروجی را با توجه به مسئله به ۱ تغییر می دهیم. (فرض می کنیم شبکه قرار است یک مقدار بین صفرو یک را پیش بینی کند)
- نوع لایه ی loss را به Euclideanloss تغییر می دهیم.
- تغییرات زیر را در فایل solver.prototxt اعمال می کنیم :
- پارامتر net با آدرس شبکه ی مورد نظر مقداردهی شود.
- نرخ یادگیری تقسیم بر ۱۰۰ شود.
- با توجه به batch_size ممکن است لازم باشد max_iter نیز تغییر داده شود.
- snapshot و snapshot_prefix را به دلخواه خود تغییر دهید.