سلام
اون چیزی که من گفتم داستانش با چیزی که شما اشاره بهش کردید فرق داره . تعداد لایه های کانولوشن اندازه فیلترها و همینطور تعداد فیلترها (در اصل نورونها) همه فراپارامتر هستن که از یک task به task دیگه متفاوت میتونن باشن .
چیزی که باعث شده بود شما نتونید آموزش بدید شبکه رو خیلی ساده اس. تو آموزش شبکه های کانولوشن که در سایت توضیح دادم ، توضیح داده شده که وقتی شما عملیات کانولوشن رو روی تصاویر و توده های ورودی اعمال میکنید چه اتفاقی می افته. (کاهش ابعاد صورت میگیره مگر اینکه با padding و اندازه کرنل مناسب سایز توده ورودی (تصویر و...) حفظ بشه)
اصلی که وجود داره در طراحی معماری اینه سعی کنید همیشه از تصاویر نسبتا بزرگتر برای شبکه استفاده کنید و بعد با اندازه کرنل بزرگتر و استراید بیشتر کاهش ابعاد داشته باشید. اینطور هم اطلاعات بیشتری از ورودی بدست میاد و هم بخاطر کاهش ابعاد در ادامه شبکه بار محاسباتی کاهش پیدا میکنه .
بعنوان مثال شما تصویر ورودویتون 224 در 224 هست که بعد از لایه اول کانولوشن تبدیل میشه به یه توده 55 در 55 پیکسلی. و این توده باز رفته رفته کاهش پیدا میکنه تا به انتهای شبکه برسه .
در حالت شما اندازه تصویر شما 28 در 28 بود که با اون اندازه کرنل و استراید تبدیل به یه توده 5 در 5 میشد(و حجم خیلی زیادی از اطلاعات از بین رفته تا اینجا). و باز این توده در ادامه کاهش پیدا میکرد تا جایی که دیگه داده ای نبود و اون خطای زیر رو بشما میداد :
I1227 01:35:41.886754 3821 net.cpp:150] Setting up pool5
I1227 01:35:41.886759 3821 net.cpp:157] Top shape: 64 256 0 0 (0)
I1227 01:35:41.886761 3821 net.cpp:165] Memory required for data: 3518720
I1227 01:35:41.886765 3821 layer_factory.hpp:77] Creating layer fc6
I1227 01:35:41.886772 3821 net.cpp:100] Creating Layer fc6
I1227 01:35:41.886775 3821 net.cpp:434] fc6 <- pool5
I1227 01:35:41.886780 3821 net.cpp:408] fc6 -> fc6
F1227 01:35:41.886826 3821 blob.cpp:115] Check failed: data_
*** Check failure stack trace: ***
@ 0x7f366ba695cd google::LogMessage::Fail()
@ 0x7f366ba6b433 google::LogMessage::SendToLog()
@ 0x7f366ba6915b google::LogMessage::Flush()
@ 0x7f366ba6be1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f366c217d3b caffe::Blob<>::mutable_cpu_data()
@ 0x7f366c0f633a caffe::GaussianFiller<>::Fill()
@ 0x7f366c0f6e27 caffe::InnerProductLayer<>::LayerSetUp()
@ 0x7f366c0c17e2 caffe::Net<>::Init()
@ 0x7f366c0c3071 caffe::Net<>::Net()
@ 0x7f366c0d44aa caffe::Solver<>::InitTrainNet()
@ 0x7f366c0d5817 caffe::Solver<>::Init()
@ 0x7f366c0d5bba caffe::Solver<>::Solver()
@ 0x7f366c20bc83 caffe::Creator_SGDSolver<>()
@ 0x40afb9 train()
@ 0x4077c8 main
@ 0x7f366a200830 __libc_start_main
@ 0x408099 _start
@ (nil) (unknown)
Aborted (core dumped)
اگه نگاه کنید میبیند بعد از pool5 ، داده خروجی (Top shape ) هیچی نداره دیگه! Top shape: 64 256 0 0 (0)
و بعد از اون هم شما با خطای Check failed: data_
مواجه شدید
پس برای اینکه به مشکل نخورید باید اون اندازه رو متناسب با اندازه تصاویر خودتون تغییر بدید یا اینکه تصاویر خودتون رو به اندازه تصاویر معماری الکس نت ریسایز کنید.
برای سوال دومتون پیشنهاد میکنم از نمونه مثالهایی که به پایتون و همینطور سی++ هست استفاده کنید. مثال Lenet و یا همینطور مثال classification در پوشه examples که به پایتون هست میتونه خیلی راحت چیزی که نیاز دارید رو برای شما فراهم کنه.
(برای اخرین سوالتون هم (در مورد caffemodel و solverstate فکر میکنم یه سوال جدید بزنید خیلی بهتره تا اینطور انسجام مطالب بیشتر حفظ میشه و در جستجوها بدرد افراد بیشتری میخوره)