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

با تشکر

دسته بندی ها

0 امتیاز

با سلام..
من با استفاده از دیتابیس mnist معماری الکس نت رو اجرا کردم ولی به دقت پایین ۰.۱۱۳۵ رسیدم.. من ابعاد فیلتر و نرخ یادگیری رو کاهش دادم ولی تغییر چندانی نمیکنه..
میشه در مورد این لایه من رو راهنمایی کنید که تعداد خروجی رو چند بگیرم؟

inner_product_param {
    num_output: 4096
    weight_filler {
      type: "gaussian"
      std: 0.005
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }

}چون به تبع دیگه نباید ۴۰۹۶ باشه. درسته؟ مقدار loss هم حدود ۲.۵ تا ۲.۲ تغییر داره.. در مورد لایه loss هم توضیح میدید البته من مطالعه کردم ولی واضح درکش نکردم..
چگونه می توان ابعاد ورودی را بعد از هرلایه کانولوشن دید؟ چون حاصل ضرب ابعاد در لایه آخر همین عدد میشه..
لایه dropout هم در این معماری هست..آیا برای finetune تنها تغییر نرخ یادگیری و ضریب تنزل وزن برای لایه های کانولوشن و یا تغییر نرخ یادگیری در سالور مهم هستند یا حذف یا اضافه کردن لایه ای هم در این معماری مجاز است؟
با تشکر

من فکر میکنم دیگه به لایه pooling نیازی نیست همون لایه کانولوشن کاهش ابعاد رو انجام میده چون هم ابعاد ورودی mnist کم هست و هم اینکه معماری الکس نت خودش ۵ لایه کانولوشن داره دیگه!!!!!! درسته؟

توسط (155 امتیاز)
ویرایش شده توسط
training log خودتون رو کامل به سوال اضافه کنید. بعد اطلاع بدید.
سلام چیزی که شما وارد کردید معماری هست. من از تون Log آموزش رو خواستم همون پیامهایی که موقع اجرای آموزش بشما نمایش داده میشه. من میخوام از روی همون بهتون نشون بدم خیلی سریع چطور اندازه توده ها رو مشخص کنید. ببینید راحت ترید . از طرفی شما میتونید از طریق فرمولهایی که در آموزش شبکه کانولوشن هست براحتی اندازه توده ها رو بدست بیارید. ولی خب از طریق لاگ خیلی راحت تر و سریعتر میشه فهمید. از طرفی مشاهده نرخ کاهش خطای شما هم خیلی راحت تر میشه.
وقتی لاگ رو قرار دادید (در pastebin.com آپلود کنید چون حجمش زیاده ) . کامنت بزارید تا من متوجه بشم.
با سلام و تشکر از وقتی که برای پاسخ دادن به سوالات میذارید.
من training log رو گذاشتم اینجا:
  http://pastebin.com/eNEdBD9T

1 پاسخ

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

سلام
نکته اول اینکه کار شما اموزش هست. به این عمل شما (استفاده از یک معماری خاص روی یک دیتاست خاص ) فاین تونینگ گفته نمیشه) .زمانی ما لفظ فاین تونینگ رو بکار میبریم که یک مدل از پیش آموزش داده شده با معماری اون وجود داشته باشه و بعد بخوایید شبکه ما با وزنها و پارامترهای اون مدل از پیش اموزش داده شده مقدار دهی اولیه بشه و بعد بر روی دیتاست جدیدی دوباره تنظیم بیشتر بشه .
در اینجا هیچ خبری از مدل از پیش اموزش داده شده با معماری الکس نت نیست. فقط شما اومدید از معماری الکسنت روی دیتاست ام نیست استفاده کردید.
نکته اولی که من دقت کردم در لاس شما اینه که شما تعداد دسته ها رو بجای اینکه 10 در نظر بگیرید 1000 انتخاب کردید . اخرین لایه تماما متصل در شبکه کانولوشن همون دسته بند یا کلسیفایر شماس و تعداد نورون هاش باید برابر با تعداد دسته های شما باشه .
نکته دومی که در کار شما هست عدم استفاده از الگوریتم مقداردهی اولیه xavier یا msra هست. به همین خاطر هم شما با اون مشکل مشهور vanishing gradient در شبکه های عمیق مواجه شدید. شما میتونید با فعال کردن debug_info در فایل سالور که با دستور debug_info: true انجام میشه مقادیر گرادیان ها رو در دو حالت چک کنید .
اگر شبکه شما عمق کمتری داشت مثلا به اندازه 4 لایه بود یا کمتر اون وقت استفاده از مقداردهی اولیه gaussian معمولا نتیجه بهتری رو ارائه میکرد. اما برای شبکه های ععمیق بهترین گزینه xavier و یا Msra و یا LSUV هست که البته گزینه اول ترجیح داده میشه .
زمانی هم که دارید با مدلهای قدیمی کار میکنید مثل الکس نت و قصد استفاده از xavier و یا امثالهم هم ندارید کار شما خیلی سخت تر میشه اونوقت برای یک دیتاست خاص و یا تغییراتی که لحاظ میکنید باید std اون رو هم متناسب انتخخاب کنید.
و نکته دیگه اینکه test iter شما باید حاصل ضربش در اندازه بچ مساوی تعداد تست ست شما باشه. پس وقتی اندازه بچ شما 100 هست تست ایتر شما هم 100 باید باشه نه بیشتر نه کمتر.

یه نکته ای که داشت یادم میرفت این هست که برای فهمیدن ابعاد توده ها در کفی علاوه بر فرول و محاسبه ای که در آموزش ها اومده راه خیلی ساده تری هم هست و اون هم توجه به لاگ تولید شده در کفی هست .

I1231 09:58:24.958807  3750 layer_factory.hpp:77] Creating layer data
I1231 09:58:24.960191  3750 net.cpp:100] Creating Layer data
I1231 09:58:24.960222  3750 net.cpp:408] data -> data
I1231 09:58:24.960258  3750 net.cpp:408] data -> label
I1231 09:58:24.962350  3759 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
I1231 09:58:25.051169  3750 data_layer.cpp:41] output data size: 64,1,28,28
I1231 09:58:25.053405  3750 net.cpp:150] Setting up data
I1231 09:58:25.053428  3750 net.cpp:157] Top shape: 64 1 28 28 (50176)
I1231 09:58:25.053438  3750 net.cpp:157] Top shape: 64 (64)
I1231 09:58:25.053444  3750 net.cpp:165] Memory required for data: 200960
I1231 09:58:25.053458  3750 layer_factory.hpp:77] Creating layer conv1
I1231 09:58:25.053489  3750 net.cpp:100] Creating Layer conv1
I1231 09:58:25.053498  3750 net.cpp:434] conv1 <- data
I1231 09:58:25.053514  3750 net.cpp:408] conv1 -> conv1
I1231 09:58:25.055207  3750 net.cpp:150] Setting up conv1
I1231 09:58:25.055236  3750 net.cpp:157] Top shape: 64 96 26 26 (4153344)
I1231 09:58:25.055241  3750 net.cpp:165] Memory required for data: 16814336
I1231 09:58:25.055268  3750 layer_factory.hpp:77] Creating layer relu1
I1231 09:58:25.055281  3750 net.cpp:100] Creating Layer relu1
I1231 09:58:25.055289  3750 net.cpp:434] relu1 <- conv1
I1231 09:58:25.055299  3750 net.cpp:395] relu1 -> conv1 (in-place)
I1231 09:58:25.055310  3750 net.cpp:150] Setting up relu1
I1231 09:58:25.055318  3750 net.cpp:157] Top shape: 64 96 26 26 (4153344)
I1231 09:58:25.055326  3750 net.cpp:165] Memory required for data: 33427712
I1231 09:58:25.055335  3750 layer_factory.hpp:77] Creating layer norm1
I1231 09:58:25.055346  3750 net.cpp:100] Creating Layer norm1
I1231 09:58:25.055352  3750 net.cpp:434] norm1 <- conv1
I1231 09:58:25.055362  3750 net.cpp:408] norm1 -> norm1
I1231 09:58:25.055415  3750 net.cpp:150] Setting up norm1
I1231 09:58:25.055424  3750 net.cpp:157] Top shape: 64 96 26 26 (4153344)
I1231 09:58:25.055430  3750 net.cpp:165] Memory required for data: 50041088
I1231 09:58:25.055438  3750 layer_factory.hpp:77] Creating layer pool1
I1231 09:58:25.055449  3750 net.cpp:100] Creating Layer pool1
I1231 09:58:25.055454  3750 net.cpp:434] pool1 <- norm1
I1231 09:58:25.055462  3750 net.cpp:408] pool1 -> pool1
I1231 09:58:25.055522  3750 net.cpp:150] Setting up pool1
I1231 09:58:25.055533  3750 net.cpp:157] Top shape: 64 96 24 24 (3538944)
I1231 09:58:25.055563  3750 net.cpp:165] Memory required for data: 64196864
I1231 09:58:25.055572  3750 layer_factory.hpp:77] Creating layer conv2
I1231 09:58:25.055588  3750 net.cpp:100] Creating Layer conv2
I1231 09:58:25.055593  3750 net.cpp:434] conv2 <- pool1
I1231 09:58:25.055603  3750 net.cpp:408] conv2 -> conv2
I1231 09:58:25.059763  3750 net.cpp:150] Setting up conv2
I1231 09:58:25.059779  3750 net.cpp:157] Top shape: 64 256 26 26 (11075584)
I1231 09:58:25.059784  3750 net.cpp:165] Memory required for data: 108499200
I1231 09:58:25.059795  3750 layer_factory.hpp:77] Creating layer relu2
I1231 09:58:25.059803  3750 net.cpp:100] Creating Layer relu2
I1231 09:58:25.059809  3750 net.cpp:434] relu2 <- conv2
I1231 09:58:25.059816  3750 net.cpp:395] relu2 -> conv2 (in-place)
I1231 09:58:25.059824  3750 net.cpp:150] Setting up relu2
I1231 09:58:25.059830  3750 net.cpp:157] Top shape: 64 256 26 26 (11075584)
I1231 09:58:25.059835  3750 net.cpp:165] Memory required for data: 152801536
I1231 09:58:25.059840  3750 layer_factory.hpp:77] Creating layer norm2
I1231 09:58:25.059847  3750 net.cpp:100] Creating Layer norm2
I1231 09:58:25.059851  3750 net.cpp:434] norm2 <- conv2
I1231 09:58:25.059859  3750 net.cpp:408] norm2 -> norm2
I1231 09:58:25.059898  3750 net.cpp:150] Setting up norm2
I1231 09:58:25.059906  3750 net.cpp:157] Top shape: 64 256 26 26 (11075584)
I1231 09:58:25.059908  3750 net.cpp:165] Memory required for data: 197103872
I1231 09:58:25.059913  3750 layer_factory.hpp:77] Creating layer pool2
I1231 09:58:25.059919  3750 net.cpp:100] Creating Layer pool2
I1231 09:58:25.059923  3750 net.cpp:434] pool2 <- norm2
I1231 09:58:25.059928  3750 net.cpp:408] pool2 -> pool2
I1231 09:58:25.059962  3750 net.cpp:150] Setting up pool2
I1231 09:58:25.059968  3750 net.cpp:157] Top shape: 64 256 13 13 (2768896)
I1231 09:58:25.059972  3750 net.cpp:165] Memory required for data: 208179456
I1231 09:58:25.059975  3750 layer_factory.hpp:77] Creating layer conv3
I1231 09:58:25.059984  3750 net.cpp:100] Creating Layer conv3
I1231 09:58:25.059988  3750 net.cpp:434] conv3 <- pool2
I1231 09:58:25.059993  3750 net.cpp:408] conv3 -> conv3
I1231 09:58:25.070734  3750 net.cpp:150] Setting up conv3
I1231 09:58:25.070754  3750 net.cpp:157] Top shape: 64 384 13 13 (4153344)
I1231 09:58:25.070755  3750 net.cpp:165] Memory required for data: 224792832
I1231 09:58:25.070765  3750 layer_factory.hpp:77] Creating layer relu3
I1231 09:58:25.070771  3750 net.cpp:100] Creating Layer relu3
I1231 09:58:25.070775  3750 net.cpp:434] relu3 <- conv3
I1231 09:58:25.070780  3750 net.cpp:395] relu3 -> conv3 (in-place)

لاگ بالا بخشی از لاگی هست که ارسال کردید . و اندازه توده ها براحتی مشخص هست . مثل این نمونه ها :
لایه دیتا با اندازه 28 در 28 :

 I1231 09:58:25.051169  3750 data_layer.cpp:41] output data size: 64,1,28,28

خروجی لایه کانولوشن اول :

I1231 09:58:25.055236  3750 net.cpp:157] Top shape: 64 96 26 26 (4153344)

و یا خروجی لایه pool2:

I1231 09:58:25.059968  3750 net.cpp:157] Top shape: 64 256 13 13 (2768896)

حالا اگر موارد بالا رو لحاظ کنید باید بتونید براحتی انواع مختلف پارامترها و نرخ های یادگیری و.. رو استفاده کنید و تاثیراتشون رو مشاهده کنید.

توسط (4.3k امتیاز)
انتخاب شده توسط
سلام . بخاطر regex هست . تو لاگ شما یکسری اطلاعات اضافی هست که regexیی که من نوشتم باهاش همخونی نداره . از این استفاده کن احتمالا مشکلت برطرف بشه :
https://gist.github.com/Coderx7/c7af68da83bec5fb45533ef1c2b147d4
من تست کردم اکی بود (البته قبلش با این regex (میتونی تو notepad++ بزنی تو بخش replace ) :
https://regex101.com/r/YUux8r/2 من اون خطهای آبی رو که میبینی حذف کردم . تو نوت پد++ میتونی تو بخش find اون رگ اکس رو بنویسی و بعد از پایین regexexpressionرو انتخاب کنی تو بخش replace هم هیچی ننویسی که اون خطها حذف بشن . بعدش هم اون خط خالی ها رو حذف کن.
باید بتونی اجرا بگیری
در مورد train و test هم این سوال رو جداگانه بپرس تا جواب بدم بنظرم بدرد بقیه هم میخوره
ممنون سید جان...درست شد...ممنونم...خیلی لطف کردی...
این شد شکلش
http://bayanbox.ir/view/3181546559860154524/figure-1.png
...