مقدمه ای بر deep learning

مقدمه ای بر deep learning :

Image classification :

یکی از مبانی پایه در computer vision بحث classification اشیا و تصاویر است که تشخیص می دهد تصویری که به کامپیوتر داده شده چیست. (برای مثال  مشخص می کند تصویر گربه است یا نه)

چالش ها:

در واقع یک طیف پیوسته ای برای هر شی وجود دارد. برای مثال در گربه بین هر دو پیکسلی که ما می بینیم n پیکسل دیگر وجود دارد. همچنین رنگ ها هم طیف پیوسته ای دارند که برای کد کردن مجبوریم آن ها را در یک کانال( RGB (red, green, blue کد کنیم و عدد آن بسته به کامپیوتر و پیاده سازی ای که انجام می دهیم از 0 تا 255 متغیر است. بنابراین در این مرحله تعدادی از اطلاعات برای تبدیل از دنیای واقعی به محیط کامپیوتر که به آن semantic gap می گویند، از دست می رود.

 

چالش های دیگری هم وجود دارد. برای مثال الگوریتم (KNN (k-nearest neighbor  در دیتاست هدی performance خیلی خوبی داشت ولی در دنیای واقعی این گونه نیست و یک سری مشکلات ممکن است رخ دهد، مانند viewpoint validation ها به این معنی که اجسام را می توان از زاویه های مختلف دید و به همین دلیل الگوریتم KNN پاسخ گو  نیست.

Illumination :

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

Deformation :

انسان قادر است اجسام را در هر حالت که باشند تشخیص دهد اما هدف این است که در computer vision هم این تشخیص به درستی صورت گیرد.

Occlusion :

در صورتی که قسمتی از اجسام پوشیده باشد باز هم انسان قادر به تشخیص آن است بنابراین الگوریتمی که پیاده سازی می شود نیز باید به همین صورت باشد

Background clutter :

اگر جسم در background محو شده باشد باز هم الگوریتم پیاده سازی شده باید بتواند آن را تشخیص دهد.

Intraclass variation :

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

Image classifier :

حالا باید مشخص کنیم چه الگوریتمی بهتر است تا این چالش ها برطرف شوند:

def predict(image):

     return class_label

ابتدا تابع predict تعریف می شود که یک عکس می گیرد و class_label ها را برمی گرداند.

بر خلاف sort کردن اعداد یا ماکزیمم گیری هیچ راه روشن و سریعی برای این گونه کلاس ها وجود ندارد و مجبوریم با راه حل های data-driven پیش برویم.

 

Data-driven approach :

ابتدا باید یک سری data و یک تابع train وجود داشته باشد که label ها به آن پاس داده می شوند. سپس بسته به نوع الگوریتم، طی یک فرآیند یادگیری یک مدل ساخته می شود که باید آن را ذخیره کنیم. بنابراین دفعه های بعد که عکس جدیدی به آن داده می شود می توان از یک تابع جدید به نام predict استفاده کرد که model و test_image به آن پاس داده می شود و دیگر نیازی به label نیست.

کد:

def train(train_images, train_labels):

    return model

def predict(model, test_images):

    return test_labels

K_Nearest Neighbor :

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

بنابراین KNN هیچگاه برای تصاویر کاربرد ندارد مگر اینکه مانند دیتاست هدی آنقدر کنترل شده باشد که بتوان از آن استفاده کرد.

Neural network و deep learning

History :

از سال 2012 تا کنون deep learning روال رو به رشد چشمگیری داشته است.

تعداد مقالاتی که در رابطه با deep learning جمع آوری شده رشد بسیار زیادی داشته و این بدان معنی است که افراد زیادی وارد این فیلد شده اند.

 

 

 

 

دکتر Andrew ng ، استاد دانشگاه استنفورد، در 5 نوامبر 2017 در کنفرانس خود اعلام کرد تعداد مقالات در بحث deep learning بیش از حد زیاد شده اما با فقدان نیروی متخصص مواجه هستیم و طبق پیش بینی او یک انفجار در شغل های مربوط به deep learning و  neural networkایجاد می شود بنابراین وجود نیروی متخصص بیش از پیش ضروری است.

همچنین Andrej Karpathy ، مدیر هوش مصنوعی شرکت تسلا، در وبلاگ medium خود گفته است deep learning  و neural network نرم افزار ها را دچار تغییر و تحول زیادی می کند. (software2.0 )

 

Neural network کجا استفاده می شود؟

این شبکه ها در دیدن، شنیدن، خواندن متن و استنتاج آن (مانند dictionary translation ها) کاربرد دارند. همچنین برای کنترل کردن (برای مثال انجام بازی کامپیوتری) هم استفاده می شوند.

Neural network ها شبیه logo block یا building block هایی هستند که neural network practitioner (سازنده ی neural network ) می تواند از آن ها استفاده کند.

می توانیم هر شبکه ای که شناخته شده است را یک building block در نظر بگیریم و مشابه کار Andrej Karpathy این شبکه ها را به هم وصل کنیم. برای مثال یک شبکه داریم که image را به خوبی تشخیص می دهد و همچنین یک شبکه داریم که متن را خوب می فهمد. می توان این دو شبکه را پشت سر هم وصل کرد (اتصال یک شبکه CNN و یک سری شبکه RNN (این نوع شبکه برای dictionary ها استفاده می شود.))

نتیجه این است که عکس را که می دهد خروجی جمله است. در واقع یک سری عکس با caption به آن داده شده که شبکه باید generalize  کند که اگر عکس جدید به آن داده شد بتواند جمله معادل را بسازد.

ساده ترین neural network که در نظر گرفته شده neural network یک لایه است. (softmax )

برای مثال یک عکس 2 * 2 را در نظر بگیرید، اگر آن را starch کنیم 4 پیکسل به وجود می آید. فرض کنید سه کلاس خروجی داریم که به طور مثال مشخص می کند تصویر داده شده گربه، سگ و یا گوسفند است یعنی یک ماتریس 4 * 3 داریم. اگر این ماتریس 4 * 3 در یک ماتریس 1 * 4 ضرب شود 3 عدد برمی گرداندکه می تواند مشخص کند در آخر کدام کلاس انتخاب شده است. یک راه ساده تر این است که سطر اول را وزن های مربوط به کلاس cat ، سطر دوم را وزن های مربوط به کلاس dog و سطر سوم را وزن های مربوط به کلاس sheep در نظر بگیریم که به اضافه ی bios می شودد. Bios را می توان به حوزه ی 0 و 1 انتقال داد که این کار با softmax انجام می شود.

و در آخر بعد از عملیات training هر عددی که بزرگ تر شود کلاس مربوط به آن انتخاب می شود.

ارقام دست نویس هدی: (اعدادی که در کنکور سراسری بالای دفترچه به صورت دست نویس نوشته می شود.)

در واقع این ارقام ابتدا normalize شده، سپس background آن ها عوض و بعد از آن با روش های مناسب باینری شده است.

شبکه Dense :

شبکه ای است که در لایه ی اول خود 25 نورون دارد (چون عکس 5 * 5 است) و در لایه ی آخر چون 10 کلاس داریم 10 نورون

قرار می گیرد که از 0 تا 9 مشخص می شوند.

تعداد نورون های لایه ی وسط را باید خودمان مشخص کنیم که با چند نورون به performance بهتری می رسد.

در این نوع شبکه همه ی نورون ها به یکدیگر وصل می شوند که به آن fully connected یا همان dense می گویند.

روی هر کدام از این نورون ها یک تابع activation اعمال می شود که relu برای این کار مناسب است.

کد:

Model=Sequential()

Model.add(Dense(64, activation=’relu’, input_dim=25))

Model.add(Dense(10, activation=’softmax’))

نمودار  relu

فرمول softmax :

تابع هزینه و روش بهینه سازی:

کد:

Model.compile(loss=’categorical_crossentropy’ , optimizer=’rmsprop’ , metrics= [‘accuracy’])

همانطور که پیش تر گفته شد با model.compile میزان loss مشخص می شود. معیار loss مقدار بد بودن شبکه را مشخصمی کند.

rmsprop  روش بهینه سازی است که نشان می دهد به ازای هر data چقدر با چیزی که می خواهیم شبکه predict کند فاصله داریم.

روش های دیگری نیز برای بهینه کردن وجود دارد مانند sgd ، momentum ، nag ، adagrad و … . در نهایت همه ی این روش ها شبکه را بهینه می کنند اما زمان بهینه کردن هم اهمیت زیادی دارد.

فوتر سایت

اسلایدر سایدبار

درباره ما

درباره ما

ما گروهی از دانشجویان رشته کامپیوتر دانشگاه شهید رجایی هستیم که به راهنمایی و تدریس استاد علی‌رضا اخوان‌پور به دنیای یادگیری عمیق پا گذاشتیم و دوست داریم چیزهایی که در این مسیر یادمی‌گیریم رو به اشتراک بذاریم.

شبکه های اجتماعی

مطالب اخیر