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
تنظیم scale و mean برای دیتاست - پرسش و پاسخ یادگیری عمیق
به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

سلام
من دارم از MobileNet-SSD استفاده می کنم و با دیتاست خودم یک شبکه آموزش دادم.
ابتدا از caffemodel ای که گذاشته شده برای finetuning استفاده کردم. و بعد از snapshot های خودم استفاده می کنم.

شبکه کار می کنه و بد نیست. اما آیا لازم هست که موقع آموزش و همچنین تست، مقادیر scale و mean رو تغییر بدم و مقادیر مربوط به دیتاست خودم رو بزارم؟
مقادیر پیش فرضشون توی فایل MobileNetSSD_train.prototxt به صورت زیره:

scale: 0.007843
mean_value: 127.5
mean_value: 127.5
mean_value: 127.5

من از عکس های 24 بیتی .bmp استفاده می کنم که grayscale هم هستن و دیتاستم به فرمت lmdb هست
اگر بهتره که تغییر بدمشون، چه طور باید محاسبه بکنمشون؟ و چه جاهایی از کد در فایل MobileNetSSD_train.prototxt یا احیانا فایل های دیگه باید تغییر کنه؟

(مشابه این فایل در لینک مذکور در پوشه ی template هست.)

با تشکر

توسط (102 امتیاز)

1 پاسخ

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

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

db_train = lmdb.open('cifar10_train_lmdb')
db_train_txn = db_train.begin(write=True)
db_test = lmdb.open('cifar10_test_lmdb')
db_test_txn = db_test.begin(write=True)

datum = caffe_pb2.Datum()

size_train = 50000
size_test = 10000
data_train = np.zeros((size_train, 3, 32, 32))
label_train = np.zeros(size_train, dtype=int)

data_test = np.zeros((size_test, 3, 32, 32))
label_test = np.zeros(size_test, dtype=int)

print 'Reading training data...'
i = -1
for key, value in db_train_txn.cursor():
    i = i + 1
    if i % 1000 == 0:
        print i
    if i == size_train:
        break
    datum.ParseFromString(value)
    label = datum.label
    data = caffe.io.datum_to_array(datum)
    data_train[i] = data
    label_train[i] = label

print 'Reading test data...'
i = -1
for key, value in db_test_txn.cursor():
    i = i + 1
    if i % 1000 == 0:
        print i
    if i ==size_test:
        break
    datum.ParseFromString(value)
    label = datum.label
    data = caffe.io.datum_to_array(datum)
    data_test[i] = data
    label_test[i] = label


print( 'Computing statistics...')
mean = np.mean(data_train, axis=(0,2,3))
std = np.std(data_train, axis=(0,2,3))

print( mean, mean.shape)
print( std, std.shape)
توسط (4.3k امتیاز)
انتخاب شده توسط
سلام
خیلی ممنون
در مورد این که چه طور محاسبه کنم منظورم این بود که کلا اساس محاسبشون چیه؟
ظاهرا برای mean باید از بین تمام پیکسل های تمام عکس ها میانگین گرفت. درسته؟
برای scale هم ظاهرا در کد شما انحراف از معیار گرفته میشه؟
در لینک زیر گفته شده که میتونه انحراف از معیار باشه یا دستی تعیین بشه که ظاهرا بستگی به ساختار شبکه و چیزای دیگه داره
https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/

یک جا هم گفته بود مثلا برای عکس های در رنج 0 تا 255 عدد 1/255 یا 0.0039 قرار داده میشه که ظاهرا عکسا رو در رنج 0 تا یک قرار میده.
چه رنجی خوبه که پیکسل های عکس ها در اون رنج قرار بگیرن؟

به نظرتون خوبه که عکس رو بعد از این پردازش تصویر نشون بدم تا ببینم چه طوری شده؟

بعد از این که این متغیرها رو محاسبه کردم بعد فقط باید توی فایل MobileNetSSD_train.prototxt مقادیرشون رو تغییر بدم؟ جای دیگه نیاز به تغییر نداره؟

این سوال رو در گروه گوگل caffe users  هم پرسیدم و یک نفر جواب داده:
https://groups.google.com/forum/#!topic/caffe-users/lo7MByfnuLU
سلام. محاسبه میانگین یا بر اساس کل عکس هست یا بصورت کانالی محاسبه میشه یعنی میانگین هر کانال جداگانه حساب و استفاده میشه . چیزی که مرسومه بیشتر این حالت دومه. تفاوت خاصی هم ندارن.
اون Std‌ هم ربطی به شبکه نداره ارتباطش با خود شماست که میخوایید چیکار کنید. بعضی ها صرفا میان تصاویر رو میبرن بین 0 و 1 اینجا یه اسکیل استفاده میکنن برای اینکار بعضی ها هم برای لحاظ کردن std در شبکه اینکارو میکنن.  کورس نوت های دانشگاه استنفورد رو بخونید خوبه. اگه اسکیل کوچیک باشه بهتره از نظر بهینه سازی ولی اگرم نرمال نکنید هم مساله ای نیست.
عکس بعد از پیش پردازش الزاما نکته قابل درک برای شما ممکنه نداشته باشه. ولی میتونید اینکارو بکنید به دلایل مورد نظر خودتون.  صحبتی که اون عزیز تو کفی گروپ کرد درسته . میانگین گیری کلا چند کار انجام میده. یه بخشش دور ریختن یکسری اطلاعات کلی و مشترکه یک بخش دیگه اش به بحث بهینه سازی مربوطه . در مورد استفاده از میانگین دیتاست خود شما یا ایمیج نت قبلا هم اینجا این سوالات پرسیده میشد و سابقا میگفتم برای میانگین  گیری از میانگین دیتاست خودتون استفاده کنید اما بعدا طی کار و تجربه های بعدی عکس این قضیه رو دیدم خودم. یعنی عموما میانگین ایمیج نت دقت بهتری رو باعث میشد. برای همین همیشه میگم شما تست کنید ببینید کدوم حالت برای شما بهتره. این قضیه شاید تو دیتاست های خیلی متفاوت خودشو بیشتر نشون بده.
برای قرار دادن میانگین هم در همون فایل prototxt‌ ترین و تست قرار بدید کافیه. هر پیش پردازشی در ترین انجام میدید رو تست هم باید لحاظ کنید. اگر میانگین کم میکنید اگر نرمال میکنید هرچی هست رو ترین و تست هردو باید انجام بشه.
من از کدی که دادید استفاده کردم به این صورت که اولش این ها رو اضافه کردم:
import lmdb
import caffe_pb2
import numpy as np

و در دستور lmdb.open آدرس فایل های lmdb رو دادم، (آدرس فایل data.mdb ) هم برای test و هم train.
db_train = lmdb.open('C:\Python27\MyDataset\lmdb\MyDataset_trainval_lmdb\data')
db_test = lmdb.open('C:\Python27\MyDataset\lmdb\MyDataset_test_lmdb\data')
و size_train و size_test رو هم به تعداد عکس های آموزش و تست خودم تغییر دادم.
size_train = 122
size_test = 36

نتیجه ی اجرای کد:
C:\Python27>python mean_scale.py
Reading training data...
Reading test data...
Computing statistics...
(array([0., 0., 0.]), (3,))
(array([0., 0., 0.]), (3,))

چرا صفر شده؟

ماژول lmdb تو ubuntu نصب نشد برای همین تو ویندوز کار کردم و python 2.7 و numpy و  protobuf رو نصب کردم و از یک caffe بیلد شده استفاده کردم.
...