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

با تشکر

دسته بندی ها

0 امتیاز

سلام عرض ادب
دوستان همانطور که میدونید ترین ست امیج نت برای برخی کلاس ها کمتر و برای برخی کلاس ها دیتای زیادی دارد در واقع imbalance هست بنظرتون شبکه ایی که طبق این دیتاست ترین شود این imbalance بودن مشکل ایجاد نمیکند ؟ چون بلاخره هرکلاسی مجموعه تصاویر بیشتری داشته باشد شاید شبکه بعد از ترین به سمت اون کلاس تمایل بیشتری داشته باشد راه حل هایی برای حل class-imbalance بودن رو اگر میدونید لطفا ذکر کنید و یکم توضیح دهید- با سپاس

توسط (389 امتیاز)

3 پاسخ

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

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

توسط (165 امتیاز)
انتخاب شده توسط
پس با این حساب فرضا من نوعی که میام رو human detection  کار میکنم پس برای چی از مدل های آموزش دیده استفاده بکنم ؟ بنظر شما بهتر نیست یک شبکه کوچک و lightweight در نظر بگیرم ولی بیام بجای فاین تیون مدل آموزش دیده روی امیج نت ، بیای از scratch  شبکه سبک رو دیتای human آموزش بدم این بهتر نیست ؟ یعنی شبکه تمرکز اصلیش روی این تسک باشه
و این هم برای من جای سواله درسته که استفاده از مدل های آموزش دیده زمان ترین یک شبکه رو کم میکنید ولی فرضا شبکه ایی مثله VGG که اومده روی 1000 کلاس با 1.2 میلیون عکس آموزش دیده در واقع این شبکه گنجایش یادگیری فیچرهای این 1000 کلاس رو دارد بنظر کار خوبی نیست این مدل رو که گنجایش یادگیری 1000 کلاسی رو دارد بیاییم روی فرضا 2 کلاسه مثله human بکار ببریم
میشه یک شبکه سبک رو طراحی کرد که فرضا برای human ترین بشه و فقط ویژگی های اینها رو خوب یاد بگیره
ببینید، موضوع اینه که هر دوتا کار قابل انجام هستش. درست بگم در مورد فاین تیون کرد بنجو یه مقاله ی خیلی معروف داره که توی اونجا شرایط اینکار و علت رو می گه. معمولا فاین تیون کردن رو زمانی انجام می دن که شما به فرض 100 کلاس از حیوانات رو می دونید چی هستند حالا می خواهید 101 تا حیوان رو سیستمتون بفهمه. معمولا جاهایی که می آن مدل ترین شده روی ایمیج نت رو تیون می کنند کاربردشون مثل تگ زدن به تصاویر __کاری که فیسبوک می کنه__ و کارهای لارج اسکیلی مثل اینه. اما در مورد تسک شما نگاه کنید خودتون قراره لیبل های دیگه رو اصلا استفاده کنید؟ منظورم اینه که برای تسکی که مثلا تشخیص انسان هستش شما قطعا باید به شبکه برای ترین داده های غیر انسان هم بدید ولی موضوعی که هست بحث لیبلی هستش که می زنید. آیا ضروری که لیبل های دیگه رو هم بفهمه چین یا اینکه فقط کافیه به فرض که بفهمه پترن ورودی انسان هست یا نه. ولی چیزی که هست اینه که شما اگر برای مثلا تشخیص انسان شبکه رو ترین می کنید حتما یه سری داده که انسان هم نیستند به شبکه بدید. یه پیش نهادی هم که دارم اینه که مثلا داده های میمون بدید و لیبل (نه انسان!) بزنید تا شبکه داده هایی که به فرض به انسان نزدیک هستند ولی انسان نیستند رو هم یاد بگیره. مثال انسان که تو کامنت استفاده کردم یه مثال نوعی بود.
در مورد معماری هم یه بحثی که هست اینه که شما برای کارهایی که می خواهید خودتون یه معماری درست کنید، حتما بیایید و از مینیمال ترین حالت شروع کنید و با درصد validation و test معماری رو بسنجید. در واقع خود معماری هم به نوعی هایپرپارامتر محسوب می شه.
+1 امتیاز

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

توسط (255 امتیاز)
+1 امتیاز

سلام
یه راهی که من پیدا کردم قرار دادن class weight تو تابع fit هست

class_weight = {0 : 1.,
    1: 50.,
    2: 2.}

model.fit(X_train, Y_train, nb_epoch=5, batch_size=32, class_weight = class_weight)

یا

from sklearn.utils import class_weight
   
class_weight = class_weight.compute_class_weight('balanced', np.unique(y_train), y_train)
   
model.fit(X_train, y_train, class_weight=class_weight)
توسط (208 امتیاز)
ممنون
اون .1 و .50 و .2 چی هستند ؟ احتمالا درصد انتخاب دیتا از کلاس ها رو نشون میده ؟
آره
class_weight: Optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function (during training only). This can be useful to tell the model to "pay more attention" to samples from an under-represented class.
sample_weight: Optional Numpy array of weights for the training samples, used for weighting the loss function (during training only). You can either pass a flat (1D) Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data, you can pass a 2D array with shape (samples, sequence_length), to apply a different weight to every timestep of every sample. In this case you should make sure to specify sample_weight_mode="temporal" in compile().
...