چگونه یک مدل برای شناسایی مکان‌ها آموزش دادیم؟

نویسندگان ‌: محیا مهدیان و محمد حسن ستاریان

مقدمه

deeplearning

در هر مسئله دسته‌بندی (Classification)، پیاده‌سازی یک مدل مناسب -از جهت صحت پیش‌بینی- به مولفه‌های متفاوتی وابسته است؛ داشتن ورودی‌های -با ویژگی‌های- گوناگون و به تعداد زیاد یکی از مولفه‌های مهم برای آموزش مدلی که دقیق (Accurate) بوده و قادر به عمومیت بخشی (Generalization) به دانش خود و راستی آزمایی آن در محیط واقعی است می‌باشد. با این حال جمع آوری داده زیاد کاری سخت و نیازمند زمان و هزینه زیاد، بسته به شرایط و نوع داده مورد نیاز خواهد بود. در این شرایط و با توجه به اینکه کار‌های پیشین زیادی انجام شده اند، استفاده از روش‌های یادگیری انتقال (Transfer learning)، درواقع استفاده از یک مدل از پیش آموزش دیده و استفاده از آن به عنوان استخراج کننده ویژگی (Feature Extractor) یا به عنوان شبکه Fine Tuning کمک بسیار زیادی در ساخت مدلی دقیق و مناسب خواهد داشت. همچنین استفاده از روش‌های افزایش داده (Data augmentation) باعث افزایش چشم‌گیر داده شده و در آموزش بهتر مدل موثر خواهد بود؛ با این‌حال در استفاده از این روش باید توجه داشت از روش‌هایی برای تغییر عکس استفاده کرد که عکس خروجی خارج از فضای حالت مسئله نبوده و در شرایط واقعی مسئله وجود داشته باشد. به علاوه در جمع‌آوری داده باید داده‌های جمع آوری شده بررسی و در صورت نیاز پاکسازی‌هایی نیز انجام شود، تا داده‌های نامناسب، نامربوط و بی‌تاثیر حذف شوند اما از عمومیت داده‌ها کم نشده و داده‌های مختلفی در شرایط مختلف آزمون مسئله وجود داشته باشد؛ چرا که هرچه داده‌ها متفاوت‌تر باشند مدل قابلیت عمومیت بخشی بیشتری خواهد داشت. استفاده از پارامترهای (Hyperparameter)‌ مناسب در آموزش مدل، انتخاب دقیق و بسته به شرایط -و داده‌- پارامترها نیز از اهمیت زیادی برخوردار است و شاید نیاز باشد تغییر دقت مدل با تغییر این پارامترها بررسی شود که در این‌صورت نیاز است مدل چندین دفعه آموزش داده شود.

مراحل پیاده‌سازی مدل

هدف ما آموزش مدلی بود تا بتواند مکان‌های دانشگاه را تشخیص بدهد؛ برای پیاده‌سازی مدل خود از فریم‌ورک کراس (Keras) و زبان پایتون استفاده کردیم. از آنجایی که تعداد کلاس‌ها کم بوده و امکان جمع‌آوری داده زیادی که بتواند مدل را خوب آموزش بدهد نبود، مدلی برای استفاده به عنوان مدل پایه (Base Model)‌ برای Fine Tuning انتخاب شد. سپس داده‌های مورد نیاز جمع‌آوری شده، تمیز شده و آماده آموزش شدند. مدل روی گوگل کولب (Google Colab) به همراه استفاده از روش‌های افزایش داده آموزش داده شده و ذخیره شد. برای استفاده از مدل برنامه‌ای برای اجرای آن روی سرور و گرفتن خروجی با میکروفریم‌ورک فلسک نوشته شده و اپلیکیشن اندرویدی نیز برای گرفتن عکس و پیش‌بینی آن در لحظه ساخته شد. هر مرحله به تفضیل توضیح داده خواهد شد:

کد تمامی مراحل در ریپوزتوری «SRU-Place-Recognizer» قابل دسترسی است.

پیدا کردن مدل پایه

VGG16 + places365

همانطور که گفته شد از آنجایی که تعداد کلاس‌ها کم بوده و امکان جمع‌آوری داده زیادی که بتواند مدل را خوب آموزش بدهد نبود، از روش یادگیری انتقال (Transfer learning) استفاده کرده و مدل VGG16 Places365  برای استفاده به عنوان مدل پایه (Base Model)‌ برای Fine Tuning انتخاب شد. این مدل یک شبکه VGG16 است که از پیش با داده‌های دیتاست Places365 که شامل بیش از ۱۰ میلیون عکس در بیش از ۴۰۰ موضوع است آموزش داده شده است؛ پس نه تنها ویژگی‌های اولیه مورد نیاز مسئله در لایه‌های ابتدایی شناسایی شده‌اند بلکه در لایه‌های جلوتر نیز ویژگی‌های بصری عمیقی شناسایی شده اند و مدلی بسیار مناسب برای این مسئله خواهد بود. بنابراین ما از این مدل به عنوان مدل پایه آموزش خود استفاده کردیم به صورتی که تنها لایه‌های کانولوشنی استفاده شده و از میان‌ آن‌ها ۵ لایه آخر را نیز از حالت فریز (freeze) خارج کردیم. در قسمت ساخت مدل بیشتر بخوانید.

جمع‌آوری داده

برای مسئله شش کلاس -شش مکان برای آموزش مدل- در نظر گرفته شد: دانشکده کامپیوتر، دانشکده معماری، سلف، بوفه، ساختمان امور فرهنگی و زمین ورزشی؛ برای جمع‌آوری داده از این مکان‌ها عکس و فیلم از تمامی زوایای ساختمان‌ها گرفته شد. همچنین سعی شد در زمان‌های متفاوتی عکس‌برداری انجام شود تا تصاویر از تنوع قابل قبولی در نور محیط برخوردار باشند. فریم‌های فیلم‌ها بعدا با استفاده از اسکریپت پایتونی زیر جدا شد تا نهایتا در هر کلاس (از هر مکان) ۸۰۰ عکس شامل ۵۰۰ عکس برای آموزش و ۳۰۰ عکس برای تست و مجموعا ۴۸۰۰ عکس تولید شود.

از این اسکریپت به صورت زیر استفاده می‌کنیم (با این فرض که کدهای بالا را در فایلی با نام frameExtractor.py ذخیره کرده اید)؛ پارامتر اول آدرس فایل ویدئو و پارامتر دوم عددی برای شروع نام‌گذاری تصاویر اسکریپت است برای مواقعی که فریم‌های چندین فایل ویدئو را می‌خواهیم جدا کنیم:

آماده‌سازی داده‌ها

از آنجایی که روش جمع‌آوری داده ما، جدا کردن فریم‌ از فیلم‌های گرفته شده بود، تصاویر نامربوط، برای نمونه از محیط اطراف ساختمان و یا تصاویر تار شده نیز در میان عکس‌ها وجود داشت. همچنین تصاویر با کیفیت ۲۱۶۰*۳۸۴۰ گرفته شده بودند و هر کدام تقریبا حجمی بیش از ۳ مگابایت داشتند که برای آموزش شبکه بسیار سنگین بوده و ویژگی‌های (features) بسیار زیادی تولید می‌کردند که برای برنامه خود تا این حد نیاز به جزئیات نداشتیم؛ همچنین عکس‌ها به صورت landscape جدا شده بودند و نیاز به چرخواندن (rotate) داشتند. برای همین، با استفاده از برنامه ImageMagick تصاویر را ۹۰ درجه چرخوانده و سپس همگی را به سایز ۱۹۲*۱۰۸ تبدیل کردیم تا مدل در حین سبک شدن از ویژگی‌های کافی برای آموزش برخوردار باشد.

برای آشنایی با Image Magick و نحوه انجام کار پست «کار با تصاویر توسط ImageMagick» را بخوانید.

در نهایت تصاویر در فولدرهای مربوطه Train و تست و زیرفولدرهایی با اسامی کلاس‌ها قرار داده شدند. این اسم فولدرها بعدا در آموزش مدل و استفاده از دیتا جنریتور (Data Generator) به عنوان اسامی کلاس‌های مدل تعریف می‌شوند. ساختار فولدربندی داده‌ها به صورت زیر شد:

 

ساخت مدل

همانطور که قبلا اشاره شد برای مسئله از Fine Tuning استفاده شد. مدل نهایی تشکیل شده است از لایه‌های کانولوشنی شبکه VGG16 Places365 که به عنوان مدل پایه استفاده شده است و ۵ لایه آخر آن از حالت حالت فریز (freeze) خارج شده و به دو لایه تماما متصل (Fully connected) با ۲۵۶ نود و ۲ نود که به ترتیب از Activation function های Relu (برای شناسایی nonlinearities) و Softmax (برای کد کردن نتیجه در ۶ کلاس) استفاده می‌کنند متصل شدند.

آموزش مدل

google colab

برای آموزش سریعتر مدل و استفاده از GPU که امکان استفاده آن در سیستم خودمان فعلا وجود نداشت، از سرویس گوگل کولب (Google Colab)‌ استفاده کردیم. برای همین منظور فایل‌های لازم برای آموزش مدل به گوگل درایو منتقل شدند -فایل‌ها آپلود شده و از طریق سرویس SavetoDrive به گوگل درایو منتقل شدند- سپس فایل‌ها را در نوت‌بوکی که در گوگل کولب ساخته بودیم وارد کردیم تا مدل را آموزش دهیم.

آموزش نحوه انتقال فایل از گوگل کولب به گوگل درایو را در پست «اتصال مستقیم سرویس کولب (Google Colab) به درایو (Google Drive) از طریق فایل سیستم FUSE» بخوانید.

برای آموزش مدل پس از تعریف ساختار مدل (که در قسمت ساخت مدل توضیح داده شد)، چون که تعداد داده‌ها زیاد بود از دیتا جنریتور (Data Generator) هایی برای خواندن تصاویر از فولدر‌های مربوطه استفاده شده و برای داده‌های آموزش (Train) از روش‌های افزایش داده (Data augmentation) استفاده شد. تصاویر در گروه‌های ۲۰ تایی به شبکه تغذیه (Feed) شده ( batch_size = 20 )، مقادیر steps_per_epoch  و validation_steps  با توجه به تعداد داده‌های Train و Test و تعداد عکس‌های هر گروه ( batch_size) محاسبه شده و با ۱۰ بار تکرار ( epochs = 10 ) شبکه آموزش دید.

بررسی مدل

برای بررسی مدل نمودارهای روند تغییر accuracy و loss در هر epoch چاپ شد تا از نبود over-fitting مطمئن شویم.

accuracy and loss Plots

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

تصویر با استفاده از تابع load_img در سایز مورد استفاده مدل خوانده شده و سپس به آرایه تبدیل شده، آرایه تبدیل به آرایه تک بعدی شده و پیش پردازشی رو آن توسط تابع  preprocess_input انجام شده است. این تابع در فایل  places_utils که مدل پایه (VGG16 Places365در اختیار گذاشته موجود است.

ذخیره مدل

در نهایت برای استفاده‌های آتی، مدل را ذخیره کردیم.

 

کد آموزش مدل و نوت‌بوک استفاده شده برای آموزش مدل در گوگل کولب در ریپازیتوری در دسترس اند.

استفاده از مدل در عمل

اسکریپت پیش‌بینی

برای اینکه از مدل استفاده کنیم، برنامه‌ای لازم داشتیم تا تصویر را دریافت کرده و نتیجه پیش‌بینی را برگرداند. برای این منظور اسکریپت زیر نوشته شد:

اسکریپت در ریپازیتوری در دسترس است.

سرور پیش‌بینی

از آنجایی که برنامه بالا باید حتما به همراه عکسی که قرار است پیش‌بینی شود در یک سیستم باشند و درواقع به صورت لوکال اجرا می‌شود، محدود بوده و نیازهای استفاده عملی از مدل را فراهم نمی‌کند. برای همین با استفاده از میکروفریک ورک فلسک برنامه سرور زیر نوشته شد تا بتوان با آپلود عکس، نتیجه پیش‌بینی را دریافت کرد.

برای آشنایی با فلسک و نحوه ایجاد یک برنامه سرور پست «آموزش مقدماتی فلسک (Flask)»‌ را بخوانید.

سه endpoint برای کار با مدل تعریف شدند؛  upload/  برای آپلود عکس (عکس را به صورت base64 دریافت کرده و آن را ذخیره می‌کند)، imagetopredict/  دریافت آخرین عکسی که برای پیش‌بینی فرستاده شده و  predictagain/  برای پیش‌بینی دوباره آخرین عکس آپلود شده. سپس، این برنامه روی سرور دپلوی شده و مدل آماده استفاده عملی شد.

کد برنامه سرور در ریپازیتوری در دسترس است.

برای آشنایی با نحوه دپلوی مدل پست «دپلوی کردن و استفاده از مدل در عمل (Model deployment)» را بخوانید (ما از روش سوم استفاده کردیم).

اپلیکیشن اندروید

حال که سروری داشتیم که با فرستادن عکس می‌توانستیم نتیجه پیش‌بینی را دریافت کنیم، میخواستیم از هر جایی امکان فرستادن عکس را داشته باشیم؛ برای این منظور با استفاده از فریم‌ورک Nativescript-Vue که ترکیب فریم‌ورک‌های Nativescript که برای ساخت اپلیکیشن‌های اندروید و ios با استفاده از زبان جاوااسکریپت (javascript) است و Vue که یک فریم‌ورک جاوااسکریپتی برای ساخت Progressive Web App هاست، اپلیکیشن اندرویدی برای پیش‌بینی تصاویر توسط مدل و با اتصال به سرور تولید شد.

کد اپلیکیشن در ریپازیتوری در دسترس است.

دپلوی کردن و استفاده از مدل در عمل (Model deployment)

10نویسندگان ‌: محیا مهدیان و محمد حسن ستاریان

پس از اینکه یک مدل را آموزش دادیم، می‌خواهیم یک سرور سبک و کوچک داشته باشیم تا بتوانیم با فرستادن عکس نتیجه پیش‌بینی (Predict) مدل را دریافت کنیم، درواقع کاری می‌کنیم که امکان پیش‌بینی از هرجایی از طریق اینترنت فراهم باشد. اینکار کمک می‌کند بتوانیم سرویس‌ها و حتی اپلیکیشن‌‌هایی برای استفاده عملی از مدل خود داشته باشیم.

برای اینکار چندین راه وجود دارد؛ در این پست ما روش‌‌های اجرای لوکال، دپلوی با Heroku و اجرا از سرور ریموت را بررسی می‌کنیم.

 

اجرای لوکال


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

ابزار‌ها

ngrok – ابزاری رایگان برای ایجاد تونل از اینترنت به یک پورت در سیستم لوکال است. ngrok یک آدرس قابل دسترس از اینترنت به پورت مشخص شده می‌دهد تا بتوان ترافیک پورت را از خارج سیستم از طریق اینترنت دریافت کرد.

Flask – فلسک یک میکروفریم‌ورک سبک برای راه‌اندازی سریع و راحت وب‌سرور است. آموزش مقدماتی فلسک را بخوانید.

قبل از شروع، طبق این مراحل ngrok را نصب کرده و آن‌را به PATH سیستم خود اضافه کنید.

طبق آموزش مقدماتی فلسک، کدی مانند نمونه کد زیر برای سروری که قادر به گرفتن عکس (upload)، لود مدل آموزش داده‌شده (Load model)، پیش‌بینی عکس (Predict)‌ و برگرداندن خروجی است، بنویسید.

سپس، سرور فلسک را با وارد کردن دستور زیر در ترمینال اجرا کنید:

پس از اجرا، سرور در آدرس http://localhost:5000 در دسترس می‌شود.

حال با استفاده از ngrok به این سرور یک آدرس قابل دسترس در اینترنت اختصاص می‌دهیم؛ برای اینکار یک ترمینال جدید باز کرده و دستور زیر را وارد می‌کنیم:

در این دستور با فراخوانی ngrok گفته ایم به برنامه درحال اجرا در پورت ۵۰۰۰ میخواهیم دسترسی از طریق پروتکل http بدهیم. پس از اجرای دستور بالا مطابق شکل زیر آدرسی که می‌توان برای دسترسی به سرور استفاده کرد به همراه آدرس مدیریت سرویس ngrok به نمایش در‌می‌آید:

ngrok output

پس از آن می‌توانید از طریق این آدرس و endpoint های تعریف شده از مدل خود استفاده کنید.

 

دپلوی با Heroku


شاید سخت‌ترین روش بین دو روش دیگر این روش و استفاده از Heroku است و مفاهیمی که این روش به عنوان پیش‌نیاز لازم دارد تا آشنا باشید کم نیستند. اما شاید از روش‌های دیگر سخت‌تر باشد اما می‌تواند جذاب‌تر و حتی پرکاربرد تر باشد. همچنین لازم به ذکر است این سرویس فعلا برای استفاده مسدود بوده و نیاز به اتصال غیر مستقیم است و در استفاده رایگان حجم پروژه نباید از ۵۰۰ مگابایت بیشتر باشد.

ابزار‌ها

Heroku – سرویس (PaaS (Platform as a service ای و درواقع بستری به عنوان سرویس ابری است که از زبان‌های برنامه نویسی زیادی پشتیبانی می‌کند که برنامه نویس را از کارهای DevOps لازم برای راه‌اندازی یک سرور بی‌نیاز می‌کند.

Flask – فلسک یک میکروفریم‌ورک سبک برای راه‌اندازی سریع و راحت وب‌سرور است. آموزش مقدماتی فلسک را بخوانید.

Github – گیت‌هاب سرویس میزبانی و کنترل نسخه تحت وب قدرت گرفته از گیت (git) است.

GitLFS – سیستم مدیریت فایل‌های حجیم گیت.

GitLFS سرویس ارائه شده توسط GitHub برای کنترل نسخه فایل‌های حجیم (حجیم تر از ۵۰ مگابایت) است و چون ما در پروژه خود فایل‌های نظیر فایل مدل آموزش داده شده و شاید فایل‌های دیگر داشته باشیم به این برنامه احتیاج داریم.

در ادامه مطابق آموزش شروع استفاده از Heroku با زبان پایتون، دلپوی برنامه خود (سرور پیش‌بینی) را، با استفاده از خط فرمان -و با شروع از سیستم خود- بررسی می‌کنیم؛ اما، این مراحل از طریق داشبورد Heroku که پس از ساخت اکانت در هروکو به آن دسترسی دارید نیز قابل انجام است. خوب است برای برنامه خود یک محیط مجازی پایتون ایجاد کرده، پیش‌نیاز‌های آن را نصب کرده از اجرای لوکال آن مطمئن شده و سپس اقدام به دپلوی آن کنید.برای آشنایی بیشتر آموزش ایجاد محیط مجازی پایتون و آموزش ایجاد سرور فلسک را بخوانید.

ورود

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

پس از نصب موارد فوق، ترمیتال را باز کرده و با استفاده از دستور زیر در Heroku لاگین می‌کنیم:

پس از اجرای دستور، ایمیل و رمزعبور خود را وارد کرده تا وارد شوید.

آماده‌سازی

اگر برنامه شما توسط git مدیریت نمی‌شود با استفاده از دستور git init  آن‌را فعال کنید. همچنین فایل‌های حجیم خود را مشخص کنید تا GitLFS آن‌ها را مدیریت کند:

در این مثال فایل model.h5  را که فایل مدل ذخیره شده است و حجم بیشتر از ۵۰ مگابایت دارد را با استفاده از GitLFS مدیریت می‌کنیم.

سپس، با استفاده از دستور زیر یک اپلیکیشن در Heroku درست می‌کنید که آماده دریافت سورس و اجرای آن‌ است:

با اجرای این دستور یک git remote  به نام heroku مرتبط با ریپوزیتوری گیت لوکال شما اضافه خواهد شد. همچنین، یک نام تصادفی (در این مثال lit-bastion-5032 ) به این برنامه تخصیص داده می‌شود. همچنین می‌توان با وارد کردن یک نام دلخواه نام مورد نظر خود را به اپلیکیشن اختصاص داد.

هروکو با استفاده از چند فایل تنظیم، تصمیم می‌گیرد برنامه را به چه صورت و با استفاده از چه سرویسی اجرا کند. برای آن‌که مشخص کنیم برنامه چگونه باید اجرا شود به سه کانفیگ فایل runtime.txt و requirements.txt به همراه فایل Procfile نیاز داریم.

runtime.txt

این فایل شامل توضیحاتی در مورد محیط اجرای برنامه و درواقع زبان مورد استفاده است.

ما این فایل را با محتوی زیر ایجاد می‌کنیم:

requirements.txt

این فایل، پیش‌نیازهای اجرای برنامه را مشخص می‌کند.

ما این فایل را با خروجی دستور pip freeze  که پکیج‌های نصب شده برای پروژه را چاپ می‌کند به صورت زیر ایجاد می‌کنیم:

Procfile

این فایل، شامل توضیحات نحوه اجرای برنامه است.

ما ابن فایل را با دستور زیر ایجاد خواهیم کرد:

این دستور بیان می‌کند که برنامه ما یک برنامه از نوع web بوده و لازم است با استفاده از برنامه سرور gunicorn اجرا شود و فایل اجرایی اپلیکیشنی به نام server است.

دلیل استفاده از سرور gunicorn بجای سرور پیش‌فرض پایتون این است که هروکو از این سرور برای اجرا، بخصوص برای اجرای فلسک استفاده می‌کند.

نکته مهم استفاده از gunicorn این است که این برنامه ابتدا یک سرور اجرا کرده سپس برنامه ما را در آن import می‌کند. از آنجایی که برنامه ما خود سرو خواهد شد نیازی به دستور ()app.run  نخواهد بود و اگر در کد خود از این دستور استفاده کرده ایم باید آن را مانند مثال زیر در شرط بررسی import شدن یا نشدن ماژول قرار دهیم:

با اعمال تغییرات فوق و اضافه کردن کانیفگ فایل‌ها، این تغییرات را با استفاده از گیت کنترل می‌کنیم:

قبل از ادامه دپلوی با استفاده از دستور heroku local web  می‌توانیم سرور خود را به صورت لوکال تست کنیم، اما از آنجایی که برنامه gunicorn در ویندوز قابل اجرا نیست اگر از ویندوز استفاده می‌کنید این امکان وجود نخواهد داشت.

حال اگر برنامه ما نیاز به تغییر نداشته و آماده push  کردن هستیم، با دستور زیر برنامه را در ریپوزیتوری ریموتی که هروکو در اختیارمان گذاشته بود push  می‌کنیم:

readme_assets/images/heroku-git-push.gif

اگر همه چیز موفقیت آمیز باشد، برنامه ما دپلوی شده و آماده استفاده است. قبل از آن با استفاده از دستور زیر مطمئن می‌شویم که حداقل یک نمونه از این برنامه درحال اجرا باشد:

با استفاده از دستور زیر می‌توانیم آدرس اختصاص داده شده به برنامه را در مرورگر باز کنیم:

برنامه آماده استفاده است!

روش بهتر استفاده از هروکو این است که ابتدا فایل‌های پروژه را در گیت‌هاب قرار دهیم. حتی می‌توان یک branch به پروژه آماده شده برای دپلوی روی هروکو اختصاص داد. سپس از طریق داشبور هروکو مستقیما به گیت‌هاب وصل شده و پروژه را دپلوی کرد.

heroku deploy options

اجرا از سرور ریموت


مراحل این روش تا حدود زیادی شبیه روش اول است، چراکه باز نیز با استفاده از flask یک برنامه سرور اجرا می‌کنیم. برای این روش لازم است از یکی از سرویس‌های ارائه دهنده سرور‌های ابری (Cloud servers) و یا سرور‌های اختصاصی (VPS)، سروری تهیه کنید. پس از تهیه سرور IP ای برای دسترسی به سرور به شما داده می‌شود. با استفاده از این سرور و از آنجایی که این IP یک IP عمومی (Public IP)‌ است، تنها کافی است با استفاده از فلسک سروری در سیستم اجرا کرده و host آن را برابر ‘0.0.0.0’ قرار دهیم تا از طریق اینترنت قابل دسترس باشد.

ابزار‌ها

Flask – فلسک یک میکروفریم‌ورک سبک برای راه‌اندازی سریع و راحت وب‌سرور است. آموزش مقدماتی فلسک را بخوانید.

SSH – پروتکل شبکه‌ای برای اتصال امن که یکی از کاربرد‌های آن ورود به یک سیستم ریموت است.

برای اتصال به سرور از SSH استفاده می‌کنیم. برای همین اگر از ویندوز استفاده می‌کنید از نرم‌افزار PuTTY استفاده کرده و اگر از لینوکس استفاده می‌کنید و یا در سیستم ویندوز خود کرنل لینوکس را فعال کرده‌اید (WSL) -از طریق کرنل لینوکس موجود در سیستم- به آی‌پی سرور از طریق SSH متصل شوید.

سپس، پیش‌نیاز‌های لازم برای اجرای اسکریپت‌های پایتون را نصب کرده و فایل‌های لازم برای اجرای مدل شامل، کد اجرای سرور فلسک، فایل مدل و دیگر فایل‌های مورد نیاز را به سرور انتقال دهید (از طریق راه‌اندازی گیت سرور روی سرور و یا آپلود کردن فایل‌ها و دانلود آن‌ها روی سرور).

پس از آن تنها کار لازم اجرای اسکریپت سرور فلسک است. توجه کنیم که برای اجرای سرور فلسک host آن‌را برابر ‘0.0.0.0’ و پورت دلخواه (پیش فرض ۵۰۰۰) تنظیم می‌کنیم:

برنامه در آدرس سرور و پورت تعیین شده اجرا شده و از طریق endpointها در دسترس خواهد بود.

 

منابع

مقاله‌های «پلوی کردن مدل کراس» و «دپلوی مدل‌های کراس» در مدیوم

رپوزیتوری گیت «مثال دپلوی اپلیکیشن پایتون در هروکو»، tl;dr

آشنایی با سرویس ابری Google Colab

محیط گوگل کولب امکان استفاده از GPU  را به صورت رایگان میدهد و امکان نصب و کار با پکیج های مختلف زبان پایتون و فریم ورکهای مطرح یادگیری عمیق همانند Tensorflow, Keras, Pytorch,Fast.ai را فراهم میکند.

مراحل ایجاد یک نوت بوک

ابتدا مطمئن شوید که به حساب کاربری gmail  خود متصل هستید . اگر حساب کاربری gmail ندارید اینجا را کلیک کنید.

* توجه :در تمام طول کار، باید  وی‌پی‌ان یا فیلترشکن روشن باشد.

از اینجا وارد محیط  google drive  شوید .

روش اول :

در محیط google drive   یک پوشه ایجاد کنید :

پوشه ای که ایجاد کرده ایم را انتخاب میکنیم

با کیلک راست بر روی  My drive فایل های نوت بوک وdataset.py    [Upload files] و

Data_hoda_full را آپلود میکنیم.

با کلیک راست بر روی نوت بوک مانند شکل زیر،نوت بوک را  با colaboratoryباز میکنیم :

بعد از باز شدن نوت بوک  GPU را فعال  میکنیم:

یک cell جدید ایجاد میکنیم :

کد زیر را در cell  وارد میکنیم :

بعد از run  شدن  cell دو مرحله تایید اعتبار داریم ، در هر مرحله بر رو لینک کلیک کنید و کد رو در تکست باکس وارد کنید :

کدهای زیر را به نوت بوک اضافه میکنیم تا فایل ها از گوگل درایو به محیط colab  اضافه شوند :

add cell+

add cell +

حالا  یک دایرکتوری برای دیتاست ایجاد میکنیم :

add cell+

دیتاست هدی را به پوشه ی دیتاست اضافه میکنیم :

add cell+

روش دوم ایجاد نوت بوک :

وارد سایت colab.research.google.com میشویم :

NEW NOTEBOOK >>> NEW PYTHON3 NOTEBOOK

سپس از منو file  نوت بوک جدید را آپلود میکنیم :

یک cell  جدید  ایجاد میکنیم سپس دستور زیر را وارد میکنیم  :

فایل و پوشه ی دیتاست را آپلود میکنیم :

add cell+

دیتاست هدی را به پوشه ی دیتاست اضافه میکنیم :

add cell+

روش سوم :

ابتدا ریپازیتوری خود را با دیتاست موردنظر و دلخواه روی گیت هاب ایجاد کنید

یا در صورت وجود ریپازیتوری آدرس آن را به صورت زیر یافته و با دستور زیر آن را در جوپیتر ران کنید

*توجه داشته باشید که فرمت دستورات لینوکسی میباشد.

مثال :

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

در ادامه مسیر جاری را پیدا کرده و فایل های دریافت شده از مخزن را در مسیر دلخواه ( بعنوان مثال /content ) منتقل کنید:

در نهایت کد های اجرایی مورد نظر را در یک سلول جدید وارد کرده و برنامه را اجرا کنید:

بروزرسانی : 1397/11/06

مقدمه‌ای بر شبکه‌های عصبی(2)

تا اینجا به دو مبحث درباره شبکه های عصبی پرداختیم. Activation function  برای تعیین عملکرد تابع خروجی و cost function  برای تعیین عملکرد بد شبکه. و برای بهبود عملکرد تابع مسائل بهینه سازی مطرح شد (مشتقات جزئی). اکنون به مسئله یادگیری(learning) شبکه میپردازیم.

Gradient Descent and Back-propagation

Gradient Descent

Gradient descent  یک الگوریتم بهینه سازی برای پیدا کردن مینیمم یک تابع است.

مثال : در این مسئله یک متغیر(w) داریم. و C  ، cost function  است.

یک وزن رندوم انتخاب میکنیم و مشتق c را نسبت به w محاسبه میکنیم. در نتیجه شیب به دست می آید. که جهت آن از روی علامتش مشخص می شود.

w را به سمت جهتی که به دست آوردیم، حرکت می دهیم. که در اینجا سمت راست است. یعنی باید w را بیشتر کنیم.

که با تکرار این کار در نهایت مقدار cost ، مینیمم می شود. در این نقطه مشتق یا شیب برابر با 0 است. با رسیدن به این مرحله نقطه بهینه پیدا می شود.

همان طور که دیدیم، پیدا کردن مینیمم برای فضای دو بعدی ساده بود. اما در فضاهای n بعدی این کار ساده نخواهد بود. و با شکل های پیچیده تری مواجه خواهیم شد.

پس با استفاده از gradient descent  میتوانیم بهترین پارامتر برای مینیمم کردن cost را به دست آوریم. برای مثال پیدا کردن بهترین مقادیر برای انتخاب وزن نورون های ورودی.

 

Backpropagation 

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

تابع cross entropy

one hot encoded

قبلا دیدیم که در شبکه تعدادی label  داشتیم. برای نشان دادن داده ی مربوط به آن label  به جای نشان دادن داده ، آن را به صورت one hot encoded  نمایش می دهیم. یعنی به تعداد کلاس های موجود 0 میگذاریم و عدد مربوط به کلاس را 1 میکنیم. یعنی به این شکل:

 

اما در شبکه به صورت رندوم یکی از خانه ها ماکسیمم شده و روشن می شود. یعنی به این شکل :

اما بهتر است برای بهتر شدن شبکه و بالا رفتن قطعیت آن همان گونه که بالاتر گفته شد، بهتر است یکی از خانه ها 1 شده و بقیه 0 باشند.

Cross entropy 

این تابع میزان عملکرد بد شبکه را تعیین می کند که به این صورت تعریف می شود و هدف بهینه کردن آن است.

Tensorflow playground

Tensorflow playground یک visualization  برای آزمایش شبکه های عصبی است که از طرف سایت tensorflow  اراائه شده است. که میتوان در آن با data های مختلف شبکه را train کرد. میتوان برای شبکه به تعداد دلخواه hidden layer و نورون اضافه کرد. وزن ها نیز به صورت رندوم تعیین شده اند که قابل مشاهده و تغییر اند.

در قسمت بالای صفحه چند آیتم وجود دارد.

1.epoch: تعداد به روز رسانی های شبکه به ازای بررسی همه ی data ها را مشخص میکند.

2.learning rate

3.activation: نوع activation function را مشخص میکند که میتواند linear، sigmoid،tanh  یا relu باشد.

4.regularization: برای مینیمم کردن تابع cost، مجموع توان 2 تمام وزن ها و بایاس ها را محاسبه میکند و مقادیر آنها را محدود میکند تا خیلی بزرگ نباشند تا یک وزن زیاد نتواند تاثیر زیادی روی شبکه داشته باشد و قدرت بین شبکه تقسیم شود و داده را حفظ نکند. میتواند مقادیر none، L1 یا L2 را داشته باشد.

5.regularization rate

6.problem type: نوع الگوریتم را مشخص میکند که classification باشد یا regression.

در قسمت چپ صفحه نیز چند آیتم وجود دارد.

1.data: از این قسمت میتوان از بین انواع dataset های موجود یکی را انتخاب کرد که میزان سختی آن ها متفاوت است.

2.ratio of training to test data: نسبت دیتاهای test و train را مشخص میکند.

3.noise: میزان noise موجود در دیتا را مشخص میکند. که هرچه بالاتر باشد، نشان دهنده ی در هم آمیختن بیشتر data ها است.

4.batch size: تعداد داده هایی را مشخص میکند که شبکه بعد از بررسی آنها، عملیات optimization  را اجرا میکند.

مقدمه‌ای بر شبکه‌های عصبی(1)

آشنایی با پرسپترون:

شبکه های عصبی مصنوعی در واقع بر اساس زیست شناسی پیاده سازی شده اند. به نورون هایی که از نورون های مغز انسان شبیه سازی شده اند پرسپترون می گویند.

هر نورون در مغز انسان ها شامل سه بخش دندریت ها که ورودی های نورون می باشند و بدنه اصلی و اکسون ها که خروجی آن می باشد تشکیل شده است.

نورون های مصنوعی نیز دارای ورودی ها و خروجی ها هستند که این مدل ساده به عنوان یک پرسپترون شناخته می شود.

حال بیایید مثال ساده ای از چگونگی عملکرد آن را ببینیم.

ورودی های هر پرسپترون هرکدام معرف مقادیر یک ویژگی می باشند.

 

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

حال ورودی ها در وزن های خود ضرب می شوند تا مقدار تاثیر گذاری آن ورودی مشخص شود.

پس از ضرب ورودی ها در وزن های خود این مقادیر به تابع فعال در بدنه پرسپترون انتقال پیدا میکنند.

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

تابع فعال: اگر مجموع ورودی ها مثبت شد خروجی یک و اگر منفی شد خروجی صفر می باشد.

اگر تمام ورودی ها صفر باشند چه مشکلی پیش می آید؟

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

حال نحوه نمایش ریاضی این پرسپترون را با هم بررسی کنیم.

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

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

حال اگر تعداد زیادی از پرسپترون ها را کنار هم قرار دهیم یک MLP  یا شبکه ی چند لایه پرسپترون مانند زیر ایجاد می شود.

در شکل بالا به لایه بنفش رنگ لایه ورودی و به لایه قرمز رنگ لایه خروجی گفته می شود که prediction را مشخص می کند.

به لایه هایی هم که نه ورودی هستند و نه خروجی، لایه پنهان گفته می شود.

اگر تعداد لایه های پنهان بیش از 2 باشد شبکه به deep learning تبدیل می شود.

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

برای درک بهتر این قسمت می توانید از این لینک استفاده کنید.

حال در مجموعه داده هدی اگر بخواهیم این شبکه را آموزش دهیم باید 25 عدد ورودی برای گرفتن ویژگی ها در نظر گرفت و 10 عدد پرسپترون برای خروجی در نظر گرفت که اگر وکتور 25 تایی عدد 2 را برای مثال به این شبکه دهیم باید شبکه عدد دو را به عنوان predict برگرداند که با روش oneHotEncoding باید ترتیب پرسپترون های خروجی به شکل 0010000000 باشد.

مثلا برای عدد 9 باید 0000000001 برگرداند.

 

حال بیایید کمی بیش تر درباره توابع فعال بحث کنیم:

در شروع توابع فعال ما یک تابع ساده بود که فقط قبول و یا عدم قبول یک مقدار را با برچسب های ۰ و ۱ مشخص می کرد.

یکی از مشکل های این تابع این است که تغییرات کوچک در خروجی آن تاثییری ندارد و اگر ورودی برای مثال از ۰/۹- به ۰/۱- تغییر کند برای آن تفاوتی نمی کند و در هر دو حالت ۰ برمی گرداند.

این تابع به دلیل اینکه مشتق های آن در همه ی نقاط ۰ می باشد در شبکه های پرسپترونی چند لایه جواب نمی دهد.

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

تابع مشابه دیگری نیز معرفی شد که به دلایل ریاضی محبوب تر از sigmoid می باشد:

این تابع tanh نام دارد.

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

یکی از مشکل های این تابع آن است که چون مشتق آن بین صفر و یک است در شبکه های چند لایه چون این مشتقات در هم ضرب می شوند در نهایت عددی بسیار نزدیک به صفر تولید می شود پس مناسب MLP نمی باشد.

پس دانشمندان تابع ساده دیگری برای استفاده معرفی کردند:

این تابع ReLU نام دارد که چون مشتقش در محدوده بزرگتر از یک، ۱ می باشد مشکل تابع قبلی را ندارد.

شکل ریاضی این تابع:

max(0, Z)

در آینده به دلیل کارایی بالای دو تابع tanh و ReLU بیشتر تمرکز ما روی این دو تابع خواهد بود.

کتابخانه های deep learning بیشتر این توابع را پیاده سازی کردند پس نیازی نیست که نگران پیاده سازی این توابع باشیم.

طبقه بند K نزدیکترین همسایه در scikit-learn

مسائل machine learning  به سه دسته تقسم می شوند:

1.supervised

2.unsupervised

3.enforcement learning

اکنون به دسته ی اول یعنی supervised learning میپردازیم.

The k-Nearest Neighbor Classifier

این الگوریتم از دسته الگوریتم های supervised learning  است. که آن را با چند مثال بررسی خواهیم کرد.

مثال اول:  در اینجا تعدادی feature برای تعدادی از گل ها مشخص کرده ا یم. اندازه ی گلبرگ ها و روشنایی گلبرگ ها.با توجه به مقادیری از feature ها که هر گل دارد، و label  های آن، مکان آن در نمودار مشخص می شود.

اگر بخواهیم بگوییم عکس جدیدی که    label آن را نداشته ایم در کدام دسته از گل ها قرار میگیرد(یعنی در واقع بخواهیم کلاس آن را تعیین کنیم.)، طبق الگوریتم nearest neighbor به صورت زیر میکنیم:

فاصله عکس جدید را با تمام training dataset ها محاسبه میکنیم تا ببنیم به کدام یک نزدیک تر است. و label عکس جدید همان label  نزدیک ترین data خواهد بود.

مثال دوم: در اینجا سه کلاس مختلف و دو feature داریم. و برای تعیین کلاس داده جدید مانند مثال قبل عمل خواهیم کرد.

1-nearest neighbor

در این الگوریتم label داده جدید، همان label نزدیک ترین داده به آن خواهد شد و در آن کلاس قرار خواهد گرفت. مشکل این الگوریتم این است که اگر در داده ها noise داشته باشیم، الگوریتم به درستی عمل نمیکند کرد.و داده ها را در کلاس اشتباه قرار میدهد.

k-nearest neighbor

برای رفع مشکل ذکر شده از این الگوریتم استفاده می شود. که در آن به جای یک همسایه، چند همسایه در نظر گرفته می شوند. K تعداد همسایه ها را مشخص می کند و hyper parameter است. که در فرایند training مشخص نمی شود.

انتخاب مقدار k به مسئله بستگی دارد. و باید مقادیر مختلف آن را برای test data بررسی کرد. اما اگر مقدار آن را بر اساس test data تعیین کنیم، مشکلی که به وجود می آید این است که ممکن است این مقدار فقط روی داده هایی که داریم عملکرد خوبی داشته باشد. و روی داده های جدید به خوبی عمل نکند.

برای مثال در اینجا از این الگوریتم با 3 همسایه استفاده شده است.

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

روشی که برای بهبود این مشکل وجود دارد استفاده ازVoronoi diagram است. که برای هر کلاس ناحیه ای مشخص شده است. و هنگام مشاهده داده جدید، با توجه به ناحیه ای که در آن قرار دارد، کلاس آن مشخص می شود.

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

1.scipy : برای لود کردن فایل مطلب استفاده می شود.

2.matplotlib : برای کشیدن نمودار استفاده می شود.

3.scikit-learn: کتابخانه ای برای machine learning است و بیشتر در machine learning  سنتی و کلاسیک کاربرد دارد.

میتوانید به جای pip از کلمه ی conda استفاده کنید. (اگر از آناکوندا استفاده میکنید.)

ابتدا package  ها و function های مورد نیاز را import  میکنیم.

 

Load_hoda : تابعی است که قبلا نوشته بودیم. که یک tuple شامل 1000 عدد training data و 200 عدد test data  بر می گرداند.

ایجاد طبقه بند k-nn

در کتابخانه scikit-learn طبقه بند به این شکل ایجاد می شود.

عدد 3 در اینجا همان k است.

و از تابع fit برای ذخیره دیتا های  train استفاده شده است.

پیش بینی داده های آموزشی

متغیر: sample را برای مشخص کردن اولین خانه تعریف می کنیم.

طبق کد X یک لیست شامل یک خانه است که آن خانه لیستی شامل 25 خانه (یک عکس از 200 دیتای  test) است.

 : Predicted_classهمان کلاس تشخیص داده شده برای داده است.

Actual_class : کلاسی است که واقعا داده به آن تعلق دارد. که از روی y_test  که همان label ها هستند تشخیص داده می شود.

در اینجا به تابع predict یک vector 25 تایی دادیم، و در قسمت fit 1000 تا vector 25 تایی. یکvector اول با 1000 vector دوم مقایسه شده و فاصله ها محاسبه می شود. با داشتن label  هر 1000 vector آن ها را sort می کند. و نزدیک ترین ها را پیدا می کند. و با بررسی سه  تا از نزدیک ترین ها، label داده را پیدا می کند.

Predict probability

تابع predict_proba درصد احتمال تعلق x تعریف شده به هرکدام از کلاس ها را بر می گرداند. که در اینجا با k=3 سه حالت اتفاق می افتد. (1، 0.6، 0.3)

پیش بینی چندین داده آزمون

Pred_classes: همه ی 200 داده مربوط به test data است.

True_classes: همه ی کلاس های واقعی را شامل می شود.

ارزیابی

با استفاده از تابع آماده score می توانیم میزان performance را محاسبه کنیم. همانطور که مشاهده می شود performance  برابر با 96 درصد است. یعنی از 200 داده، 8 تای آن اشتباه تشخیص داده شده است.

مراحل یک پروژه یادگیری ماشین

در پست قبل با دسته‌بندی‌های اصلی الگوریتم‌های یادگیری ماشین آشنا شدیم. در این نوشته قصد داریم مطالب زیر را بررسی کنیم:

  • مراحلی که یک الگوریتم supervised و unsupervised باید طی کنند تا یادگیری آنها کامل شود
  • ارزیابی مدل حاصل از این الگوریتم ها
مراحل یک الگوریتم supervised machine learning:

  • Data acquisition(جمع آوری داده): جمع اوری داده های بسیار زیاد که شامل نامگذاری آنها نیز می شود.
  • Data cleaning(تمیز کردن داده): از بین بردن اختلال در داده

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

 Train Dataset (مجموعه داده یادگیری): برای یادگیری و راه اندازی الگوریتم از این مجموعه داده استفاده می شود

 Test Dataset (مجموعه داده تست): بعد از یادگیری از این مجموعه داده استفاده می کنیم تا میزان کارایی الگوریتم را بسنجیم. مجموعه داده یادگیری و  تست، به این دلیل از هم جدا می شوند که شاید الگوریتم، مجموعه یادگیری را حفظ کند.

  • Train Model (مدل یادگیری): با استفاده از مجموعه داده یادگیری، ویژگی هایی که الگوریتم از داده ها یاد گرفته، بصورت یک مدل در می آید.
  • Evaluate Model (مدل سنجشی): با استفاده از مجموعه داده تست، مدلی که ایجاد شده، ارزیابی می شود. این فرایند بازگشتی است. به این معنی که وقتی ایرادات مدل یادگیری مشخص شد، این مدل دوباره تنظیم می شود تا ایرادات قبلی رفع شود.
یک مدل دیگر برای الگوریتم  supervised learning:

در مدل قبلی برای supervised machine learning فرآیند بازگشتی بین مدل یادگیری و مدل تست، باعث ایجاد کارایی دروغین می شود. زیرا به کمک تغییر دادن پارامتر های مدل کاری می کنیم که الگوریتم روی مجموعه داده تست مشخص شده، نتیجه بهتری دهد درحالیکه ممکن است این نتیجه رو یک مجموعه داده تست جدید بدست نیاید.

برای اینکه کارایی بدست آمده واقعی باشد. مجموعه داده خود را به سه قسمت تقسیم می کنیم:

(یادگیری)Train – (پیشرفت) Development – (تست )Test

اینبار برای تنظیم کردن پارامتر ها به کمک رابطه بازگشتی بین مدل یادگیری و مدل تست , از مجموعه داده پیشرفت استفاده می کنیم. و برای ارزیابی نهایی از مجموعه داده تست استفاده می کنیم.

مراحل یک الگوریتم unsupervised machine learning:

در این الگوریتم ها مجموعه داده تست وجود ندارد و کل داده برای یادگیری استفاده می شود

همچنین یادگیری در اینجا فرق دارد. زیرا در قسمت supervised با توجه به ویژگی هایی که مشخص شده بود، داده در یکی از گروه هایی که ما مشخص کرده بودیم جای می گرفت و کاملا مشخص بود که انتظار داریم بعد از پیش بینی داده در چه گروهی قرار بگیرد. ولی در unsupervised از آنجا که ما فقط ویژگی ها رو مشخص می کنیم و گروه ها را مشخص نمی کنیم، بعد از انجام پیش بینی باید بررسی کنیم که الگوریتم بر چه اساسی داده ها را دسته بندی کرده است.

Model Evaluation

در این قسمت به روش های ارزیابی الگوریتم هایی که در بالا توضیح داده شد می پردازیم.

ازیابی Supervised Learning:

Accuracy (دقت): تعداد پیش بینی درست از تعداد کل پیش بینی ها

Recall, Precision: در دقت پیش بینی انجام شده اینکه پیش بینی غلط واقعا مربوط به کدام نامگذاری است اهمیتی ندارد. ولی در Recall, Precision اهمیت دارد. مثلا برای تشخیص دادن غده ی سرطانی اینکه شخصی که سرطان دارد به اشتباه تشخیص داده شود که سرطان ندارد خیلی بدتر است تا اینکه حالت برعکس آن اتفاق بیفتد.

MAE, MSE, RMSE: برای regression(داده های پیوسته) استفاده می شود. نحوه کار آنها براساس میزان فاصله با جواب درست است. مثلا اگر بخواهیم قیمت یک خانه را با توجه به متراژ آن پیش بینی کنیم می توانیم از این معیار ها استفاده کنیم

ارزیابی Unsupervised Learning:

همانطور که گفته شد در قسمت supervised ارزیابی بسیار آسان تر است چون که دسته ها مشخص هستند و با توجه به این که دسته مشخص شده برای داده های تست درست است یا نه، می توانیم ارزیابی را انجام دهیم. ولی ارزیابی برای unsupervised آسان نیست. چون که الگوریتم با توجه به پارامتر هایی که خودش انتخاب می کند دسته بندی را انجام می دهد. شاید از نظر انسان همان داده ها بصورت دیگری دسته بندی شوند.

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

در مثال بالا با توجه به اینکه چه معیاری تعریف کنیم دسته بندی متفاوتی بدست می آید.

مقدمه ای بر یادگیری ماشین (Machine Learning)

به عنوان یکی از شاخه‌های وسیع و پرکاربرد هوش مصنوعی، یادگیری ماشین به تنظیم و اکتشاف شیوه‌ها و الگوریتم‌هایی می‌پردازد که بر اساس آنها رایانه‌ها و سامانه‌ها توانایی تعلّم و یادگیری پیدا می‌کنند.هدف یادگیری ماشین این است که کامپیوتر (در کلی‌ترین مفهوم آن) بتواند به تدریج و با افزایش داده‌ها کارایی بهتری در انجام وظیفه مورد نظر پیدا کند. گستره این وظیفه می‌تواند از تشخیص خودکار چهره با دیدن چند نمونه از چهره مورد نظر تا فراگیری شیوه گام‌برداری روبات‌های دوپا با دریافت سیگنال پاداش و تنبیه باشد. 

برخی از روش های یادگیری ماشین

الگوریتم های یادگیری ماشین اغلب به عنوان نظارت شده یا نظارت نشده و تقویتی دسته بندی می شوند.

1.یادگیری نظارت شده یا Supervised Learning :

الگوریتم های یادگیری ماشین تحت نظارت می توانند آنچه را که در گذشته آموخته شده است به منظور پیش بینی رویدادهای آینده با استفاده از مثال های برچسب گذاری شده برای داده های جدید اعمال کنند. با شروع فرایند تجزیه و تحلیل یک مجموعه داده‌ شناخته شده، الگوریتم یادگیری، یک تابع انتزاعی برای پیش بینی مقادیر خروجی تولید می کند. سیستم می تواند اهداف هر ورودی جدید را پس از آموزش کافی فراهم کند. الگوریتم یادگیری همچنین می تواند خروجی خود را با خروجی صحیحِ در نظر گرفته شده مقایسه کرده و به منظور تغییر مدل، خطای خود را پیدا کند. مسایل این روش به دو دسته Classification و Regression تقسیم بندی می شوند که در مسایل Regression متغیر خروجی مقادیر پیوسته را می گیرد و بیشتر این مسایل به تخمین زدن یا پیش بینی یک پاسخ مربوط است ولی در مسایل Classification متغیر خروجی کلاسی از برچسب ها (Labels) را می گیرد و بیشتر به تشخیص این که داده ها به کدام گروه ها یا کلاس ها تعلق دارند، می پردازد.

 

2.یادگیری بدون نظارت یا Unsupervised Learning :

الگوریتم های یادگیری ماشین بدون نظارت زمانی استفاده می شود که اطلاعات مورد استفاده برای آموزش، طبقه بندی و برچسب گذاری نشده اند. در یادگیری بدون نظارت، ماشین یاد می گیرد که چگونه سیستم ها می توانند یک تابع را برای توصیف یک ساختار پنهان از داده های بدون برچسب داشته باشند. سیستم، خروجی درست را تشخیص نمی دهد، اما این داده ها را بررسی می کند و می تواند نتیجه گیری از مجموعه داده ها را برای توصیف ساختارهای پنهان از داده های بدون برچسب به کار بگیرد.

 

 

3.یادگیری تقویتی یا Reinforcement Learning :

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