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

با تشکر

دسته بندی ها

+1 امتیاز

سلام
شبکه فقط دو اپوچ بهبود پیدا میکنه و بعد over-fit میشه
optimizer = nadam , LR=0.001
با مقادیر 0.1 0.001 0.0001 هم تست کردم همه رو دو سه اپوچ اول اورفیت میشن

1- راه های جلوگیری از این قضیه چیه ؟
2- reqularization رو کجا اعمال کنیم بهتره و به چه شکل ؟

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(width, height,1)))
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))#3

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))#3

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))#3

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))#3

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64))
#model.add(BatchNormalization())
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(Dropout(0.7))

model.add(Dense(1))
model.add(Activation('sigmoid'))


sgd = keras.optimizers.Nadam(lr=0.001)


model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])

keras.callbacks.Callback()
from keras.callbacks import ModelCheckpoint
from keras.callbacks import EarlyStopping

 

model_path = 'd:\\fm_cnn_BN.h5'
# prepare callbacks
callbackss=[ EarlyStopping(
        monitor='val_acc', 
        patience=10,
        mode='max',
        verbose=1),
        
        ModelCheckpoint(model_path,
        monitor='val_acc', 
        save_best_only=True, 
        mode='max',
        verbose=1)]

history=model.fit_generator(
        train_generator,
        steps_per_epoch=int(train_generator.samples/train_generator.batch_size), #x_train.shape[0] // batch_size,
        epochs=100,
        validation_data=validation_generator,
        validation_steps=int(validation_generator.samples/validation_generator.batch_size),
        callbacks=callbackss
        )

#model.save_weights('d:\\fm_cnn_BN2.h5')  # always save your weights after training or during training
print('test result')
model.load_weights('d:\\fm_cnn_BN.h5')  # always save your weights after training or during training
score=model.evaluate_generator(test_generator,steps=int(test_generator.samples/test_generator.batch_size))
توسط (208 امتیاز)

2 پاسخ

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

سلام
تجربه شما خیلی جالب بوده، اگه وقت کردید این 2 تا مقاله رو ببینید که نشون می ده Regularization میتونه چه تاثیر کمی داشته باشه، حتی در آموزش روی دیتا های کاملا رندوم و تهش شبکه می تونه با همه این اوصاف overfit بشه (البته در مورد تفسیر نتایجش و کاربردش در عمل احتیاط کنید)

Understanding deep learning requires rethinking generalization

https://arxiv.org/abs/1611.03530

A Closer Look at Memorization in Deep Networks

https://arxiv.org/abs/1706.05394

توی معماری شبکتون از Dropout استفاده کردید که یکی از بهترین Regularization های شبکه های عمیقه و احتمالا طبق کدتون Batchnormalization رو هم تست کردید
نکته خیلی مهم اینه که اول مشخص کنید چقدر دیتا دارید و این حجم از دیتا برای آموزش معمولی شبکه ای که گذاشتید کافیه یا نه؟ اگه دیتاهاتون خیلی کمه، با کلی regularization هم به این راحتی نمی تونید شبکه رو آموزش بدید و تهش شبکه overfit میشه.
اگه دیتاهاتون کمه، بهترین کار اینه که بیشتر دیتا جمع کنید و از روشهای transfer learning و از وزن شبکه هایی که آماده هست استفاده کنید و روی دیتاهای خودتون finetune کنید.

برای مقایسه بهتر، قبل از اینکه با شبکه اصلی کارتون رو پیش ببرید، یه شبکه خیلی ساده تر هم داشته باشید که آموزشش سریع انجام بشه و بتونید برای خودتون baseline داشته باشید. مثلا بگید دیگه با این شبکه ساده، دقت 80 روی تست گرفتم پس شبکه اصلی باید جوری آموزش داده بشه که حداقل 80 رو بده و اگه نمیشه پس یه جایی مشکل هست(مثلا همین کمبود دیتا یا ساختار نامناسب)

مهمترین قسمت توی آموزش یه شبکه بزرگ، دیتا کافیه، یا یه جوری بر طرف کردن این ضعف با روشهایی مثل transfer learning که گفته شد. حتما این قسمت رو اول درست کنید بعد برید سراغ روشهای regularization
در مورد تاثیر data augmentation هم که خودش می تونه تاثیر regularization داشته باشه در مقاله هایی که گفتم موضوعات جالبی مطرح شده

=======================================

در مورد کدتون و Dropout های بعد از لایه های کانولوشن که با 3# مشخص کردید، این نحوه استفاده از dropout تقریبا تاثیری توی جلوگیری از overfit شدن نداره. چون مثلا چندتا پیکسل های feature map صفر میشه. شبیه اینه که توی تصویر چندتا پیکسل رو رندوم خراب کنید، که اتفاق خاصی نمی افته (به خصوص اگه تصویر بزرگ باشه). چون پیکسلهای نزدیک به هم correlation خیلی بالایی دارن و اطلاعات از طریق اونها هم می تونه منتقل بشه
این موضوع توی توضیح SpatialDropout توی داکیومنت های keras هم گفته شده. اگه واقعا می خواید وسط شبکه از dropout استفاده کنید، بهتره بیشتر به SpatialDropout فکر کنید. چون که به جای پیکسلی کار کردن، کل یه feature map رو حذف میکنه

https://www.tensorflow.org/api_docs/python/tf/keras/layers/SpatialDropout2D

توسط (1.6k امتیاز)
انتخاب شده توسط
سلام
L2 هم کمکی نکردفقط اجازه نداد خیلی overfit بشه ولی جواب رو بهتر نکرد.
الان برای هر کلاس 30000 تا تصویر دارم (60000 برای هردو کلاس)
خودمم تو همین فکر بودم
چند تا تصویر اگر بدم خوبه ؟
1 میلیون ؟ 1.5 میلیون ؟ هرچی بیشتر بهتر !؟
تعداد داده هاتون بسته به مساله داره
یعنی ممکنه مساله این باشه که توی تصاویر 28x28 شبیه MNIST، عدد صفر رو از عدد 9 تشخیص بدید
اگه از هر کدوم، 30 هزارتا تصویر داشته باشید احتمال زیاد دقت خیلی خوبی می گیرید
اما ممکنه تصویر شما پزشکی و Full HD باشه که باید تشخیص بدید یه بیماری مثل سرطان وجود داره یا نه، بافت سالم با بافت سرطانی هم خیلی شبیه. غده هم ممکنه یه چیزه کوچیک اون وسطای تصویر باشه. توی این سناریو شاید 30 هرازتا تصویرتون اصلا کافی نباشه
یعنی علاوه بر مشکلاتی که توی آموزش شبکه هست، باید ذات مساله ای که می خواید حل کنید رو هم سعی کنید بیشتر بشناسید. تا قبل از اینکه این مساله شناخت دیتا ها و baseline رو حل نکردید بهتره خیلی وقت روی ساختار شبکه نذارید چون مثل تیر توی تاریکی می مونه

در مورد Dropout بعد از لایه های کانولوشنی امروز یه نکته یادم اومد که جوابم رو آپدیت کردم
+1 امتیاز

یک مثال می زنم خودتان در کدتان اعمال کنید:

model.add(Dense(64, activation = 'relu', input_shape = (784,), kernel_regularizer = regulizers.L2(0.01)))

در ضمن هایپرپارامتر دراپ اوتتون را نزدیک 0.5 قرار بدید. از طرفی برای اینکه نتیجه را مشاده کنید باید تعداد ایپاک بیشتری را طی کنید.

توسط (165 امتیاز)
سلام
1- این عمل تو لایه ی dense مهمتر هست یا تو conv2d ? یا هر دو ؟
2- کل شبکه یک مقدار میگیره یا باید هرکدوم بهینه بشه ؟
سلام، اگر منظورتون برای L2 هستش، اگر تو اورلودهای هر لایه ای که اضافه می کنید دقت کنید وجود داره. بسته به کارتون استفاده کنید. علت استفاده از L2 اینه که وزنی بیش از حد بزرگ نشه بزرگیش که شبکه به ورودی اون وزن خیلی وابسته شه. منتها معمولا جاهایی که خیلی پارامتر هستش لازمه استفاده کنید وگرنه اورفیت می شه؛ چون تعداد پارامتر زیاد شه خیلی داده باید وجود داشته باشه که اورفیت نشه. معمولا لایه های دنس چون خیلی پارامتر دارن برای اینکه نویز بدن تا شبکه خیلی وابسته به وزن زیاد نشه از این راه و دراپ اوت استفاده می شه.
برای قسمت بعدی هم اگر منظورتون اینه که برای کل شبکه باید L2 قرار بدید، تجربه به من اثبات کرده که بله ولی توصیه ام اینه که هایپرپارامترشون رو یکسان بگیرید. که رابطه ی cost خیلی پیچیده نشه. (برای شروع از 3 یا 1 می تونید استفاده کنید برای هایپرپارامتر)
...