Deprecated: Function get_magic_quotes_gpc() is deprecated in /home/ustmbir/domains/deeplearning.ir/public_html/qa/qa-include/qa-base.php on line 1177
loss زیاد و افزایش نیافتن دقت - پرسش و پاسخ یادگیری عمیق
به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

سلام- من از تصاویر گوش استفاده میکنم. حدودا 6500 تصویر برای ترین دارم و 700 تصویر برای تست. که در واقع با data augmentation به دست آوردم. تعداد کلاس هام هم 50 تا هستش. موقعی که میخوام از شبکه های مختلف استفاده کنم ضمن رعایت همه موارد فاین تیون، از وزن کفه مدل شبکه ها هم استفاده میکنم. به عنوان مثال برای استفاده از گوگل نت، وزن آن را هم استفاده میکنم و فاین تیون میکنم. اما loss همیشه زیاد هست و دقت خیلی کم. چیزی حدود 0.01. بچ سایز روی یک تنظیم شده چون که بیشتر از اون بذارم رم کم میارم. از مین فایل و نرمال سازی هم استفاده می کنم ولی هیچ بهبودی حاصل نمیشه. روی شبکه های الکس نت، lenet و گوگل نت امتحان کردم. هیچ کدوم دقت بالایی نداشتن.
این سالور من هست:

test_iter: 700
test_interval: 6500
base_lr: 0.01
display: 40
max_iter: 10000
lr_policy: "poly"
power: 0.5
momentum: 0.9
weight_decay: 0.0002
snapshot: 40000
snapshot_prefix: "examples/bvlc_googlenet/bvlc_googlenet_quick"
solver_mode: GPU
device_id: 0
net: "examples/bvlc_googlenet/train_val.prototxt"
train_state {
  level: 0
  stage: ""
}
نمیدونم دیگه باید چیکار کنم؟ ایا تصاویر من کم هستند و یا اینکه مشکل از وزن ها هستش. اینم قسمتی از خروجی روی شبکه گوگل نت:
I0504 20:34:49.219352  6648 net.cpp:761] Ignoring source layer loss1/ave_pool
I0504 20:34:49.219352  6648 net.cpp:761] Ignoring source layer loss1/conv
I0504 20:34:49.220332  6648 net.cpp:761] Ignoring source layer loss1/relu_conv
I0504 20:34:49.220332  6648 net.cpp:761] Ignoring source layer loss1/fc
I0504 20:34:49.221334  6648 net.cpp:761] Ignoring source layer loss1/relu_fc
I0504 20:34:49.221334  6648 net.cpp:761] Ignoring source layer loss1/drop_fc
I0504 20:34:49.222334  6648 net.cpp:761] Ignoring source layer loss1/classifier
I0504 20:34:49.222334  6648 net.cpp:761] Ignoring source layer loss1/loss
I0504 20:34:49.224339  6648 net.cpp:761] Ignoring source layer loss2/ave_pool
I0504 20:34:49.224339  6648 net.cpp:761] Ignoring source layer loss2/conv
I0504 20:34:49.225338  6648 net.cpp:761] Ignoring source layer loss2/relu_conv
I0504 20:34:49.225338  6648 net.cpp:761] Ignoring source layer loss2/fc
I0504 20:34:49.225338  6648 net.cpp:761] Ignoring source layer loss2/relu_fc
I0504 20:34:49.226459  6648 net.cpp:761] Ignoring source layer loss2/drop_fc
I0504 20:34:49.226459  6648 net.cpp:761] Ignoring source layer loss2/classifier
I0504 20:34:49.226459  6648 net.cpp:761] Ignoring source layer loss2/loss
I0504 20:34:49.229475  6648 net.cpp:761] Ignoring source layer loss3/classifier
I0504 20:34:49.238483  6648 caffe.cpp:252] Starting Optimization
I0504 20:34:49.238483  6648 solver.cpp:279] Solving GoogleNet
I0504 20:34:49.239472  6648 solver.cpp:280] Learning Rate Policy: poly
I0504 20:34:49.400656  6648 solver.cpp:228] Iteration 0, loss = 4.93185
I0504 20:34:49.400656  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 4.93185 (* 1 = 4.93185 loss)
I0504 20:34:49.400656  6648 sgd_solver.cpp:106] Iteration 0, lr = 0.01
I0504 20:34:55.188277  6648 solver.cpp:228] Iteration 40, loss = 87.3365
I0504 20:34:55.189512  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:34:55.190076  6648 sgd_solver.cpp:106] Iteration 40, lr = 0.00997998
I0504 20:35:00.982188  6648 solver.cpp:228] Iteration 80, loss = 87.3365
I0504 20:35:00.982322  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:00.983325  6648 sgd_solver.cpp:106] Iteration 80, lr = 0.00995992
I0504 20:35:06.763850  6648 solver.cpp:228] Iteration 120, loss = 87.3365
I0504 20:35:06.764673  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:06.765547  6648 sgd_solver.cpp:106] Iteration 120, lr = 0.00993982
I0504 20:35:12.561303  6648 solver.cpp:228] Iteration 160, loss = 87.3365
I0504 20:35:18.875185  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:18.876188  6648 sgd_solver.cpp:106] Iteration 160, lr = 0.00991968
I0504 20:35:24.607239  6648 solver.cpp:228] Iteration 200, loss = 87.3365
I0504 20:35:26.163414  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:26.164357  6648 sgd_solver.cpp:106] Iteration 200, lr = 0.0098995
I0504 20:35:31.888242  6648 solver.cpp:228] Iteration 240, loss = 87.3365
I0504 20:35:31.888242  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:31.888242  6648 sgd_solver.cpp:106] Iteration 240, lr = 0.00987927
I0504 20:35:37.685355  6648 solver.cpp:228] Iteration 280, loss = 87.3365
I0504 20:35:37.686475  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:37.686882  6648 sgd_solver.cpp:106] Iteration 280, lr = 0.00985901
I0504 20:35:43.489472  6648 solver.cpp:228] Iteration 320, loss = 87.3365
I0504 20:35:43.489472  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:43.490864  6648 sgd_solver.cpp:106] Iteration 320, lr = 0.0098387
I0504 20:35:49.283823  6648 solver.cpp:228] Iteration 360, loss = 87.3365
I0504 20:35:49.284389  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:49.284389  6648 sgd_solver.cpp:106] Iteration 360, lr = 0.00981835
I0504 20:35:55.083504  6648 solver.cpp:228] Iteration 400, loss = 87.3365
I0504 20:35:55.084228  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:35:55.084854  6648 sgd_solver.cpp:106] Iteration 400, lr = 0.00979796
I0504 20:36:00.871918  6648 solver.cpp:228] Iteration 440, loss = 87.3365
I0504 20:36:00.871918  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
I0504 20:36:00.872941  6648 sgd_solver.cpp:106] Iteration 440, lr = 0.00977752
I0504 20:36:06.654637  6648 solver.cpp:228] Iteration 480, loss = 87.3365
I0504 20:36:06.655269  6648 solver.cpp:244]     Train net output #0: loss3/loss3 = 87.3365 (* 1 = 87.3365 loss)
توسط (150 امتیاز)
سلام. در مورد کاهش پیدا نکردن لاس چند تا سوال قبلا اینجا داشتیم که توضیحات خوبی داده شده اونا رو بخونید اگر باز مشکل شما برطرف نشد بفرمایید
سلام.
بله من خوندم مشکلاتی که دوستان در مورد لاس داشتند. چند سوال برام پیش اومد.
 در فاین تیون شما فرمودید که همه لایه ها به جز لایه اخر فریز بشه. این به این معناست که پارامتر های lr_mult و decay_mult رو در همه لایه ها به جز لایه اخر صفر قرار بدیم؟
من این کارو کردم ولی بهبودی حاصل نشد. شاید اشتباه فهمیدم. ممنون میشم بگید

2 پاسخ

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

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

یه نکته دیگه هم با توجه به پست آقا حسام یادم اومد اینه که شما از سیاست نرخ یادگیری متفاوت استفاده کنید چون بشدت تاثیرگذار هست. میتونید از Adadelta یا Nestrov یا حتی خطی استفاده کنید. دوتای اول نرخ همگرایی خیلی خوبی دارن اما اخری همگرایی خیلی کندی بعضا داره و زمان زیادی معمولا نیازداره تا به نقطه خوب برسه

توسط (4.3k امتیاز)
انتخاب شده توسط
خیلی ممنون مشکلم حل شد. ایراد از مومنتوم بود که باید می ذاشتم روی 9 صدم و نرخ یادگیری رم متناسب با اون تنظیم می کردیم.
در واقع سالور من به این شکل در امد:
base_lr: 0.01
momentum: 0.09
weight_decay: 0.005
# The learning rate policy
lr_policy: "inv"
gamma: 0.1
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 38200
# snapshot intermediate results
snapshot: 1910
snapshot_prefix: "examples/lenet/lenet"
# solver mode: CPU or GPU
solver_mode: GPU
الان یه مشکل دیگه که دارم اینه که با وجود اینکه دقت افزایش پیدا میکنه و لاس ولیدیشن و لاس ترین هم کم میشه اما این روند خیلی خیلی کند اتفاق می فته. یعنی لاس ها کم کم کاهش پیدا میکنند و در نتیجه ماکس ایتر را باید زیاد بدم تا دقتم قدری بره بالا. راهکاری برای اینکه خیلی سریعتر دقت بره بالا و لاس کم بشه دارید؟ در واقع میخوام سریع تر همگرا بشه
ممنونم
سلام . دلیل وجود مومنتوم تسریع همگرایی هست. شما با اون مقداری که ست کردید تقریبا مومنتوم رو از بین بردید.(تاثیرش رو خیلی کاهش دادید) میتونید کم کم مقدارش رو افزایش بدید تا به سرعت مناسب برسید . رسیدن به سرعت مناسب لازمه اش نرخ یادگیری ، مومنتوم و همینطور سیاست یادگیری بهینه اس. یعنی هر سه اینها در سرعت همگرایی تاثیر دارن. ساده ترین شکلش تنظیمات مربوط به نرخ یادگیری و مومنتوم هست (و همینطور رگویلایزر) و پیچیده ترش هم سیاست یادگیری .
+2 امتیاز

تجربه ای که من دارم این مشکل به این دلایل پیش میاد اگر بقیه مسایل درست باشن:
1. اشکالی در دیتابیس عکسها
2. انتخاب Solver نا مناسب
3. انتخاب نرخ یادگیری نامناسب

توسط (143 امتیاز)
در مورد دیتابیس که فکر نمیکنم باشه. چون هم روی دیتاست خودم امتحان کردم و هم دیتاست برنچ مارک حوزه خودم. که هر دوش جواب نداد و با لاس بالا روبه رو میشه.
در مورد انتخاب سالور نامناسب، من چه کارهایی باید انجام بدم؟ نرخ یادگیری را خیلی کم کردم و کمی بهتر شد. اما دقتم بالاتر از 40 درصد نمیره.
نرخ یادگیری رو روی 0.0001 قرار بدین ببینین چی میشه. Solver هم کمی سرچ کنین نحوه عوض کردن اش هست. در فایل solver.prototxt هم می نویسه. SGD برای کار شما خوب باید باشه. اگر همه اینها جواب نداد یک جای کارتون ایراد داره چون من اولین تجربم با همین بود و تست اول کار کرد دقتش رفت روی 99
...