به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

سلام...من چندتا سوال داشتم....ممنون میشم مفصل راهنمایی بفرمایید...
اولین و مهمترین سوالم :
1-من دادهام رو طبق آموزش سایت برای فرمت lmdb ، به سه دسته train و test و validation تقسیم کردم...

باید مسیرشون رو در معماری الکس نت در کجا معرفی کنم ؟ مسیر دادهای ترین و ولیدیشن که در فایل train_val.prototxt تعریف میشوند ، اونوقت مسیر داده های تست باید در کجا تعریف شود ؟

اگر داده های ولیدیشن نداشته باشم ، اونوقت به چه صورت باید مسیر دادهای تست و ترین رو تعریف کنم؟

2-در صورتی که داده validation رو تعریف نکنم ، باید kfold cross validation انجام بدهم ؟ یا اینکه ربطی ندارد!؟

توسط (215 امتیاز)
ویرایش شده توسط
سلام .
آقا سینا لطفا سوالهای و ۳ و چهار رو تو سوالهای جداگانه مطرح کن. تا اینطور هر سوال یک جواب داشته باشه و بهتر قابل پیگیری و استفاده توسط بقیه بشه. وقتی سوال سه و چهار رو پرسیدی من هم جواب اینجا رو میام و اونجا میدم.
سلام سید جان...دستت درد نکنه ، چشم الان کاری که فرمودیو انجام میدم ...

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام .
برای سوالهای ۱ و ۲ :‌
کلا در کفی شما میتونی فازها و همینطور stage‌های مختلفی رو مشخص کنید که هرکدوم هم با یک دیتاست کار کنن و تنظیمات هرکدوم هم مشخص کنید .
مثلا :

layer {
  type: "Data"
  ...
  include {
    phase: TRAIN
  }
}

layer {
  type: "Data"
  ...
  include {
    phase: TEST
    stage: "validation"
  }
}

layer {
  type: "Data"
  ...
  include {
    phase: TEST
    stage: "test"
  }
}

در سالور هم بعدش باید مشخصات هر stage‌رو مشخص کنید . مثلا اینطوری :‌

test_iter: 200
test_state {
  stage: "validation"
}
test_iter: 100
test_state {
  stage: "test"
}

ولی من خودم شخصا (و اکثر کسایی که دیدم ) از حالت پیشفرض استفاده میکنن که توضیح میدم پایین .
ببینید برای کفی فرقی بین validation‌و test‌و ... نیست . این تمایز ها برای ماست که منظور خاصی از استفاده از هرکدوم داریم . برای همین شما خیلی راحت دوتا دیتاست میسازید یکی برای تست و یکی برای ولیدیشن و کاری که میکنید اینه که معماری خودتون رو بصورت train/val‌ میسازید و در فاز test‌ دیتاست ولیدیشن شما استفاده میشه . شبکه رو تنظیم میکنید تا به بهترین دقت برسید وقتی که رسیدید خیلی راحت میتونید دو کار کنید .
۱. برای تست از سویچ test‌استفاده کنید .
۲.خیلی راحت جای دیتاست validation‌و تست رو عوض کنید و شبکه رو روی تست اموزش بدید و دقتش رو گزارش کنید.

برای Kfold‌هم به همین شکل پیش میریم

توسط (4.3k امتیاز)
انتخاب شده توسط
سلام...خیلی ممنونم بابت جوابهای خیلی کامل و عالی...متشکرم
فقط یه ایرادی هنوز دارم با kfold cross validation
مثلا برای k=4 اینطور انجام بدهم؟  اول اینکه داده هام رو در  کلاس مربوطشون  قرار میدهم  ، و بعد در داخل هر کلاس، دادهارو  به 4 قسمت تقسیم میکنم که 3 قسمت برای ترین و یک قسمت برای تست باشه .و 4 تا دیتاست به فرمت lmdb  درست میکنم ، و هردفه یکی رو از فایل سالور به تست و 3 تای دیگه رو به فایل ترین آدرس میدهم و بعد میانگین accuracy میگیریم...درسته سید جان اینطوری؟
فقط اینجوری خیلی سخت و درهم برهم نمیشه؟ مخصوصا اگر مثل من که k=10 هست....
کد آماده هم گشتم ، اما پیدا نکردم...
سلام . شما بجای اینکه دیتاست درست کنید از همون پوشه ها استفاده کنید راحت ترید هر بار کافیه مسیر پوشه ها رو تغییر بدید. بعد اینکه برای Kfold اگه K=4 باشه یعنی داده شما به 4 قسمت تقسیم میشه. یک قسمت میشه ولیدیشن سه قسمت دیگه با هم میشن ترینینگ ست شما. اموزش میدید یه دقتی بدست میاد. برای دفعه بعد یک قسمت دیگه میشه ولیدیشن و سه تای باقی مونده میشن ترینینگ ست و این کارو انقدر انجام میدید تا همه قسمت ها حداقل یک بار ولیدیشن شده باشن . نتایج نهایتا میانگین گرفته میشه.
برای kfold اره ممکنه سخت بشه . ولی با برنامه نویسی میتونید حلش کنید. میتونید همه تصاویر شما در یک پوشه باشه بعد 4 تا لیست از نام تصاویر درست کنید مثلا . بعد دوتا لیست دیگه درست کنید یکی برای تریننگ ست یکی برای ولیدیشن ست. یه حلقه for هم میتونید بزارید برای 4 بار مثلا کار زیر رو انجام بده . هربار یه لیست رو از اون 4 تا انتخاب کنه بزار تو لیست ولیدیشن بعد بقیه رو بزاره تو لیست ترینینگ و بره اموزش بده . دفعه بعد بره سراغ لیست بعدی و الی اخر .
فقط تنها مساله اینجا اینه که باید از کدنویسی در کفی استفاده کنید که اونم میتونید از نمونه کدهایی که تو پوشه examples در روت کفی هست استفاده کنید.
سلام و خیلی متشکرم سید جان از پاسخ هات...یه مطلبی میخوندم که شک کردم...من در  لینک زیر یه دستور %(kfoldi)d  رو دیدم که به عنوان kfold فکر میکنم در کافه استفاده میشه...میتونم از لینک زیر برای kfold استفاده کنم؟
http://www.andrewjanowczyk.com/use-case-1-nuclei-segmentation/
https://github.com/choosehappy/public/blob/master/DL%20tutorial%20Code/common/BASE-alexnet_traing_32w_db.prototxt
سلام . خواهش میکنم . نه اون مربوط به caffe نیست . اونو خودشون نوشتن . هم کد متلبش هست هم کد پایتونش از همین هم میتونی ایده بگیری کار خودتو راه بندازی .
متشکرم آقا سید...ممنون از پاسخ های خوبت
سلام سید جان...یه موردی منو گیج کرده...ببخش که دوباره میپرسم...من تو کارهایی که نگاه میکنم ، همشون اکثرا دیتاستشون رو به 2 تا قسمت  test  و train تقسیم کردن و با همون کارشون رو راه انداختن  و دقت گرفتن...، توجیهش چیه که ازروش های  validation استفاده نکردن؟   با چه توجیهی این همه مدل های مختلف رو توی کافه ، فقط با دیتای test , train  نتیجه گرفتن؟   حقیقتش یه مقدار هم منطقی میاد که بهش ایراد بگیرن...حتی من با آقا محسن هم در همایش صحبت میکردم ، گفتن که اگر ولیدیشن انجام ندی ، ممکنه داور بهت گیر بده...
تو کفی اون test در اصل همون validation بحساب میاد. برای همینم هست که اکثرا میبینی اسم فایلها هستtrain_val.prototxt . وجود ولیدیشن ست و تست ست صرفا برای نمایش قدرت تعمیم پذیری شبکه اس و تنظیم خود شبکه. تو دیتاستهایی که ترین و تست دارن مثل cifar10 و svhn و .... در اصل تست ست بعنوان ولیدیشن حساب میشه و همین هم میشه ملاک کارکرد شبکه. تو هر دیتاستی که شما میخوای وارد بشی باید ببینی خودش چی عرضه میکنه. اگه کلا یک دیتا بیشتر نداده اینجا شما میتونی ترین ولدیشن و تست ست جدا کنه . اگه خودش ترین و تست داده میتونی  تست ست رو بعنوان  ولیدیشن استفاده کنی و نتایج خودت رو با سایر نتایج بر همین اساس مقایسه کنی.
بطور خلاصه باید ببینی بقیه نتایج رو به چه صورت گزارش کردن شما هم بکنی غیر این انجام بدی منصفانه نیست چون دقت ها فرق میکنه.
ممنون سید جان...  پس اونطور که من فهمیدم ، توجیهش اینه که چون همه کارهای علمی انجام شده ،  به این صورت نتایجشون رو گزارش کردن  ، من هم باید به همین صورت نتایجم رو گزارش بدهم...
سلام.خواهش میکنم. توجیهش رو گفتم ملاک کارهای انجام شده اس. وقتی قراره ببینیم بهبودی اتفاق افتاده یا نه باید با یه ملاکی سنجش رو انجام بدیم . برای همین رجوع میکنیم به نتایج قبلی و شیوه انجام ازمایش اونها . ما هم از همون شیوه استفاده میکنیم . اگه همه نتایج قبلی از طریق تقسیم بندی به دو بخش ترین و ولیدیشن انجام شده ما هم همینکارو میکنیم . البته میتونیم کار اضافه رو هم انجام بدیم ولی اون بخش اول رو ضروریه مثل قبلی ها انجام بدیم تا قابلیت قیاس نتایج با هم رو داشته باشیم .
برای همین دیتاست به دیتاست و حوزه به حوزه متفاوته و باید بر اساس مقاله ها و نتایج کارهای قبل از خودتون عمل کنید و پیش برید.
سلام...اها...ممنونم سید جان...دستت درد نکنه...یه چیزی هم خودم فکر میکنم که اینه: بنظرم ما cross validation  رو برای جلوگیری از over fitting انجام میدهیم ، خب وقتی تو این فریم ورک کلی رگولاریزیشن و ....کارهای دیگه انجام میدهیم ، دیگه نیازی به cross validation  نیست...حالا نمیدونم تا چه حدی این حرفم درسته
نه این حرف درست نیست. کراس ولیدیشن فقط برای تنظیم مدل و چک کردن و بدست اوردن بهترین مدل که بهترین تعمیم رو روی داده های ندیده داشته باشه استفاده میشه. در حالت عادی نمیشه گفت مدل شما که روی داده اموزشی اموزش دیده آیا بخوبی روی داده واقعی یا همون داده هایی که تا بحال ندیده عمل میکنه یا نه. برای اینکه بشه به تقریب خوبی در این یک مدل چقدر خوب کار میکنه رسید میان یه بخشی رو کنار میزارن و بهش میگن ولیدیشن . که برای تنظیم و اموزش ازش استفاده میکنن. (اموزش روی ترینینگ ست و تست روی ولیدیشن ست ) بعد نتیجه هرچی شد میان روی تست ست امتحان میکنن. حالا میگن خب ما از کجا بدونیم این تنظیم بهترین حالت مدل میشه برای دیتای دنیای واقعی ؟ میگن خب بجای اینکه یکبار این مرحله رو انجام بدی چند بار انجام بده . یعنی بجای اینکه یه ولیدیشن ست داشته باشی بیاد چندتا داشته باشه و مدل رو روی این چندتا تست کن هرکدوم بهتر بود اون بهترین مدل با بهترین تنظیماته همونو برای کارت انتخاب کن.  از اونجایی که بدست اوردن و جمع اوری دیتا کار سختیه یه کلک رشتی زدن  گفتن خب چیکار کنیم که مجبور نباشیم بریم چندتا دیتای جیدید برای ولیدیشن تهیه کنیم ؟ گفتن خب از همین چیزی که داریم نوبتی یکی رو بعنوان ولیدیشن استفاده میکنیم و بعد اینو تکرار میکنیم . این داستان کراس ولیدیشنه .
قضیه اورفیتینگ در داخل شبکه مطرحه موقع ترینینگ نه یه چیز بیرونی و بعد از اموزش مثل کراس ولیدیشن. البته از طریق قیاس خطای ولیدیشن با ترینینگ میشه به اورفیتینگ پی برد و سعی در رفعش کرد اما اینطور نیست که کراس ولیدیشن یا خود ولیدیشن به تنهایی باعث رفع اورفیتینگ یا مبارزه با اون باشه .
سلام...اها...درسته سید جان...دستت درد نکنه...ممنون از توضیحات کاملت...خدا خیرت بده
سلام...سید جان ممنون از پاسخ های خوبت، ...من مقالات تو زمینه کاری خودم رو بررسی کردم ، اصلا با CNN کاری انجام نشده ...شما خودت به من برای اعتبار سنجی دادهام ، چه روشی رو پیشنهاد میدی؟
چون به هر حال داور و  استاد راهنمام برای اعتبار سنجی گیر میدن...
سلام .در حالت کلی برای اعتبار سنجی همین که ولیدیشن داشته باشی و confusion matrix و مابقی اطلاعات رو فراهم کنی کافیه. البته میتونی برای اطمینان بیشتر و راحت تر کردن خیال خودت یه kfold هم بگیری .
بطور خاص هم بخواییم صحبت کنیم شبکه کانلووشن رو ول کن ببین تو مقالات حوزه خودت شیوه کار به چه شکله اگه اونا از kfold استفاده میکنن برای ولیدیشن شما هم اونو لحاظ کن کنار بقیه که اگر کسی بهت گفت کو؟ اونم داشته باشی و نشون بدی .
سلام...خیلی ممنونم...لطف کردی سید جان
سلام...سید جان من با یکی از استاد تمام های دانشگاه معتبر تهران یه مکاتبه ای کردم در مورد این موضوع جدا سازی دیتاست ها به صورت 2 دسته فقط تست و ترین و انجام ندادن کراس ولیدیشن
ایشون فرمودن که این کار به این صورت درسته چون  به علت تعداد تصاویربالا مشکلی نداره
البته خودمم باز هم از سایتهای مختلف میخوندم ، که اونام گفته بودن اصلا توی موضوع دیپ kfold , اینجور چیزا مطرح نیست ، چون اصلا منابع سخت افزاری مناسبی هم نیست که بتونه این کار رو انجام بده
گفتم که این موضوعو  اینجا هم مطرح کنم...ممنون از راهنماییهای خیلی خوبت آقا سید حسین
سلام.
تو حوزه دیپ لرنینگ kfold برای دیتاستهایی معنی نداره که واقعا بزرگن . اگه دیتاستت اندازه بزرگی نداره این دلیل خوبی نمیتونه باشه . یادت باشه Kfold یه تکنیک برای پیدا کردن بهترین مدله وقتی داده زیادی نداری . با این تعریف میتونی مشخص کنی که تو خودت تو کدوم دسته ای .
من همیشه میگم به خودت سخت بگیری بهتره تا فردا بعد این همه زحمت یکی که هیچ ایده ای از کارت نداره با بهانه های الکی زحمتاتو خدای نکرده بی ارزش جلوه نده یا حقی که باید بهت تعلق بگیره رو بابت یه کارهای پیش پا افتاده که میتونستی خودت انجام بدی اما ندادی ازت سلب کنه.
خلاصه بهونه دست کسی نده . اگه میتونی خودت حساب کن بزار کنار و فقط اگر کسی چیزی خواست اماده داشته باش که بتونی رو کنی.
اها...ممنونم ازت سید جان...درسته، چشم انشاله همین کاری که شما فرمودیو انجام میدم، فقط بدیش اینه که باید دستی حساب بشه...متشکر از راهنمایی های خوبت...
...