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

با تشکر

دسته بندی ها

0 امتیاز

با سلام
من از یک شبکه کانوولوشن 7 لایه برای یادگیری روی یک دیتاست پزشکی استفاده کردم که تعداد تصویر 4212 تصویر 200*200 و سه کلاسه است .مشکل من اینه که دقت زمان یادگیری در حدود 0.5 است و روند افزایش به شدت کمه تا جایی که بعد از 10 تکرار تابت میشه.دقت روی ولیدیشن که کلن ثابت .ولی مقدار loss چه در زمان ترینینگ و چه در ولیدیشن تغییر میکنه ولی خیلی کم.نکته ای که وجود داره اینه که در ابتدای یک دور که تعداد بچ ها تغییر میکنن دقت بالا میره ولی وقتی میگذره روند رشدش رو به پایین میشه و .نرخ یادگیری رو تغییر دادم و تقریبا از همه روش ها استفاده کردم ولی فایده ای نداشت.از dropout هم استفاده کردم.خود مقاله با این لایه ها در حدود 0.84 دقت داشته روی داده های تست.معماری هم به شکل زیر:

model = Sequential()

model.add(Convolution2D(96, (11, 11), subsample=(4, 4),activation='relu',padding="valid",kernel_initializer='random_normal', input_shape=(200,200,1),data_format="channels_last"))

model.add(MaxPooling2D(pool_size=(2,2)))
model.add(ZeroPadding2D(padding=(2, 2)))
model.add(Convolution2D(256,( 5, 5),subsample=(2, 2), activation='relu',padding="same"))
model.add(Convolution2D(48,( 1, 1), 

model.add(MaxPooling2D(pool_size=(2,2)))
model.add(ZeroPadding2D(padding=(1, 1)))
model.add(Convolution2D(384,( 3, 3),subsample=(1, 1), activation='relu',padding="same"))

model.add(Convolution2D(256, (3, 3),subsample=(2, 2), activation='relu',padding="same"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Convolution2D(192,( 6, 6),subsample=(1, 1), activation='relu',padding="same"))
#model.add(normalization.BatchNormalization())
model.add(Dropout(0.25))
model.add(Convolution2D(96,( 1, 1),subsample=(1, 1), activation='relu',padding="valid"))
#model.add(normalization.BatchNormalization())
model.add(Dropout(0.25))
model.add(ZeroPadding2D(padding=(1, 1)))
model.add(Convolution2D(3,( 1, 1),subsample=(2, 2), activation='relu',padding="same"))
model.add(Dropout(0.25))

#model.add(MaxPooling2D(pool_size=(7, 7),strides=1, padding='same'))

    model.add(Flatten())
    model.add(Dense(3,activation='softmax'))
sgd = SGD(lr=0.0001, decay=1e-6, momentum=1, nesterov=True)
model.compile(loss='categorical_crossentropy

          optimizer=sgd,
          metrics=['accuracy'])

model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,

show_accuracy=True, verbose=1, validation_data=(X_test, Y_test))

history=model.fit(X_train, Y_train, 

batch_size=25,shuffle=True, nb_epoch=15, verbose=1,validation_data=(X_test, Y_test))

.

 - 2695/2695 [==============================] - **122s 45ms/step - loss:
   1.0979 - acc: 0.5340 - val_loss: 1.0972 - val_acc: 0.5386 Epoch 2/15 2695/2695 [==============================] - 133s 49ms/step - loss:
   1.0966 - acc: 0.5343 - val_loss: 1.0959 - val_acc: 0.5386 Epoch 3/15 2695/2695 [==============================] - 132s 49ms/step - loss:
   1.0953 - acc: 0.5343 - val_loss: 1.0945 - val_acc: 0.5386 Epoch 4/15 2695/2695 [==============================] - 127s 47ms/step - loss:
   1.0940 - acc: 0.5343 - val_loss: 1.0932 - val_acc: 0.5386

--![][1]------------------------------------------------------------------
توسط (100 امتیاز)
ویرایش شده توسط
سلام. از چه سیاست یادگیری خود مقاله استفاده کرده؟‌از SGD یا نوع دیگه مثل adadelta یا adam یا ...؟‌ نرخ ویت دیکی چقدر بوده شما ویت دیکی خیلی پایینی ست کردید (البته این نسبیه ولی برای تست همیشه مقادیر مختلف ویت دیکی رو تست کنید خیلی پیش میاد باعث اورفیت یا اندرفیت شبکه میشه مقادیر نامناسبش)
اون متد زیروپد چیه که استفاده کردید ؟‌ خود تابع کانولوشن مگه پارامتر padding نداره ؟‌در مقاله به همین صورته؟‌استفاده از بچ نرمالیزیشن طبق مقاله اس یا خودتون اینطور لحاظ کردید ؟‌ دراپ اوت چطور ؟‌
ضمنا دقت زمان ترینینگ رو هم چک کنید تا مشخص بشه اندرفیت میکنید یا اورفیت دارید.
مشخص نکرده دقیق ولی از فرمولی که نوشته منظورش همون sgdهست فک کنم،راجع به پارامترها اصلا صحبتی نکرده فقط مقدار  dropout همون ۰.۵در نظر گرفته،چون داخل مقاله گفته padding 2*2 من استفاده کردم،چون نمیدونستم padding چطور استفاده میشه،البته بدون اینها هم باز همونجور بود،مقدار normalization هم مقاله نگفته ولی بدون اون هم باز تغییری تو مقدارش نبود من اضافه کردم شاید تغییر کنه،و همچنین از adam,rmsprop هم استفاده کردم،مقدار دیکی رو فقط e-5 امتحان کردم
دراپ اوت بعد همه لایه ها گذاشته یا یکسری لایه خاص؟‌ پدینگ برای ورودی بوده یا بین لایه ها (چون خیلی فرق میکنه) هر لایه میتونه پدینگ داشته باشه اما اگه زیاد باشه خصوصا جایی غیر از ابتدای ورودی (اونجا هم زیاد باشه مشکل ایجاد میکنه اما در داخل شبکه خیلی محسوس تره) روی همگرایی تاثیر سویی داره. معمولا از پدینگ برای جلوگیری از کاهش ابعاد استفاده میکنن . در کانولوشن ۳در۳ پدینگ ۱ استفاده میشه برای اینکار. برای همین برای من جای سواله که چرا اینطور عمل شده. زمانی که تغییری در شبکه میدید حتما هر بار یک تغییر رو لحاظ کنید تا مطمین بشید اثر همون تغییر رو دارید میبینید. برای شروع اول دقت و لاس تریننیگ رو لاگ کنید و نمایش بدید ببینید به چه صورتی هست این اطلاعات خوبی میده که ببینید شبکه در چه وضعیتیه .
برای دراپ اوت هم دقت کنید اول باید مشخص کنید شبکه داره چیکار میکنه. چون میتونه خیلی راحت باعث اندرفیت شبکه شما بشه همونطور که ویت دیکی میتونه اینکارو بکنه. بچ نرمالیزیشن بعد از هر رلو قرار بدید بعد از هر لایه و اینطور ترینینگ شبکه شما استیبل تر میشه و همگرایی شما هم خیلی سریعتر اتفاق می افته. نرخ دراوت 0.25 برای شروع خوبه  .میتونید بعد از تمامی لایه ها استفاده کنید البته همگام با اون نمودار ترینینگ لاس در ترینینگ و تست رو هم چک کنید و بعد میتونید کم و زیاد کنید. ویت دیکی رو هم ۱۰ برابر کم و زیاد کنید. (ابتدا باید یک بیسی داشته باشید. یعنی نمودار ترینینگ (دقت ترین و لاس و همینطور تست ) رو داشته باشید بعد مثلا ویت دیکی رو ۱۰ برابر افزایش (یا کاهش بدید بستگی داره از چه سمتی شروع میکنید از کم یا زیاد) و دقت کنید تست ها رو حداقل ۳ بار انجام بدید تا از تاثیرات تغییراتتون اطمینان حاصل کنید (یه مقداردهی رندوم اولیه بد باعث نشه یه تغییر خوب رو از دست بدید و بلعکس)
من تصویر لایه ها رو تو سوال اصلی فرستادم ،درست پیاده سازی شدن؟
ویرایش رو بزنید در داخل ادیتور یک آیکون تصویر هست روش کلیک کنید و تصویرتون رو آپلود کنید.
کانولوشن اول شما پدینگ صفر, ولی استراید ۴ داره. بعدش هم انگار یک پولینگ با استراید ۲در۲ وجود داره (کرنلش رو قید نکرده ) شما تو لایه اول چرا ساب سمپلینگ ۴در۴ گذاشتید؟‌
به همین ترتیب لایه دوم پدینگ =۲ و استراید =۲ داره و باز بعدش یه پولینگ با استراید ۲ در۲ (شاید کرنل پولینگ ۲در۲ بوده و عملیاتش nonoverlapped pooling )
در لایه چهارم کرنل پولینگ رو نوشته ولی صحبتی از استراید نکرده (احتمالا همون استراید ۲در۲ باشه تا اینطور یه overlapped pooling انجام بشه ؟‌ خیلی بد نوشتن!) در متن توضیح ندادن به چه فرمی هست معماری ؟‌
 ضمنا اون لایه بعد ازلایه دوم چیه که ۴۸ نورون داره با کرنل ۱در۱ ؟‌بین ۲ و سه هم پولینگی وجود نداره
یکبار دیگه معماری خودتون رو با تصاویر چک کنید علاوه بر اون یه نگاهی به API‌کراس بندازید. استراید و پدینگ در لایه کانولوشن هست . ساب سمپلینگ من نمیدونم تو اون لایه چیکار میکنه (با کراس آشنایی چندانی ندارم) برای پدینگ ۱در۱ فک میکنم از طریق خود لایه کانولوشن اقدام کنید بهتر باشه البته بعد از اینکه مشکلات قبلی رو برطر کردید
ورژن جدید کراس ،subsampling, همون استراید هستش،چون کرنل قید نشده فرض بر این بوده که ستراید و کرنل در لایه پولینگ یکسانند،اون لایه با۴۸ نرون کامنت بوده متاسفانه که وقتی کپی کردم از بین رفته و تو لایه ها نیست،خود مقاله با استفاده از matconvnet تو متلب نوشته شده،یعنی قید کرده که cnn takes shape of matconvnet
سلام. من تسلطی به کراس ندارم متاسفانه نمیدونم پیاده سازی صحیح به چه شکل هست. اجازه بدید بقیه عزیزانی که با کراس آشنا هستن بیان نظر بدن .

1 پاسخ

0 امتیاز

سلام
مشکل شبکه به خاطر داده های ورودی بود و داده ها رنج مناسبی نداشتند و همچنین بعضی از تصاویر به اصطلاح dirtydata بودن که با حذف اونها شبکه از underfitting خارج شد ولی دچار overfitting شد روی داده های ترین دقت خوبی داشت ولی روی داد های تست دقت متوسطی داشت ولی مقدار loss روی داده های تست بالا بود.برای رفع این مشکل از data augmentation در کراس استفاده کردم که تعداد داده های ترین رو افزایش میده و یکی از راه های رفع overffiting .الان شبکه من بعد از 10 بار تکرار به شکل زیر عمل میکنه همه پارامتر ها مثل قبله، آیا رفتار شبکه منطقیه؟

Epoch 1/10
81/81 [==============================] - 74s 919ms/step - loss: 0.9530 - acc: 0.5320 - val_loss: 0.7234 - val_acc: 0.7247
Epoch 2/10
81/81 [==============================] - 73s 903ms/step - loss: 0.8058 - acc: 0.6211 - val_loss: 0.6075 - val_acc: 0.7424
Epoch 3/10
81/81 [==============================] - 71s 873ms/step - loss: 0.7392 - acc: 0.6617 - val_loss: 0.5463 - val_acc: 0.7559
Epoch 4/10
81/81 [==============================] - 76s 943ms/step - loss: 0.6543 - acc: 0.7141 - val_loss: 0.5913 - val_acc: 0.7660
Epoch 5/10
81/81 [==============================] - 80s 986ms/step - loss: 0.6141 - acc: 0.7442 - val_loss: 0.4644 - val_acc: 0.7965
Epoch 6/10
81/81 [==============================] - 80s 987ms/step - loss: 0.5673 - acc: 0.7666 - val_loss: 0.4430 - val_acc: 0.8226
Epoch 7/10
81/81 [==============================] - 76s 939ms/step - loss: 0.5352 - acc: 0.7894 - val_loss: 0.4146 - val_acc: 0.8302
Epoch 8/10
81/81 [==============================] - 81s 1s/step - loss: 0.4900 - acc: 0.8090 - val_loss: 0.4588 - val_acc: 0.8184
Epoch 9/10
81/81 [==============================] - 82s 1s/step - loss: 0.5082 - acc: 0.8036 - val_loss: 0.5285 - val_acc: 0.8074
Epoch 10/10
81/81 [==============================] - 78s 967ms/step - loss: 0.4861 - acc: 0.8129 - val_loss: 0.4481 - val_acc: 0.8209
1194/1194 [==============================] - 9s 8ms/step
Score: [0.44950839365447187, 0.8199329983249581]

توسط (100 امتیاز)
...