سلام
نکته اول اینکه کار شما اموزش هست. به این عمل شما (استفاده از یک معماری خاص روی یک دیتاست خاص ) فاین تونینگ گفته نمیشه) .زمانی ما لفظ فاین تونینگ رو بکار میبریم که یک مدل از پیش آموزش داده شده با معماری اون وجود داشته باشه و بعد بخوایید شبکه ما با وزنها و پارامترهای اون مدل از پیش اموزش داده شده مقدار دهی اولیه بشه و بعد بر روی دیتاست جدیدی دوباره تنظیم بیشتر بشه .
در اینجا هیچ خبری از مدل از پیش اموزش داده شده با معماری الکس نت نیست. فقط شما اومدید از معماری الکسنت روی دیتاست ام نیست استفاده کردید.
نکته اولی که من دقت کردم در لاس شما اینه که شما تعداد دسته ها رو بجای اینکه 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)
حالا اگر موارد بالا رو لحاظ کنید باید بتونید براحتی انواع مختلف پارامترها و نرخ های یادگیری و.. رو استفاده کنید و تاثیراتشون رو مشاهده کنید.