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

با تشکر

دسته بندی ها

0 امتیاز

سلام

دو مدل جدا داشتم
مدلی برای تصویر به تنهایی 84 درصد صحت داشت و مدل داده به تنهایی 82 درصد صحت داشت ولی ترکیبشون که تو تصویر اومده 70 درصد صحت میده !
هر دو مدل رو با هم آموزش دادم و بعد ترکیب کردم و دادم به لایه ی fully connected(لایه ی fc عوض نشد و همونی که تو مدل تکی بود استفاده کردم)
ولی نمیدونم چرا صحت انقدر کم شد !
راه حل ممکن که به ذهنم میرسه:
1- اول مدل 1 رو آموزش بدم و مدل 2 رو trainable رو غیر فعال کنم و بعد مدل 1 رو trainable رو غیر فعال کنم و مدل 2 رو آموزش بدم و بعد هر دو غیر فعال کنم و لایه ی FC رو آموزش بدم
2- اول مدل 1 رو آموزش بدم و مدل 2 رو trainable رو غیر فعال کنم و بعد مدل 1 رو trainable رو غیر فعال کنم و مدل 2 رو آموزش بدم
3- همین راهی که رفتم درسته و هر دو مدل رو همزمان آموزش بدم ولی یه جای کارم اشکال داشته که صحت کمتر شده
نظر شما چیه ؟
4- دو مدل رو کلا جدا آموزش بدم(ترکیب نباشه) بعد بیام وزن هارو انتقال بدم به شبکه ی جدید و trainable =false کنم؟

5- تو فاز آموزش هر 5 اپوچ جواب بهتر میشه(5 تا acc کاهش پیدا میکنه یکجا میزنه بهتر میشه) به نظرتون با Batch norm بهتر بشه ؟ کجاش batch norm قرار بدم بهتره ؟
کدوم راه ها درست هست ؟ و کدوم درست تر ؟!

import keras 
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img


from tqdm import tqdm      # a nice pretty percentage bar for tasks. Thanks to viewer Daniel Bأ¼hler for this suggestion
import os                  # dealing with directories
#import cv2                 # working with, mainly resizing, images
import numpy as np         # dealing with arrays
from random import shuffle # mixing up or currently ordered data that might lead our network astray in training.

import matplotlib.pyplot as plt
#plt.imshow(img)




from keras import regularizers
from keras.models import Sequential,Model
from keras.layers import Conv2D, MaxPooling2D,BatchNormalization,Conv3D
from keras.layers import Activation, Dropout, Flatten, Dense,TimeDistributed,Bidirectional,LSTM,Reshape

# Model 

#img <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
input1 = keras.layers.Input(shape=(300, 800,1))
conv1= Conv2D(filters=4,kernel_size=(5,5),strides=(3,3), activation='relu',name='img_conv1')(input1)
max1= MaxPooling2D(2,1,name='img_max1')(conv1)
drop1= Dropout(0.25,name='img_drop1')(max1)

conv2= Conv2D(filters=8,kernel_size=(5,5),strides=(3,3), activation='relu',name='img_conv2')(drop1)
max2= MaxPooling2D(2,1,name='img_max2')(conv2)
drop2= Dropout(0.25,name='img_drop2')(max2)

flat1=Flatten(name='img_flat1')(drop2)
#>>>>>>>>>>>>>


# data
input2 = keras.layers.Input(shape=(16410,))
m2_dense1= Dense(128,kernel_initializer='lecun_uniform', activation='relu')(input2)  # kernel_regularizer=regularizers.l2(0.01)
m2_drop1= Dropout(0.5)(m2_dense1)

m2_dense2= Dense(64,kernel_initializer='lecun_uniform', activation='relu')(m2_drop1) 
m2_drop2= Dropout(0.5)(m2_dense2)

#m2_dense3= Dense(8,kernel_initializer='lecun_uniform', activation='relu')(m2_drop2) 
#m2_drop3= Dropout(0.5)(m2_dense3)

#flat=Flatten()(m2_drop2)

#############
flat=keras.layers.concatenate([flat1,m2_drop2], axis=-1)

#flat=Flatten()(merg)
fc_dense1= Dense(256, activation='relu', kernel_regularizer = regularizers.l2(0.001))(flat)
fc_drop1= Dropout(0.96)(fc_dense1)

fc_dense2= Dense(8, activation='relu', kernel_regularizer = regularizers.l2(0.001))(fc_drop1)
fc_drop2= Dropout(0.7)(fc_dense2)

out=Dense(1,activation='sigmoid')(fc_drop2)

model = keras.models.Model(inputs=[input1,input2], outputs=out)
sgd = keras.optimizers.Nadam(lr=0.0001)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])

با تشکر

توسط (208 امتیاز)
ویرایش شده توسط
شبکه آخر رو یه کم بد نوشتید
برای تعداد نود کم مثل 8 نود بهتره از softrelu به جای رلو استفاده کنین و دراپ اوت هم نگزارید اون 0.98 رو هم درست کنید زیاده
ممنون از نظرتون
softrelu پیدا نکردم تو کراس داریمش ؟
دارپ رو بالا دادم که overfit نشه
با همین لایه ی fc هردو مدل خوب جواب میدن جدا ترکیب که میشن کار خراب میشه !
بله به اسم softplus

1 پاسخ

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

سلام.
دو تا راه حل اولی که گفتی رو باید تست کنی ببینی چقدر تاثیر دارن. ولی میتونی از راه حل سوم هم به شکل زیر استفاده کنی (این رو هم باید تست کنی ببینی تاثیرش در مقایسه با سایر حالات چقدره):
- اول مدل 1 رو ترین کن بقیه مدل ها رو freeze کن. بعد مدل ۲ رو ترین کن بقیه مدل ها رو freeze کن. در انتها کل شبکه رو ترین کن. فقط دقت کن در گام سوم (ترین کل شبکه) مقدار نرخ یادگیریت رو خیلی کم بذاری (مثلا 0.00005).

یه نکته دیگه اینه که dropout با 0.96 نرخ دراپ خیلی زیاده! من خودم به شخصه وقتی میخوام یه مساله رو حل کنم اول از یه شبکه ساده بدون رگولارایزر و dropout استفاده میکنم. بعدش اگه با افزایش پارامترهای شبکه شبکه overfit کرد میرم سراغ رگولارایزر و dropout . مقدار dropout رو هم بالای 0.5 نمیذارم معمولا.

در مورد batchnorm به نظرم به شبکه ات اضافه کن. اگه تعداد لایه ها زیاد باشن لایه batchnorm خیلی اهمیت پیدا میکنه (حساسیت به initialize رو کم میکنه و شبکه سریع تر همگرا میشه). حتی برای شبکه های با تعداد لایه کم هم استفاده از batchnorm ایده بدی نیست. یه دلیلش اینه که تا حدی مساله overfit رو بهبود میده چون هر نمونه در هر بچ تحت تاثیر سایر نمونه های بچ مقدار خروجی نورون رو تغییر میده و یه جورایی به شبکه نویز اضافه میکنه که باعث کاهش overfit میتونه بشه.

نکته: اگه از batchnorm در کراس استفاده میکنی یه نکته ریز داره و اونم اینه که وقتی لایه batchnorm رو trainable ش رو false میکنی باز هم یه سری پارامتر داره که با توجه به بچ تغییر میکنن و در نتیجه اون لایه کامل freeze نمیشه. برای freeze کردن لایه batchnorm به طور کامل یه سری راه حل هست. ولی خدا رو شکر این ایراد در نسخه نهایی کراس (2.1.3) برطرف کردن (این ورژن حدود 20 روز پیش اومد و قبل از اون برای freeze کردن لایه batchnorm یه سری کار دیگه باید میکردید). به هر حال حتما نسخه کراس رو آپدیت کن به آخرین نسخه تا درگیر این مسایل نشی.

توسط (540 امتیاز)
انتخاب شده توسط
ممنون از پاسخ کاملتون
من batch norm یکبار استفاده کردم جالب نبود و دقیق نفهمیدم کجا بهتره باشه
1- ورودی رو اول بدم به بچ نورم (قبل هرچیزی)
2- بعد لایه های conv و قبل از activation ها
3- بعد لایه ی dense و قبل relu

همچین مدلی که ترکیب تصویر و دیتا باشه رو نوشتین یا دیدین جایی ؟
ممنون
اصولش و اون چیزی که خود مقاله اصلی batch norm گفته اینه که قبل از nonlinearity ها بذارید.
بعد از تمام کانولوشن ها و همچنین Dense ها لایه batch norm رو اضافه کنید و بعد از batch norm لایه activation رو اضافه کنید.
چیزی که در بعضی از کدها میشه دید اینه که بعضا لایه batch norm رو بعد از activation میذارن و میگن در عمل فرق نداره یا دقت رو کمی بهتر میکنه (ولی اصولیش اینه که قبل از activation باشه).
1- میتونی ورودی رو بدی به بچ نرم. ولی این کار رو خیلی کم دیدم کسی بکنه. چون دیتا رو معمولا قبل از این که به شبکه بدن نرمالیزه کردن (از میانگین کم کردن و احتمالا بین -1 تا +1 مپ کردن).
2 و 3- هم بعد conv و هم بعد dense

بله. شبیه این مساله رو قبلا داشتم. ولی اطلاعات اصلی رو تصاویر بود و اطلاعات مربوط به غیر از تصاویر تاثیری در بهبود نتایج نداشت. البته اون کار دیتاش خیلی کم بود (کمتر از 1500 تصویر) و نوع دیتا طوری بود که استفاده از finetuning مفید نبود.
...