مقدمه‌ای بر سیستم‌های توصیه‌گر (Recommender System)

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

+ ویدیو آموزشی این مطلب

+ کد ها در Jupyter Notebook

مقدمه:

فرض کنید یک سایت شبیه GoodReads داریم که کاربران میتونند در مورد کتاب های مختلف در سایت نظرشونو بنویسند. ما اطلاعاتی در مورد اینکه هر کاربر به چه کتابی چه امتیازی داده داریم، فرض کنید کاربر الف به کتاب های a , b , c رای بالا داده، و ما میخوایم پیش‌بینی کنیم این کاربر به کتاب d احتمالا چه امتیازی میده، برای این‌کار با تحلیل داده‌های بقیه کاربرهایی که امتیازشون به a, b , c شبیه کاربر الف بوده میشه فهمید احتمالا کاربر الف به کتاب d چه امتیازی میده.

ادامه خواندن مقدمه‌ای بر سیستم‌های توصیه‌گر (Recommender System)

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

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

مقدمه

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

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

مجموعه داده

مجموعه داده گربه در مقابل سگ برای این مثال استفاده شده است. این مجموعه داده در چالش بینایی کامپیوتر اواخر سال ۲۰۱۳ توسط سایت Kaggle.com در دسترس عموم قرار گرفت. مجموعه داده اصلی دارای ۲۵۰۰۰ تصویر (۱۲۵۰۰ از هر کلاس) است که می‌توانید آن را از اینجا دریافت کنید.

ما بعد از دانلود تصاویر، آن ها را در ساختار جدیدی مرتب کردیم. ۱۰۰۰ عکس برای آموزش، ۵۰۰ عکس برای ارزیابی و ۵۰۰ عکس برای آزمون از هر کلاس (گربه و سگ) جدا کردیم. این فرایند توسط کد زیر انجام شده و تصاویر مرتب شده از اینجا در دسترس است.

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

تعریف معماری مدل (model architecture)

ما از یک مدل کانولوشنالی برای حل این مساله استفاده می‌کنیم. از قبل از سال ۲۰۱۳ استفاده از شبکه های کانولوشنالی خیلی رایج نبود ولی بعد از آن تقریبا در همه مدل های بینایی ماشین با روش یادگیری عمیق، از این شبکه ها استفاده می‌شود.شبکه ما از ۴ لایه ی کانولوشنالی و پولینگ بعد از هر کدام، یک لایه متراکم (Dense) پنهان و یک لایه متراکم برای لایه خروجی که دارای یک نورون است استفاده می‌کنیم.تابع فعال سازی لایه آخر sigmoid است. در پیاده سازی مدل برای تشخیص اعداد دست نویس دیتاست هدی، ما در لایه آخر از تابع softmax استفاده کردیم. با تابع softmax خروجی نورون های لایه آخر به صورتی می‌شود که مقدار هر کدام عددی بین ۰ و ۱ است و مجموع همه برابر یک خواهد بود. این تابع برای لایه آخر مسائل طبقه بندی به کار می‌رود.در این مسال مابه جای استفاده از دو نورون با تابع softmax از یک نورون با تابع sigmoid استفاده می‌کنیم. این تابع عددی بین ۰ و ۱ برمی‌گرداند. چون تنها دو کلاس داریم، مقدار یکی از نورون ها برابر اختلاف دیگری با عدد ۱ است. پس می‌توانیم عدد ۰ را متناظر با یکی از کلاس ها (مثلا گربه)‌ و عدد ۱ را متناظر با کلاس دیگر (سگ) قرار دهیم. در این صورت به جای دو نورون در لایه خروجی، با یک نورون همان کار را انجام می‌دهیم.

نگاهی به ابعاد و تعداد اطلاعات در هر یک از لایه های شبکه می‌اندازیم.نگاهی به ابعاد و تعداد اطلاعات در هر یک از لایه های شبکه می‌اندازیم.

چون این مساله تنها دو کلاس داریم، از تابع binary_crossentropy برای محاسبه میزان خطا استفاده می‌کنیم. با توجه به اینکه تعداد تصاویر یکسانی از سگ و گربه برداشته ایم معیار Accuracy معیارمناسبی برای ارزیابی خواهد بود.

پیش پردازش داده (Data preprocessing)

مراحل آماده سازی تصاویر برای شروع عملیات یادگیری:

  1. خواندن تصویر
  2. تبدیل فرمت jpeg به پیکسل های RGB
  3. تبدیل آن به tensor (آرایه چند بعدی) از اعداد حقیقی
  4. نرمال کردن اعداد (تبدیل بازه ۰ تا ۲۵۵ به بازه ۰ تا ۱)

به لطف ابزار های کتابخانه کراس، تمام این مراحل به راحتی انجام می‌شود. کافی است کلاس ImageDataGenerator را از keras.preprocessing.image ایمپورت کرده، آدرس فولدر ها، ابعاد تصاویر ورودی، نوع طبقه بندی و اندازه batch را مشخص کنیم و از کلاس های ایجاد شده برای یادگیری و ارزیابی مدل استفاده کنیم.

اطلاعات بیشتر در مستندات Keras :

https://keras.io/preprocessing/image/

اگر بخواهیم نگاهی به خروجی کلاس های generator بیاندازیم خواهیم دید در هر گام پیمایش، آن ها یک دسته(batch) از تصاویر رنگی ۱۵۰ در ۱۵۰ پیکسل (3, 150, 150, 20) و به تعداد تصاویر، عنوان آن ها را (۰ برای گربه و ۱ برای سگ) برمی‌گرداند. با ادامه پیمایش این روند به تعداد نامحدود تکرار می‌شود.

 

آموزش مدل (fitting model)

حالا نوبت آموزش مدل می‌شود. برای این کار به جای تابع fit از تابع fit_generator استفاده می‌کنیم که همان  کار را انجام می‌دهد ولی با generator ها کار می‌کند. این تابع برای اولی ورودی یک generator مانند آنچه  ساختیم می‌گیرد و با آن مدل را تغذیه می‌کند. چون generator ها بدون اطلاع از تعداد تصاویر، مدام  خروجی ها را برمی‌گردانند، باید به گونه ای تعداد گام های پیمایش را به ازای هر دوره(epoch) مشخص کنیم. پس علاوه بر generator باید مقدار ورودی steps_per_epoch را هم به تابع بدهیم. چون تعداد تصاویر ۲۰۰۰ تا و اندازه هر تکه ۲۰ است، ما برای هر دوره به ۱۰۰۰ گام برای پیمایش نیاز داریم.

مقدار validation_steps با توجه به نسبت تصاویر آموزشی و ارزیابی مشخص می‌شود. چون در این مساله  ما ۱۰۰۰ عکس آموزشی و ۵۰۰ عکس برای ارزیابی داریم، به ازای هر دو گام آموزش، یک بار ارزیابی مدل  صورت می‌گیرد. پس تعداد گام های ارزیابی در هر دوره، نصف گام های آموزش است. پس این مقدار را برابر  ۵۰ قرار می‌دهیم.

حالا نمودار میزان خطا و میزان دقت را در طول آموزش رسم می‌کنیم.

این تصاویر نشان دهنده وقوع overfitting است. دقت اطلاعات آموزشی ما به نزدیک ۱۰۰٪ رسیده ولی دقت  اطلاعات ارزیابی بعد از ۵ دوره به حدود ۷۰٪ رسیده و بعد از آن تغییری نکرده. چون تعداد تصاویر ما کم است  و شبکه اطلاعات را حفظ کرده و قدرت عمومیت بخشی ندارد.

شبکه با Dropout

برای جلوگیری از این اتفاق روش Dropout را امتحان می‌کنیم.

حالا دوباره نمودار های دقت و خطا را بررسی می‌کنیم.

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

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

 

کدها برگرفته از فصل دو کتاب Deep Learning with Python و گیت هاب نویسنده کتاب و توسعه دهنده  کراس François Chollet است.

بررسی مقدماتی شبکه های کانولوشنالی


یکی از وظایف پایه در مبحث بینایی ماشین Image Classification می باشد. در ادامه با چالش های عکس در این زمینه آشنا می شوید.

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

viewpoint variation : یکی دیگر از چالش ها، اختلاف بین زاویه های مختلف یک شیء می باشد.

Illumination : نورپردازی های مختف کار تشخیص شیء را دچار چالش می کند.

Deformation : حالت های مختلف یک شیء و تغییر حالت آن از دیگر مشکلات این فیلد می باشد.

Occlusion : ناقص بودن یک شیء ممکن است مدل را برای تشخیص دچار مشکل کند.

Background clutter : هم شکلی با محیط کار تشخیص شیء از محیط را دشوار تر می کند.

Intraclass variation : تنوع یک دسته شیء هم از دیگر چالش های این حوزه محسوب می شود.

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

 

محوریت ساخت مدل:

  • Collect a dataset of images and labels (جمع آوری عکس ها و لیبل ها)
  • Use Machine Learning to train an image classifier (آموزش مدل)
  • Evaluate the classifier on a withheld set of test images (ارزیابی مدل)

یک مدل ساده بر روی دیتاست هدی

طبقه بند چند لایه softmax

 

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

 

تعیین داده‌های آموزشی، سایز mini-batch و تعداد epoch

 

نکته : مدل ساخته شده بعد از مدتی (چندبار دیدن عکس ها) شروع به حفظ دیتاست و ساخت توابع پیچیده میکند که باعث ایجاد مشکلی به نام overfitting می شود.


شبکه های کانولوشنی

تا قبل از سال 2012 تصور بر این بود که تعداد لایه های درونی را نباید بیش از 2 تا نشود که میزان خطا بالاتر تر نرود این بدلیل استفاده از تابع activation ناکارآمد sigmoid بود که با معرفی و استفاده از تابع ReLu و بالاتر رفتن تعداد لایه ها میزان خطا کمتر شد.

ایده ایجاد شبکه های کانولوشنی

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

Padding

لبه ها به اندازه پیکسل های درونی در کانولوشن شرکت نمی کنند درنتیجه خروجی کوچک می شود ( اگر تعداد لایه های کانولوشنی زیاد باشد حجم زیادی از دیتا از بین میرود )

با اضافه کردن مقادیری در اطراف عکس ورودی سعی در شرکت بیشتر لبه ها در این عمل داریم که به آن padding می گویند.

اگر در اطراف عکس مقدار 0 گذاشته شود zero-padding انجام داده ایم.

 

انواع کانولوشن

Valid : اگر از سایز ورودی با سایز خروجی برابر نباشد در حقیقت کانولوشن valid انجام داده ایم (اگر ورودی n*n و سایز فیلتر f*f باشد خروجی (n-f+1)*( n-f+1) می شود

Same : اگر به مقداری padding بدهیم که سایز ورودی با سایز خروجی یکی شود کاولوشن same خواهد بود) اگر ورودی n*n و سایز فیلتر f*f باشد و به اندازه p واحد padding بدهیم خروجی (n+2p-f+1)*( n+2p-f+1)  یا همان n*n می شود.

* نکته: برای اینکه کانولوشن same شود باید به اندازه 2/(f-1) به عکس ورودی padding بدهیم

* نکته: سایز فیلتر باید فرد در فرد باشد

Stride : مقدار جابجایی فیلتر به صورت افقی (چندتا چندتا جلو بره)

نکته : اگر ورودی n*n و سایز فیلتر f*f باشد و به اندازه p واحد padding بدهیم و stride s داشته باشیم خروجی

[( n+2p-f)/s+1]*[( n+2p-f)/s+1]   می شود(اگر عدد رند نشد به سمت پایین گرد میکنیم)

parameter : پارامتری که در فرایند training مشخص می شود و تابع cost بر اساس آن بهینه می شود ( مانند وزن های شبکه)

Hyper parameter : پارامتری که با فرآیند training بدست نمی آید ( مانند k در k nearest neighbor، مقدار stride)

 

کانولوشن چند بعدی

در این نوع کانولوشن باید بعد هم عمق با ورودی باشد یعنی اگر ورودی 6*6*3(یک عکس RGB 6*6) باشد، فیلتر میتواند 3*3*3 باشد.

 

 

* نکته: در این مثال از یک فیلتر استفاده کردیم پس بعد سوم خروجی 1 است یعنی خروجی 1*4*4 است (بعد خروجی = تعداد فیلتر استفاده شده)

* نکته: مقادیر مرکزی کانولوشن هر بعد با هم جمع می شود و bias نیز به آن اضافه می شود

** مثال: با 10 فیلتر 3*3*3 تعداد پارامتر آن لایه چقدر می شود؟   ((3*3*3)+1)*10 = 280

 

** مثال:


در شبکه های عصبی کانولوشنالی از لایه های conv  و pool  به شکل زیر استفاده میکنیم :

همان طور که مشاهده می کنید قبل از اولین لایه Dense یا fully connected همیشه از متد flatten استفاده میشود تا نرون ها به صورت یک وکتور در بیایند.

در لایه آخر نیز اگر خروجی مدل ما باینری باشد میتوان از activation=sigmoidاستفاده کرد اما اگر خروجی مدل چند حالت مختلف باشد مثل مدل بالا که برای هدی هست و 10 تا خروجی دارد از softmax استفاده شده.

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

تصاویر مجموعه داده هدی در تابعی که قبلا نوشته ایم، load_hoda به صورت flat شده و یک وکتور در آمده اند.
در این فراخوانی طول و عرض تصاویر 28 قرار داده شده است، پس خروجی این تابع وکتورهای 784 تایی است.
دقت کنید که قبل از ورودی شبکه کانولوشنالی تصویر را به شکل اصلی خود یعنی 28×28 برگردانده ایم.
همچنین چون تصاویر سیاه و سفید است تعداد کانال تصویر را 1 قرار داده ایم.

 

با دستور ()model.summary ورودی و خروجی هر لایه را میبینیم :

همانطور که مشاهده میکنید با هر بار conv گرفتن پارامتر های جدیدی به دست می آید که میتوانند با تابع cost بهینه شوند.

لایه dropout هم هر بار تعدادی از نرون ها را میکشد برای جلوگیری از پدیده overfitting .

و با هر بار pooling همان طور که مشاهده میکنید پارامتری برای آموزش نمی دهد و تنها دو هایپر پارامتر s و f دارد و تنها ابعاد داده را کوچکتر میکند با ازبین بردن برخی جزییات از طرق ماکسیمم گیری،میانگین گیری و ….

اجرای نوت‌بوک‌ها تحت وب توسط سرویس Azure notebook

سرویس Microsoft Azure Notebooks یک Interactive Notebook یا یک محیط آنلاین برنامه‌نویسی پویا (interactive) قدرت گرفته از Jupyter است که زبان‌های پایتون، R و #F را پشتیبانی‌می‌کند.

مزیت این سرویس نسبت به سرویس‌های مشابه مثل mybinder و یا حتی repl.it ؛ در دسترس بودن برای همه کاربران و از پیش نصب بودن تعداد زیادی از پکیج‌های مورد نیاز برای انواع زمینه‌ها است. همچنین این سرویس یک ترمینال برای مدیریت و کار با فایل‌های نوت‌بوک در اختیار هر کاربر می‌گذارد و هر کاربر ۴ گیگابایت فضای مموری و ۱ گیگابایت فضای ذخیره‌سازی فایل برای هر نوت‌بوک به صورت رایگان در اختیار دارد.

این سرویس امکان ساخت نوت‌بوک و یا کلون‌کردن (کپی‌کردن) یک ریپوزیتوری گیت که دارای نوت‌بوک است و اجرای آن تحت وب را به کاربران می‌دهد. برای اینکار تنها داشتن یک ایمیل در یکی از سرویس‌های مایکروسافت مثل outlook و یا hotmail کافیست.

 

در ادامه موارد زیر را بررسی می‌کنیم:

  • نحوه ورود و اجرای نوت‌بوک‌ها در Azure notebook و ایجاد یا کلون کردن یک نوت‌بوک
  • نصب پکیج‌ها داخل نوت‌بوک‌ها یا توسط ترمینال

 

ورود، ایجاد یا کلون و اجرای نوت‌بوک‌ها

  • پس از ورود -توسط ایمیل مایکروسافتی (outlook یا hotmail)- برای دسترسی به نوت‌بوک‌ها وارد قسمت Libraries (از گزینه‌های بالای صفحه) می‌شویم تا لیست نوت‌بوک‌ها فعلی نمایش داده شود.
  • برای ساخت و یا کلون کردن نوت‌بوک روی گزینه New Library + کلیک می‌کنیم. حال برای کلون کردن ریپازیتوری کلاس در گیت‌هاب وارد تب From GitHub شده و آدرس آن را در فیلد اول و نام دلخواه خود برای نوت‌بوکی که ساخته خواهد شد را در فیلد دوم و آدرس دلخواهمان برای دسترسی به این نوت‌بوک را در فیلد سوم وارد می‌کنیم.
  • پس از پایان عملیات کلون کردن (مدتی طول می‌کشد) وارد کتابخانه کلون شده می‌شویم و نوت‌بوک‌ها با انتخاب آنها در دسترس هستند.
  • اگر سرور اجرای نوت‌بوک‌ها روشن نباشد با انتخاب یکی از نوت‌بوک‌ها روشن شده و پس از مدتی نوت‌بوک اجرا شده و همانند یک ژوپیتر نوت‌بوک که در کامپیوتر اجرا می‌کردیم، تحت وب قابل استفاده است.
  • با باز کردن نوت‌بوک پنجره‌ای برای انتخاب کرنل مورد نیاز برای این نوت‌بوک باز خواهد شد. البته کرنل را می‌توان بعدا از طریق تب Kernel داخل خود نوت‌بوک هم تغییر داد.
  • در ویدئو برای تست نوت‌بوک و کرنل آن سه کتابخانه openCV، Tensorflow و Keras در نوت‌بوک import شده و ورژن آنها بررسی و چاپ شد.
کلون‌کردن نوت‌بوک‌ها از طریق کلیک روی دکمه launch | azurenb در ابتدای هر نوت‌بوک نیز قابل انجام است.

نصب پکیج

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

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

نصب پکیج از داخل نوت‌بوک

  • در داخل نوت‌بوک‌ها با استفاده از اوپراتور «!» در ابتدای خط هر سلول می‌توان دستوری را از داخل نوت‌بوک روی کرنل سیستم‌عامل سرور اجرا کرد و خروجی آن را داخل نوت‌بوک مشاهده کرد. برای امتحان این موضوع دستور cal (کوتاه کلمه calendar) استفاده شد که یک تقویم کوتاه را نمایش می‌دهد.
  • همانطور که دستور cal که یک دستور محیط ترمینال ([terminal [bash) است داخل نوت‌بوک قابل دسترسی است؛ دستورات pip یا conda که برای نصب پکیج‌ها استفاده می‌کنیم هم در دسترس هستند.
  • برای امتحان در دسترس بودن این دو دستور لیست پکیج‌های نصب شده توسط هر دو برنامه با دستورهای pip list و conda list چاپ شد.
  • همچنین برای مثال نصب پکیج، پکیج cowsay از داخل خود نوت‌بوک نصب و بلافاصله قابل import کردن و استفاده شد.

نوت‌بوک توضیحات

نکته مهم در حذف پکیج از داخل نوت‌بوک

از آنجایی که از داخل نوت‌بوک‌ها امکان دادن ورودی (input) به برنامه در حال اجرا روی ترمینال (مثلا هنگام نصب پکیج توسط pip) وجود ندارد و اگر برای حذف یک پکیج نیاز به تایید یا ورود هر نوع اطلاعاتی از سمت کاربر باشد عملیات به صورت کامل انجام نمی‌شود باید از فلگ (flag) یا تنظیم q- به همراه دستور pip استفاده کرد.

نصب پکیج توسط ترمینال

  • هر نوت‌بوک به صورت مجزا ۴ گیگ رم و ۱ گیگ فضای ذخیره‌سازی در اختیار دارد. به علاوه می‌توان به صورت مستقیم از طریق ترمینال به مدیریت و کنترل محیط اختصاصی (Environment / container) نوت‌بوک بر روی سرور پرداخت.
  • ترمینال از طریق دکمه Terminal در صفحه کتابخانه نوت‌بوک‌ها در دسترس است.
  • برای تست ترمینال مشخصات سرور چاپ شد.
  • بر اساس کرنل انتخاب شده برای نوت‌بوک، کرنل پایتون در مسیر جداگانه‌ای مطابق زیر قرار دارد:
    • کرنل python 2.7 :
      مسیر anaconda2_501/~
    • کرنل python 3.5 :
      مسیر anaconda3_420/~
    • کرنل python 3.6 :
      مسیر anaconda3_501/~
  • باید به این نکته توجه کرد که پایتون داخل نوت‌بوک با پایتونی که داخل ترمینال نصب است متفاوت است و در نتیجه برنامه‌های آنها مخصوصا pip و conda که ما نیازشان داریم هم متفاوت هستند؛ چراکه پایتون محیط ترمینال آن پایتونی است که روی سرور نصب است اما پایتونی که به عنوان کرنل نوت‌بوک استفاده می‌شود در مسیری همانند آنچه بالا گفته شد قرار دارد.
  • برای بررسی نکته بالا با استفاده از دستور which و اجرای which pip مسیر برنامه pip درون نوت‌بوک و درون ترمینال چاپ شد که مشاهده می‌شود درون نوت‌بوک pip از درون دایرکتوریanaconda3_501 و درون ترمینال از دایرکتوری دیگری اجرا می‌شوند.
  • برای دسترسی به برنامه pip یا conda ای که پکیج‌های نوت‌بوک را مدیریت می‌کند می‌توان به دو صورت عمل کرد:
    • اجرای مستقیم این برنامه‌ها از مسیر نصبشون به این صورت که بجای دستور pip یا conda می‌نویسیم : [anaconda3_501/bin/[pip or conda/~
    • همچنین می‌توان آدرس این برنامه‌ها را به متغیر (Environment Variable) ای به نام PATH اضافه کنیم تا به راحتی و تنها با نوشتن pip  یا conda در دسترس باشند. برای اینکار با وارد کردن دستور export PATH=~/anaconda3_501/bin:$PATH مسیر برنامه‌های نصب شده پایتون درون فولدر anaconda3_501 (این فولدر باید بر اساس کرنل انتخاب شده برای نوت‌بوک انتخاب شود) به متغیر PATH اضافه شده و برنامه‌های pip و conda (و دیگر برنامه‌ها را) تنها با اسمشان قابل اجرا می‌کند.
  • در ادامه برای استفاده آتی ابتدا یک جمله از شکسپیر درون فایلی نوشته شد.
  • سپس در ترمینال برای مثال نصب پکیج توسط ترمینال، پکیج lolcat نصب شد.
  • همچنین با استفاده از lolcat جمله‌ای از شکسپیر که درون فایل ذخیره شده بود چاپ شد.

نوت‌بوک توضیحات

 

آپدیت

با کلون کردن یک ریپازیتوری و اجرای نوت بوک‌های آن، تغییرات روی ریپازیتوری شامل اضافه شدن فایل‌ها، تغییر در آنها و … درون کتابخانه سرویس Azure به صورت خودکار بروز رسانی نمی‌شود. برای اینکار نیاز است تا با استفاده از git خودمان این کتابخانه (که در واقع کلونی از کتابخانه روی GitHub) است را بروز رسانی کنیم.

برای اینکار به این صورت عمل می‌کنیم که ابتدا ترمینال ریپازیتوریمون رو باز می‌کنیم (بالاتر نحوه باز کردنش توضیح داده شده) و سپس با دستور زیر به پوشه library که پوشه‌ای است که فایل‌های کلون شده از گیت‌هاب قرار داده شده اند میرویم:

→ cd library

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

 git status →

همونطور که مشاهده می‌کنید تغییراتی درون فایل بعضی نوت‌بوک‌ها داده شده است که در قسمت Changes not staged for commit ذکر شده‌اند و فایل‌هایی جدید ایجاد شده‌اند که در قسمت Untracked files مشخص شده‌اند. لازم است قبل از بروزرسانی ریپازیتوری این تغییرات (فایل‌هایی که تغییر کرده‌اند) commit شده [در مورد این کار بخوانید] یا فایل‌ها به حالت اول برگردند (تغییرات آنها پاک شود) که اگر تغییرات داده شده روی نوت‌بوک‌ها مهم نیستند بهتر است همینکار را بکنیم. دلیل این‌کار این است که در طی بروز رسانی ریپازیتوری از منبع آن در گیت‌هاب تغییرات داده شده از دست نرفته و حتی بعدا قابل انتقال به دیگر نسخه‌‌های این ریپازیتوری باشند.

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

→ git checkout .

در دستور بالا به دات (. یا نقطه) در انتهای دستور دقت کنید. این نقطه به معنی اعمال checkout -در نظر نگرفتن تغییرات- به همه فایل‌های modified (فایل‌های تغییر کرده یا همان فایل‌هایی که در تصویر قبلی لیست شده بودند) است.

حال همانطور که از اجرای دوباره دستور git status مشخص است، تغییراتی که در فایل‌ نوت‌بوک‌ها داده بودیم حذف شده اند و نام هیچ فایلی در قسمت Changes not staged for commit ذکر نشده است.

در ادامه برای گرفتن آخرین تغییرات از ریپازیتوری گیت‌هاب و اضافه کردن آنها به ریپازیتوری فعلیمون مطابق تصویر از دستور زیر استفاده می‌کنیم:

→ git pull

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

نصب کتابخانه Keras بر پایه ی کتابخانه TensorFlow

سلام به همگی دوستان، سعی میکنم خیلی کوتاه و مختصر توضیح بدم تا وقت بیهوده برای خوندن مطلب از دست ندید.

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

* برای شروع حتما نسخه 64 بیتی پایتون های 3.6 و یا 3.5 را نصب کنید. (آیا پایتون من 64 بیتی است؟)


نصب مبتنی بر CPU : 

نصب تنسرفلو به کمک Pip :

نصب تنسرفلو  به کمک Conda :

 

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

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

نصب ابزار های مورد نیاز :

و در نهایت نصب کراس به کمک Pip :

نصب کراس به کمک Conda :

آیا کراس من نصب شده است؟ برای اطمینان این کد را اجرا و از نصب درست کتابخانه مطمئن شوید.

In :

Out :

 

 


نصب مبتنی بر GPU : 

برای اینکه بتونیم محاسبات رو با کارت گرافیک خودمون انجام بدیم نیاز به کارت گرافیک NVIDIA هست که در ادامه متوجه خواهید شد آیا شما می توانید از این روش استفاده کنید یا خیر!

 

نصب ابزار CUDA (پیش نیاز) :

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

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

Windows + R > control /name Microsoft.DeviceManager >  Display Adapters

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

سپس حتما نسخه 9.0 را دانلود و نصب نمایید و آدرس آن را در %PATH% قرار دهید. (لینک)

* مشکل در نصب : به این لینک مراجعه کنید.

نصب ابزار cuDNN (پیش نیاز) :

حتما نسخه 7.0 را دانلود و نصب نمایید و آدرس آن را در %PATH% قرار دهید. (لینک)

* توجه : حتما نسخه ذکر شده را نصب کنید و از وجود فایل cuDNN64_7.dll مطمئن شوید!

* مشکل در نصب : به این لینک مراجعه کنید.

نصب تنسرفلو به کمک Pip :

نصب تنسرفلو  به کمک Conda :

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

به زودی تکمیل می شود ..


محیط مجازی (virtualenv) : 

به طور خلاصه، برای جدا و ایزوله سازی وابستگی های یک پروژه از سایر پروژه ها از این قابلیت استفاده می شود. در ادامه به کمک این امکان، یک ورژن خاص از پایتون را بر روی محیط مجازی خودمون نصب می کنیم. (راه حلی برای نصب تنسرفلو از طریق کوندا بر روی پایتون 3.5 در حین داشتن ورژن 3.6)

* توجه : قبل از این عملیات ها، ورژن پایتون مورد استفاده خود را نصب نمایید.

نصب ابزار virtualenv :

ایجاد محیط جدید :

فعال کردن محیط در لینوکس :

 

فعال کردن محیط در ویندوز :

 

تبریک! حالا شما می تونید پکیج های مورد نظر خودتون رو در محیط ایجاد شده بدون ایجاد هیچگونه اختلالی در محیط های دیگر نصب نمایید.

برای deactive کردن، حذف و سایر اطلاعات مربوطه به این منبع مراجعه کنید.


  محیط مجازی در کوندا (virtualenv) : 

ایجاد محیط جدید :

فعال کردن محیط در لینوکس :

فعال کردن محیط در ویندوز :

حال می توانید پکیج های خود را بر روی محیط جدید نصب کنید.

نصب مستقیم پکیج در هنگام ساخت محیط جدید (راه دوم)

نصب ادیتور مخصوص محیط جدید

حال شما ادیتور لازم در کوندا و برای محیط جدید خودتون رو ایجاد و باز کرده اید

* توجه : در صورت عدم دسترسی cmd را در مود administrator باز کنید.

برای deactive کردن، حذف و سایر اطلاعات مربوطه به این منبع مراجعه کنید.

 


لینک منبع تنسرفلو : https://www.tensorflow.org/install/#pip_installation_on_windows

لینک منبع کراس : https://www.pyimagesearch.com/2016/11/14/installing-keras-with-tensorflow-backend/