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

با تشکر

دسته بندی ها

0 امتیاز

سلام...واقعا متشکرم از عزیزانی که اینجا زحمت میکشند...یه سوالی دارم...من بعضی سایتهارو مطالعه میکردم ....1-لاگ ترینینگ با لاگ تست فرقی میکنه؟
مثلا اگر بخوام مثل شکل زیر لاگ بگیرم ، به چه صورتی باید انجام بدهم؟
enter image description here
2-در مرحله ترین شبکه ، دقتی که اعلام میشه ، accuracy از روی دادهای ترین ما هست یا تست؟میشه فرایندشو یه مقدار توضیح بدید؟
یکی از بچه ها اینجا گفته بود که دقتی که در مرحله ترین اعلام میشه ، از روی خود دادهای ترین هست و وقتی که با سوییچ test شبکه رو تست میگیرم، حالا از دادهای تست برای اعلام accuracy استفاده میکنه...

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

1 پاسخ

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

سلام
شما میتونید هم اطلاعات training و هم test رو با هم یا بصورت جداگانه داشته باشید.
لایه های زیر رو در نظر بگیرید :

layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip1"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "accuracy_training"
  type: "Accuracy"
  bottom: "ip1"
  bottom: "label"
  top: "accuracy_training"
  include {
    phase: TRAIN
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip1"
  bottom: "label"
  top: "loss"
}

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

  include {
    phase: TEST
  }

به همین شکل برای آموزش اینکارو میشه کرد . همونطور که میبنید ما دوتا لایه برای محاسبه دقت داریم یکی برای زمان تست (ولیدیشن ) و یکی هم برای مرحله آموزش .
اگر فاز رو مشخص نکنید مثل اخرین لایه ، اون عمل برای تمامی مراحل (هم تست و هم آموزش) حساب میشه .

برای رسم نمودار افراد مختلف ممکنه کارهای مختلفی کنن . بعضی ها برای راحتی کار فازهای training و test رو جدا مینویسن . یعنی یک فایل برای train (مثلا بنام train.prototxt ) و یک فایل هم فقط برای test و در سالور بصورت زیر اونها رو مشخص میکنن :

train_net: "examples/cifar10/train_simpnet.prototxt"
test_net: "examples/cifar10/test_simpnet.prototxt"

بعد براحتی با یه اسکریپت هردو رو مثلا میان نمودارهاش رو رسم میکنن. (تو github من اسکریپت اولیه رو میشه مثلا برای این استفاده کرد)

یک کار دیگه که بیشتر عمومیت داره و مثلا خود من هم انجام میدم اینه که train و test هردو در یک فایل prototxt هستن. و بعد یه اسکریپت مینویسید و اطلاعات ترین و تست استخراج و بعد نمودار اونها باهم رسم میشه که اینطور دید بهتری میده .
نموداری هم که شما استفاده کردید در اصل برای رسم train/test من نوشتم برای همین هم هست که مال شما فقط یه نمودار داره .
مثلا اگر شما هر دو بخش رو تو لاگتون داشتید شکلهایی به این صورت بدست میاوریدید :
enter image description here
و اگه چندتا لاگ داشته باشید :
enter image description here

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

توسط (4.3k امتیاز)
انتخاب شده توسط
سلام...خیلی ممنونم بابت توضیحات کامل سید جان...طبق این جملتون"یک کار دیگه که بیشتر عمومیت داره و مثلا خود من هم انجام میدم اینه که train و test هردو در یک فایل prototxt هستن. و بعد یه اسکریپت مینویسید و اطلاعات ترین و تست استخراج و بعد نمودار اونها باهم رسم میشه که اینطور دید بهتری میده . "

پس در اون اسکریپتی که شما به من دادید ، نمودارهای ترین و تست  رو با هم یکی میکنه و رسم میکنه؟
اخه نمودارها از هم تفکیک باشند که بهتره!
سلام . نه با هم یکی نمیکنه. هردو رو تو یه نمودار مثل چیزی که اینجا میبینید نمایش میده . به نمودار خودتون هم نگاه کنید مشخصه . تست رو رسم کرده اما برای ترینینگ چون چیزی نبوده چیزی رسم نشده.
سلام...اها...درسته...خیلی ممنونم سید جان...واقعا لطف میکنی
شرمنده این سوالو میپرسم ، شاید خیلی ساده باشه ، اما ذهن منو مشغول کرده، یه مقدار بدفهم شدم...سوال دوممو میگم
در مرحله ترین شبکه ، دقتی که اعلام میشه ، accuracy از روی دادهای ترین ما هست یا تست؟ اگر دقتی که اعلام میشه دقت روی داده های تست ما  باشه ، پس دیگه نیازی به سوییچ تست و گرفتم accuracy  تست نیست دیگه ! میشه فرایندشو یه مقدار توضیح بدید؟
یکی از بچه های اینجا گفته بود که دقتی که در مرحله ترین اعلام میشه ، از روی خود دادهای ترین هست و وقتی که با سوییچ test شبکه رو تست میگیرم، حالا از دادهای تست برای اعلام accuracy استفاده میکنه...درسته؟
این لاگ من در حقیقت چی داره میگه؟ http://bayanbox.ir/view/7829061893281993270/model-1-train.log
Test net output یعنی دقت رو دادهای تست در شبکه ای که ترین شده بدست میاره؟
Train net output هم اصلا دقتی نداده و به صورت loss بیان شده!
سلام. اصلا مشکلی نیست . شما هر سوالی داری و هرجا رو متوجه نشدی بفرما. هرچند بار هم بپرسی ایراد نداره. شما سوالتو راحت بپرس مطمئن باش این سوال خیلی هاس.
 اون دقت بر میگرده به اینکه اون لایه accuray که دقت رو در حین اموزش نمایش میده  در فاز آموزش فعال هست یا تست یا هردو. مثلا در شبکه ای که شما لاگش رو فرستادی اگه نگاه کنی میبینی لایه accuracy برای فاز تست مشخص شده :
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "fc8"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
یعنی وقتی شما آموزش میدی هر زمان نوبت به تست کردن رسید(باتوجه به تنظیمات تو سالور) شبکه میاد تست میکنه و اون accuracy رو نمایش میده .
این یک شیوه بدست اوردن دقت در زمان تست هست که خیلی کاربردیه و بصورت بلادرنگ میتونه بما نشون بده شبکه چطور داره عمل میکنه . یک موقع دیگه هست که ممکنه دو حالت رخ بده :
1.یا من کلا تا الان روی فاز اموزش داشتم کار میکردم و دقت هم دقت اموزش بود (مثلا دوتا فاز رو توی دوتا فایل پیاده کردم و accuracy هم که قرار دادم براش فازی رو انتخاب نکردم (یا اصلا اشتباهی بجای اینکه برای لایه Accuracy تست رو مشخص کنم ترین رو مشخص کردم . یا اصلا از قصد خواستم دقت ترین رو داشته باشم و بعد با تست قیاسش بکنم مثلا) پس هر دقتی میده دقت مربوط به training هست. حالا من میخوام ببینم دقت تو تست چطوریه . اینجا میتونم بیام از اون سویچ تست استفاده کنم و فایل مربوط به تست رو بدم و دقت رو ببینم .
2.یکی یه فایل از پیش اموزش داده شده ای رو بمن داده ادعا کرده که آقا این دقتش مثلا فلانقدره! من برای اینکه مطمئن بشم میتونم با سویچ تست اون فایل رو با معماری تست چک کنم ببینم آیا دقتی که بدست میاد با اون چیزی که اون گفته یکیه یا نه .
اها...خیلی ممنونم سید جان...شما بزرگواری، انشاله سلامت و زنده باشی....ممنون که انقدر با حوصله جواب میدی
کاملا متوجه شدم...خدا خیرت بده...
پس حالا یه چیزی نتیجه گرفتم...نمیدونم درسته یا نه...برا اینکه بخوام دقت تست و دقت ترن رو تو یک نمودار بررسی کنم ، میام و اون لایه accurary رو روی فاز ترین ست میکنم و لاگشو بدست میارم ، و اون یکی لاگی هم که در بالا لینکشو گزاشته بودم ، به اسکریپت شما میدم و مقایسه تست و ترین  رو انجام میدم...اینجوری هم میشه؟
نه کافیه فقط اینو به معماریت اضافه کنی (زیر لایه accuracy که الان داری اینو اضافه کن)
layer {
  name: "accuracy_training"
  type: "Accuracy"
  bottom: "fc8"
  bottom: "label"
  top: "accuracy_training"
  include {
    phase: TRAIN
  }
}
بعد شروع کن به اموزش دادن . لاگت که بدست اومد میتونی از همون اسکریپت استفاده کنی برای دیدن نمودار train/val یا همون train/test
سلام...سید جان این کاری که فرمودیو انجام دادم اما باز هم داده ترینینگ رو پلات نکرد
این هم لاگم...اون رگ اکس ها رو هم حذف کردم...ممنونم
http://bayanbox.ir/view/2591478935319775335/model-1-train.log
سلام . دلیلش بخاطر اینه که تو لاگت بخش مربوط به توضیحات iteration یه تفاوت کوچیک با چیزی من تو لاگهام دارم داشت . به هر حال این regex مخصوص لاگ شماس که باید تو تابع pars_log2 بجای regex فعلی قرارش بدی . https://regex101.com/r/ZRvJBT/1 خودت قیاس بکنی متوجه میشی کجای رگ اکس رو من تغییر دادم .
بعد از اون هم این کد رو بجای کد قبلی استفاده کن : یعنی خطهای 82 تا 86 :
            iteration = int(r[0])
            loss_iterations.append(iteration)
            losses.append(float(r[3]))
           
            accuracy = float(r[6]) * 100
کار خاصی اینجا نشده . چون regex یه بخش جدید بهش اضافه شده اندیس های مربوط به iteration و  Loss و accuracy عوض شده . قبلا بود 0 و 1 و 4 . الان باید بکنی 0 و 3 و 6 سیو کن بعد همه چیز اکی میشه برات.
سلام...ممنونم...سید جان من قسمت دوم فرمایشتو  انجام دادم (تغییر کد) ، اما اون قسمت اول رو اصلا متوجه نشدم  چی کار باید بکنم...تابع pars_log2 چی هست و کجا قرار داره؟ و اون سایت رگ اکس واسه چیه؟رگ اکس در لاگ استفاده میشه ؟   .... دستت درد نکنه...
سلام
اون سایت بخش بالایی رو ببینی regexیی که باید استفاده کنی رو نوشتم زیرش هم بخشی از لاگ خودت رو گذاشتم تا ببینی داره کار میکنه.
متن تغییرات رو دادم از اینجا فایل جدید مخصوص خودت رو بگیر دانلود و ببین . بهتر متوجه منظور من میشی: http://pastebin.com/J1f4Vunh
سلام سید جان...اها...الان یه ذره گرفتم چی شد ، دستت درد نکنه که بخاطر من دوباره کد زدی...خیلی لطف کردی
این شد عکسش...درسته؟
http://bayanbox.ir/view/5530057907527035628/figure-11.png
بعدش یه سوالی هم دارم...1-این نمودار من خیلی دندونه دندونه هست...راهی هست که مثلا چند بار اجرا بگیرم و لاگشونو save  کنم و بعدا ازشون میانگین بگیرم و یه نمودار به اصطلاح smooth تری داشته باشم؟
2-از رو این نمودار میشه فهمید overfit رخ داده یا نه؟
سلام . دلیل بقول شما دندونه دندونه دار بودن لاگ شما در درجه اول بخاطر اندازه نرخ یادگیری و اندازه بچ شماس. برای اینکه نمودار smooth تری داشته باشی باید نرخ یادگیری کوچیکتری داشته باشی و همینطور اندازه بچ بزرگتری داشته باشی تا گرادیان پایدار تری بدست بیاد.
اگه اندازه نرخ یادگیری زیاد باشه بالا و پایین پریدنا بیشتر میشه . اگه اندازه بچ کم باشه گرادیان ناپایدار تر میشه یعنی مثلا یه بچ میگه در جهت ایکس حرکت کن دفعه بعد بچ دوم رو که میخونی اونا مثلا خلاف جهت قبلی میگن برو بعد این رفته رفته باعث همین  خط خطی شدنا که میبنی میشه.
البته حتی اگه اندازه بچت رو هم زیاد کنی باز هم این بالا و پایین بودنا بوجود میاد (هرچند خیلی کمتر میشه نسبت به وقتی که بچت کوچیکه) مگه اینکه کل دیتاستت با هم هربار خونده بشه (شیوه بچ ) که عملی نیست .
همه نمودارها توسط همه شبکه ها همینطور دندونه دندونه دار هستن.(مثالهایی که بالا زدمو ببین) دلیل اینکه برای شما انقدر تو چشم میاد بخاطر اینه که تعداد تکرارت کمه و پلات اینو قشنگ نشون میده .
اگه میخوای نمودارت smooth تر بنظر بیاد یا برای تعداد بیشتری آموزش بده و نرخ یادگیری رو کمتر کن یا از بچ بزرگتر استفاده کن. یا اینکه وقتی کد رو اجرا کردی پنجره که باز شد روی علامت تیک سبز رنگ کلیک کن از منویی که باز میشه گزینه دوم (مربوط به دقت) رو انتخاب کن بعد تو فیلد max مثلا یه عدد بزار 25000 خودت تغییرات رو میبینی و متوجه میشی داستان چیه.
انشاله این کار رو انجام میدم....خیلی ممنونم سید جان...واقعا ممنونم ازت...خدا خیرت بده...
خواهش میکنم . البته یه کار دیگه هم میتونی بکنی. که مربوط به اموزش و اینا نیست. مربوط به رسم خود نموداره.برای اینکار هم display رو در سالور عددبزرگتری بزار تا اینطور اطلاعات کمتری ثبت بشه و در نتیجه موقع رسم نمودار نقاط کمتری وجود خواهد داشت و اینطوری نمودار smooth تری بدست میاری. میتونی تست کنی اینو و نتیجه رو ببینی مثلا الان مقدار display شما 20 هست  یکبار display رو مساوی100 بزار یکبار هم مساوی 500 یکبار هم مساوی 1 . بعد بشین نتایجش رو تو نمودار ببین خودت متوجه میشی.
اها...ممنونم...خیلی لطف کردی...
با اجازه آقا سید حسین عزیز ، لینک  آموزش رایگان regex به زبان فارسی برای کسانی که مثل من باهاش اصلا آشنایی ندارن...
https://learnfiles.com/downloads/%D9%81%DB%8C%D9%84%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-regular-expressions-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C/
رسم نمودار loss و accuracy از روی فایل log
...