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

با تشکر

0 امتیاز

سلام

دیتاست مورد استفاده من شامل 500 نمونه اموزشی خاکستری با سایز 2435 *2435 هست . نمونه های تست هم 100 تا با همین سایز و مشخصات هستند. وقتی میخام رزنت 50 را اجرا کنم . ارور ناشی از کمبود رم جی پی یو میده- در حالی که من بچ سایز هم روی 1 تنظیم کردم. یه کم میره جلو و وقتی که میخاد وارد تکرار ها بشه ارور میده- برای شبکه الکس نت هم به همین مشکل بر میخوردم.
متن خطا:

I0419 00:04:49.554070  5076 layer_factory.cpp:58] Creating layer resnet_50
I0419 00:04:49.555054  5076 net.cpp:100] Creating Layer resnet_50
I0419 00:04:49.555054  5076 net.cpp:408] resnet_50 -> data
I0419 00:04:49.555054  5076 net.cpp:408] resnet_50 -> label
I0419 00:04:49.557337  5196 common.cpp:36] System entropy source not available, using fallback algorithm to generate seed instead.
I0419 00:04:49.557337  5196 db_lmdb.cpp:40] Opened lmdb examples/resnet50/eardataset_test_lmdb
I0419 00:04:49.577352  5076 data_layer.cpp:41] output data size: 1,3,2435,2435
I0419 00:04:49.737599  5076 net.cpp:150] Setting up resnet_50
I0419 00:04:49.738315  5076 net.cpp:157] Top shape: 1 3 2435 2435 (17787675)
I0419 00:04:49.740319  5076 net.cpp:157] Top shape: 1 (1)
I0419 00:04:49.739318 10812 common.cpp:36] System entropy source not available, using fallback algorithm to generate seed instead.
I0419 00:04:49.740319  5076 net.cpp:165] Memory required for data: 71150704
I0419 00:04:49.741344  5076 layer_factory.cpp:58] Creating layer conv1
I0419 00:04:49.741344  5076 net.cpp:100] Creating Layer conv1
I0419 00:04:49.742321  5076 net.cpp:434] conv1 <- data
I0419 00:04:49.742321  5076 net.cpp:408] conv1 -> conv1
.
.
.
I0419 00:04:50.915083  5076 net.cpp:157] Top shape: 1 2048 77 77 (12142592)
I0419 00:04:50.916085  5076 net.cpp:165] Memory required for data: 27426848624
I0419 00:04:50.916085  5076 layer_factory.cpp:58] Creating layer res5c
I0419 00:04:50.916085  5076 net.cpp:100] Creating Layer res5c
I0419 00:04:50.917084  5076 net.cpp:434] res5c <- res5b_res5b_relu_0_split_1
I0419 00:04:50.917084  5076 net.cpp:434] res5c <- res5c_branch2c
I0419 00:04:50.918087  5076 net.cpp:408] res5c -> res5c
I0419 00:04:50.918087  5076 net.cpp:150] Setting up res5c
I0419 00:04:50.918087  5076 net.cpp:157] Top shape: 1 2048 77 77 (12142592)
I0419 00:04:50.919086  5076 net.cpp:165] Memory required for data: 27475418992
I0419 00:04:50.919086  5076 layer_factory.cpp:58] Creating layer res5c_relu
I0419 00:04:50.919086  5076 net.cpp:100] Creating Layer res5c_relu
I0419 00:04:50.920086  5076 net.cpp:434] res5c_relu <- res5c
I0419 00:04:50.920086  5076 net.cpp:395] res5c_relu -> res5c (in-place)
I0419 00:04:50.921087  5076 net.cpp:150] Setting up res5c_relu
I0419 00:04:50.922088  5076 net.cpp:157] Top shape: 1 2048 77 77 (12142592)
I0419 00:04:50.922088  5076 net.cpp:165] Memory required for data: 27523989360
I0419 00:04:50.923089  5076 layer_factory.cpp:58] Creating layer pool5
I0419 00:04:50.923089  5076 net.cpp:100] Creating Layer pool5
I0419 00:04:50.923089  5076 net.cpp:434] pool5 <- res5c
I0419 00:04:50.924089  5076 net.cpp:408] pool5 -> pool5
I0419 00:04:50.925089  5076 net.cpp:150] Setting up pool5
I0419 00:04:50.925089  5076 net.cpp:157] Top shape: 1 2048 71 71 (10323968)
I0419 00:04:50.926091  5076 net.cpp:165] Memory required for data: 27565285232
I0419 00:04:50.926091  5076 layer_factory.cpp:58] Creating layer fc50
I0419 00:04:50.926091  5076 net.cpp:100] Creating Layer fc50
I0419 00:04:50.927091  5076 net.cpp:434] fc50 <- pool5
I0419 00:04:50.927091  5076 net.cpp:408] fc50 -> fc50
I0419 00:04:54.901237  5076 net.cpp:150] Setting up fc50
I0419 00:04:54.901237  5076 net.cpp:157] Top shape: 1 50 (50)
I0419 00:04:54.902220  5076 net.cpp:165] Memory required for data: 27565285432
I0419 00:04:54.903234  5076 layer_factory.cpp:58] Creating layer probt
I0419 00:04:54.904247  5076 net.cpp:100] Creating Layer probt
I0419 00:04:54.905256  5076 net.cpp:434] probt <- fc50
I0419 00:04:54.906325  5076 net.cpp:408] probt -> probt
I0419 00:04:54.907341  5076 net.cpp:150] Setting up probt
I0419 00:04:54.907681  5076 net.cpp:157] Top shape: 1 50 (50)
I0419 00:04:54.907681  5076 net.cpp:165] Memory required for data: 27565285632
I0419 00:04:54.907681  5076 net.cpp:228] probt does not need backward computation.
I0419 00:04:54.908684  5076 net.cpp:228] fc50 does not need backward computation.
.
.
.

I0419 00:04:55.003751  5076 net.cpp:270] This network produces output label
I0419 00:04:55.004751  5076 net.cpp:270] This network produces output probt
I0419 00:04:55.004751  5076 net.cpp:283] Network initialization done.
I0419 00:04:55.005751  5076 solver.cpp:60] Solver scaffolding done.
I0419 00:04:55.017760  5076 caffe.cpp:252] Starting Optimization
I0419 00:04:55.017760  5076 solver.cpp:279] Solving Resnet-50
I0419 00:04:55.018774  5076 solver.cpp:280] Learning Rate Policy: step
F0419 00:04:55.045557  5076 syncedmem.cpp:56] Check failed: error == cudaSuccess (2 vs. 0)  out of memory
*** Check failure stack trace: ***
سوال شده توسط (150 امتیاز)
۱- لطفا مدل کارت گرافیک و مقدار رم آن را بفرمایید.
۲- در کل شبکه resnet شبکه بزرگی است و نیاز به حافظه رم زیاد دارد
۳- در مورد داده های خاکستری منظورتان عکس های سیاه سفید gray-scale هست؟ چون اساسا شبکه های نام برده برای عکس های rgb طراحی شده اند
4- سایز ورودی عکس های شبکه ها ثابت است:
resnet : 224 * 224
alexnet : 227*227
پس نیاز است سایز عکس ها تنظیم شود.
ممنون از پاسخ شما.
1- گرافیک انویدیا GeForce GT 750M  با دو گیگ حافظه
2- بله تصاویر گری اسکیل. یعنی نمیتونیم از شبکه هایی که برای عکس های رنگی ترین شدند برای تصاویر گری استفاده کنیم( البته با تنظیم پارامتر مربوطه). و حتما باید شبکه ای که مختص تصاویر خاکستری باشه استفاده کنیم؟ ایا شبکه ای با این مشخصات سراغ دارید که معرفی کنید؟
3- سایز ورودی را در فایل پرتوتکس مطابق تصاویر خودم تغییر دادم و نوشتم. یعنی نمیشه و باید حتما فیکس 224 باشن؟

2 پاسخ

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

سلام
توضیحاتی که دوستان دادن مثل جناب فروزنده نژاد خوب بود اما ذکر چند نکته ضروریه
زمانی که تصاویر شما خیلی بزرگ هست قائدتا اگه از معماری عمیقی استفاده میکنید باید دقیق بگید . صرف اینکه بگید من از resnet50 دارم استفاده میکنم درست نیست . چون یه معماری ممکنه 400 هزارپارامتر داشته باشه ممکنه 25 میلیون پارامتر داشته باشه هر دوتاش هم هست. پس ضروریه اگر از جایی چیزی میگیرید اگر میدونید تعداد پارامتر چقدره اونو قید کنید اگر نه یا معماری رو قرار بدید و اگر امکانش نیست لینک به معماری بدید .
وقتی تعداد پارامتر شما خیلی زیاد باشه قائدتا مصرف حافظه خیلی زیاد میشه خصوصا اگر تصاویر ورودی بزرگ باشن و در معماری هم سعی بر حفظ اندازه توده ورودی تا جای ممکن داشته باشه !

زمانی هم که تصاویر بزرگ دارید سعی نکنید خودتون خیلی سریع ریسایزش کنید به یک تصویر کوچکتر . سعی کنید حدالمقدور اندازه ورودی رو از طریق اندازه فیلتر و استرایدهای بزرگتر در لایه های اولیه کاهش بدید .
یعنی وظیفه کاهش ابعاد اولیه رو به اندازه کرنل و استراید در لایه های اول محول کنید . اینطور غنای تصاویر ورودی شما تا حدودی (بسته به انتخاب و محدودیت های شما ) حفظ میشه و طی 2 لایه میتونید اندازه ورودی رو بطور قابل توجهی کاهش بدید و درکنارش به اطلاعات مناسب هم دسترسی پیدا کنید . اگر همینطور برفرض مثال تصاویر 5000 در 5000 پیکسل خودتون رو بیایید 256 در 256 تبدیل کنید اطلاعات زیادی از دست میره (میتونید تست کنید هر دو حالت رو) .

دقت کنید که من نمیگم نیاز به ریسایز نیست . همه این موارد رو شرایط شما مشخص میکنه اما همیشه سعی کنید کاهش ابعاد رو در تصاویر ورودی رو در لایه های اول با استفاده از اندازه کرنل بزرگتر و استراید بیشتر داشته باشید .
اندازه کرنل 11 و 7 و یا اندازه استراید 4 و 3 میتونن به ترتیب انتخاب های خوبی برای کاهش ابعاد باشن . الزاما محدود به این ها نیستید میتونید مقادیر دیگه رو هم استفاده کنید اما این ها رو هم استفاده کنید کاهش ابعاد خوبی بدست میارید .

در مورد استفاده از اندازه کرنلهایی مثل 5 در 5 و 7 در 7 تنها در صورتی که در ابتدای شبکه هستید ایرادی نداره . در بقیه جاهای شبکه استفاده نکنید.

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

این موارد رو در نظر داشته باشید تا به نتیجه بهتری برسید.

پاسخ داده شده توسط (4.3k امتیاز)
انتخاب شده توسط
سلام- ممنونم از پاسخ شما
من از لینک زیر استفاده کردم:
https://github.com/beniz/deepdetect/tree/master/templates/caffe/resnet_50
اهان یعنی من چون تصاویرم رو ریسایز کردم بخشی خیلی زیادی از اطلاعات مفید تصاویرم رو از بین بردم و به همین خاطره که دقت دو دهم درصد میگیرم. درسته؟
بنابر راهنمایی شما تصاویر اصلی 2435 در 2435 را به کار بردم  ولی در عوض برای کم نیومدن حافظه کرنل و استراید رو در اولین لایه کانولوشن تغییر دادم تا تصاویرم زودتر کوچیک بشن در اجرا. به این صورت:
layer {
    bottom: "data"
    top: "conv1"
    name: "conv1"
    type: "Convolution"
    convolution_param {
        num_output: 64
        kernel_size: 11
        pad: 3
        stride: 4
        weight_filler {
                type: "xavier"
            }
            bias_filler {
                type: "constant"
                value: 0.2
               }
    }
}
یعنی از قبل کرنل 7 بود و استراید2. من به اعدادی که شما پیشنهاد کردید تغییرش دادم. ایا لازمه که پارامترهای دیگه هم تغییر کنن در همین لایه و یا لایه های بعدی؟ ببخشید که سوالم ابتدایی هست ولی دست بردن در لایه های وسطی شبکه و تنظیم این پارامتر ها یه کم برای افراد تازه کار سخته.
من همینطور اومدم لایه بچ نرمالیزشن رو به شکلی که در همین بخش سوالات آموزش داده بودید بین لایه های کانولوشن و relu قرار دادم و پارامترهاشونم ست کردم تا به دقت بهتری برسم. بچ سایز هم روی 1 تنظیم هستش.
ایا چیز دیگه ای نیاز نیست که تغییر بدم؟
سلام . تعداد پارامترهای شما بشدت زیاد هست. 97 میلیون پارامتر این معماری نیاز به داده زیادی داره . شما در درجه اول که باید یه فکری به حال دیتاتون بکنید . در کنار اون از این ها استفاده کنید که به مراتب تعداد پارامتر کمتری دارن چون برای سیفار10 طراحی شدن نه ایمیج نت . البته معماری های دیگه هم هست اما فعلا با این برید جلو اگر نهایتا نیاز شد من معماری های دیگه رو معرفی میکنم : https://github.com/yihui-he/resnet-cifar10-caffe  
این بحث اول . بحث دوم در مورد اینکه چرا دقت شما افزایش پیدا نمیکنه خیلی مسائل ممکنه وجود داشته باشه .یکی از محتمل ترین مسائل معمولا اندرفیت کردن شبکه بخاطر ریگیولاریزشن بالا هست . همیشه موقع ترینیگ لاگ ترینینگ و ولیدیشن رو با هم چک کنید چون براحتی میتونید این مساله رو تشخیص بدید .
شما معماری رزنت رو وقتی قراره استفاده کنید بهتر تغییرات جدی درش ندید مگر اینکه تجربه داشته باشید. طراحی معماری کار سختیه و تجربه زیادی میخواد برای رسیدن به یک معماری بهینه. بچ نرمالایز کردن لایه ها یک بدی ای که داره باعث افزایش سربار 30درصدی تو محاسبات میشه و این پروسه اموزش رو کند میکنه پس همینطوری استفاده نکنید خصوصا که در خود رزنت این لحاظ شده از قبل و استفاده دوباره از اون منطقی نیست.
پس بطور خلاصه استارت کار شما شد
1.استفاده از مدل خیلی سبک تر رزنت (میتونید به ترتیب همه معماری ها از 20 لایه تا 110 لایه رو تست کنید و هرکدوم نتیجه بهتری گرفت روی اون استارت کار رو بزنید )
2.حتما لاگ ترینینگ و ولیدیشن رو بگیرید و رسم کنید و در زمان اموزش تحت نظر داشته باشید تا در صورت بروز اورفیتینگ یا اندرفیتینگ براحتی مساله رو رفع کنید.
3.دیتای خودتونرو افزایش بدید . اگر امکان افزایش دیتا ندارید از فاین تونینگ استفاده کنید که صحبتش در سایت و همین پرسش و پاسخ زیاد شده قبلا.
+1 امتیاز

سایز تصاویر ورودی شما خیلی زیاد هست. حجم تنسور ها با این سایز تقریبا فاجعه وار می شود اگر به لاگ دقت کنید شبکه حتی جایی سعی کرده تا ۲۷ گیگ حافظه اشغال کند!! این سایز روی حتی Titan X با ۱۲ گیگابایت حافظه رم گرافیکی هم قابل اجرا نیست. اگر پس قبل از هرچیزی سایز تصاویرتون را کم کنید. سعی کنید سایزتون را از ۴۰۰*۴۰۰ کمتر کنید.

حافظه ی گرافیکی ۲ گیگابایت برای شبکه های یادگیری عمیق مدرن خیلی کم هست و خیلی برای توسعه کارتون محدودتون خواهد کرد توصیه می کنم حتما سعی کنید GPU با حافظه ی بالاتر تهیه کنید.

درصورتی که پس از کاهش سایز ورودی هم هنوز رم کافی نداشتید می توانید از نکات زیر برای کاهش حجم مدلتون استفاده کنید(البته به قیمت از دست دادن دقت شبکه تون) :
۱- کاهش تعداد فیلتر ها در لایه های کانولوشن
۲- کاهش سایز فیلتر ها (البته resnet از فیلتر های 3x3 استفاده می کند که از نظر بهتره که کمتر نشوند وگرنه receptive field
از بین خواهد رفت دارند و این مورد برای معماری های با فیلترهای 5x5 یا 7x7 بیشتر کاربردی هست)
۳- کاهش تعداد لایه ها: در resnet فاکتور مهمی هست که در کاهش حجم مدل بهتون کمک خواهد کرد
۴- کاهش سایز لایه ی تماما متصل:‌ ناحیه ادراک در fully connected ها تمامی نورون های لایه ی قبل هست بنابرین درصورتی که از این لایه در شبکه تون استفاده بکنید پارامتر های خیلی زیادی بوجود خواهند آمد که فضای زیادی نیاز دارند
۵- کاهش batch size

پی نوشت:
نکته ی دیگری هم که بهتر هست در نظر داشته باشید سایز دیتاست هست. تعداد ۵۰۰ نمونه برای تعلیم یک شبکه بدون transfer learning کافی نیست و شبکه شما به خوبی نمی تواند همگرا شود.

پاسخ داده شده توسط (397 امتیاز)
مچکرم از پاسخ خوب شما.
تصاویرم رو به سایز 227 در 227 ریسایز کردم.بچ سایز که از قبل هم روی 1 تنظیم بود. بدون ارور پیش رفت و به اتمام رسید. منتها دقت بسیار بسیار پایینی داره. چیزی حدود 0.02 هستش .

ممنون از کمک شما
...