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

با تشکر

دسته بندی ها

0 امتیاز

سلام.. درپست قبل گفتید که چون تصاویر در الکس نت 224 در 224 بودن با اون اندازه کرنل و استراید ها ست اما تصاویر شما در دیتاست ام نیست 28 در 28 پیکسله برای همین به این مشکل خوردید. لایه اول کانولوشن رو تغییر بدید به احتمال زیاد مشکلتون برطرف میشه..
یعنی ابعاد کرنل اول که ۱۱ در ۱۱ هست رو کم کنم؟ مثلا بذارم ۵ در ۵ ؟ آیا قاعده خاصی وجود داره؟البته میدونم که یکی از چالشهای کانولوشن اینه که هیچ درک شهودی نسبت به اون وجود نداره!یعنی اینکه چند تا لایه یا چند تا فیلتر بگیریم یه جورایی سعی و خطاست..همین الکس نت هوز معلوم نیست چرا اینقدر خوب کار میکنه...درسته؟
من لایه اول رو از گام ۴ به گام ۱ تغییر دادم و اجرا شروع شده و همچنان داره اجرا میکنه..
و سوال دیگه اینکه چگونه میتونم به یک شبکه آموزش دیده مثل همین الکس نت با mnist مثلا یک تصویر رقم دستنویس بدم و خروجی بگه چنده؟ برای اینکار باید چه کار کرد؟ آیا همین accuracy که در نهایت میده برای صحت شبکه کافیه؟
مثلا من که همون mnist رو اجرا کردم دو تا فایل با پسوند caffemodel و solverstate داده حالا از اینها در کجا میشه استفاده کرد و یا اینکه چگونه بخونیمش؟
با تشکر فراوان..

توسط (155 امتیاز)
ویرایش شده توسط

1 پاسخ

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

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

توسط (4.3k امتیاز)
انتخاب شده توسط
سلام..
ببخشید من  الکس نت با دیتابیس mnist رو اجرا کردم و بعد از ۲۶ ساعت اجرا شد.. چون تعداد تکرارها ۴۵۰۰۰۰ بود!! ومن تغییر ندادم.. همانطور که گفتم من فقط گام لایه اول رو از ۴ به ۱ تغییر دادم ولی accurscy شده ۰.۱۱۳۵ ... آیا به این دلیله که دیتابیس mnist برای معماری الکس نت مناسب نیست یا نیاز به فاین تیون داره؟ پس در واقع هر معماری مختص دیتابیس خودشه؟ اینکه ما چندتالایه کم یا زیاد کنیم رو از کجا بفهمیم؟
با تشکر..
سلام . شما با دیتاست ام نیست باید تو همون چند گام اول به دقت بالای 98 درصد برسید. اینکه چرا انقدر بد شده خیلی دلایل میتونه داشته باشه  مثل نرخ یادگیری بالا یا حتی کاهش اندازه زیادی و از دست رفتن اطلاعات خیلی زیاد و یا اورفیتینگ و....
شما با الکس نت باید بتونید دقت بالای 98 99 درصد بدست بیارید. پس بعنوان تمرین سعی کنید اول از همه چک کنید اندازه توده های شما چقدر هست و ببینید آیا اطلاعات خیلی زیادی همون اول از دست میره یا نه اگر آره سعی کنید کاهش ابعاد اولیه ای که صورت میگیره خیلی کمتر بشه (بالا توضیح دادم مثلا وقتی همون فیلتر پیشفرض الکس نت اعمال بشه روی تصاویر 224 در 224 خروجی میشه 55 در 55 اما همون فیلتر سایز روی تصاویر 28 در 28 با اون پدینگ و استراید باعث یه توده 5 در 5 میشه و اطلاعا ت خیلی زیادی از بین میره. )  بعدش نرخ یادگیری رو چک کنید و سعی کنید جلوی اورفیتینگ رو هم بگیرید . میتونید از dropout h استفاده کنید و یا حتی بهتر سعی کنید تعداد پارامترها رو کم کنید (از لایه های اخر خصوصا)  و نتایج رو مقایسه کنید. این نکات میتونه خیلی چیزها رو براتون روشن کنه.
بسیار بسیار ممنون.. حتما این نکات رو بررسی می کنم.. فقط به نظرتون اگر تعداد تکرارها رو به ۱۰۰۰۰ کاهش بدم برای اینکه نتایج کارو سریعتر ببینم مشکلی داره؟
نه اصلا مشکلی نیست.اون تعدادد تکرار برای دیتاست 1 و نیم میلیونی ایمیج نت بوده! شما کلا 60 هزارتا تصویر بیشتر برای اموزش و 10 هزارتا برای تست بیشتر ندارید. بر اساس بچ سایزی که مشخص کردید میتونید ببینید هر تکرار چند ایپاک میشه و بر همون اساس برید جلو .
میتونید بجای 100 هزار خیلی کمتر هم ست کنید و تست کنید. مثلا 5 هزار یا 10 هزار یا 20 هزار. با کم استارت بزنید تغییرات رو اعمال کنید نتایج رو ببینید بعد همونو میتونید گسترش بدید و تو تعداد بالاتر هم تست کنید.
من ابعاد فیلتر و نرخ یادگیری رو کاهش دادم ولی تغییر چندانی نمیکنه..
میشه در مورد این لایه من رو راهنمایی کنید  که تعداد خروجی رو چند بگیرم؟
inner_product_param {
    num_output: 4096
    weight_filler {
      type: "gaussian"
      std: 0.005
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }
}چون به تبع دیگه نباید ۴۰۹۶ باشه. درسته؟
چگونه می توان ابعاد ورودی را بعد از هرلایه کانولوشن دید؟ چون حاصل ضرب ابعاد در لایه آخر همین عدد میشه..
سلام برای این یه سوال جدید ایجاد کنید و اینو اونجا مطرح کنید.
...