خانه > مقالات آموزشی > یادگیری ماشین جذاب است! – قسمت سوم: یادگیری عمیق و شبکه های عصبی کانولوشنی

یادگیری ماشین جذاب است! – قسمت سوم: یادگیری عمیق و شبکه های عصبی کانولوشنی

آیا از اینکه خبر ها و داستان های بی پایانی در مورد یادگیری ماشین می خوانید ولی آن ها را متوجه نمی شوید، خسته شده اید؟ بیایید این موضوع را تغییر دهیم!

اینبار قرار است که یاد بگیریم چگونه برنامه هایی بنویسیم که با استفاده از یادگیری ماشین، اشیا را در تصاویر تشخیص بدهند. به بیان دیگر قرار است  جادوی سیاهی را توضیح دهیم که به Google Photos اجازه می دهد تا تصاویر شما را بر اساس آنچه درون تصاویر است، جستجو کند.

تشخیص اشیا گوگل
امروزه گوگل به شما اجازه می دهد تا تصاویر خودتان را با شرح آن جستجو کنید، حتی اگر آن ها برچسب گذاری نشده باشند! این چطور ممکن است؟؟

دقیقا مثل قسمت اول و قسمت دوم، این راهنما برای کسانی است که درمورد یادگیری ماشین کنجکاو هستند ولی نمی داند از کجا شروع کنند. این هدف برای هر کس قابل دسترسی است؛ به این معنی که کلی گویی های زیادی انجام می دهیم و از گفتن خیلی از جزئیات خودداری می کنیم. ولی چه کسی اهمیت می دهد؟ اگر این مطلب همه را به یادگیری ماشین مشتاق کند، پس به هدف خود رسیده ایم!

(اگر قبلا قسمت اول و قسمت دوم را نخوانده اید، الان آنها را بخوانید.)

تشخیص اشیا با یادگیری عمیق

کمیک xkcd یادگیری ماشین تشخیص اشیا
کمیک Xkcd قسمت ۱۴۲۵ (تصویر اصلی)

احتمالا کمیک های معروف Xkcd را قبلا دیده باشید.

موضوع بر پایه این نظریه است که یک بچه سه ساله هم می تواند تصویر یک پرنده را تشخیص دهد ولی فهمیدن اینکه چگونه کامپیوتر اشیا را تشخیص می دهد، بیش از۵۰ سال است که دانشمندان را سردرگم کرده است.

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

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

نمونه آغازی

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

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

یادگیری ماشین دیاگرام ترکیبی

و همچنین ما این را نیز می دانیم که یادگیری ماشین همان الگوریتم های عمومی هستند که می توانند برای حل کردن مشکلات مختلف توسط داده های مختلف، دوباره استفاده شوند. خب بیایید همین شبکه عصبی را تغییر دهیم تا متن دست نویس را تشخیص دهد. ولی برای اینکه این کار را ساده تر کنیم، ما فقط تلاش خواهیم کرد تا یک عدد را تشخیص دهد، شماره ۸.

یادگیری ماشین فقط زمانی کار می کند که شما داده را داشته باشید؛ ترجیحا داده های زیادی هم داشته باشید. خب، ما برای شروع به تعداد بسیار زیادی عدد ۸ دست نویس نیاز داریم. خوشبختانه محققان مجموعه دادهMNIST  از اعداد دست نویس را برای این منظور ایجاد کرده اند.MNIST  شامل ۶۰۰۰۰ تصویر از ارقام دست نویس که هر کدام در ابعاد ۱۸در ۱۸می باشند، تهیه می کند. اینجا بعضی نمونه ها از اعداد ۸ از مجموعه داده نشان داده شده است :

یادگیری ماشین تصاویر اعداد 8 مجموعه داده MNIST
بعضی اعداد دست نویس ۸ از مجموعه داده MNIST

اگر در آن مورد دقیق فکر کنید، می بینید که همه چیز عدد است.

شبکه عصبی که ما در قسمت دوم ساختیم، با استفاده از ۳ عدد به عنوان ورودی ساخته شد. (۳اتاق،  2000 متر مربع مساحت وغیره). ولی ما الان می خواهیم عکس ها را با شبکه عصبی خود پردازش کنیم. چگونه می توانیم به جای اعداد، عکس را در شبکه عصبی وارد کنیم؟

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

یادگیری ماشین تبدیل عدد 8 به آرایه اعداد

برای  اینکه یک عکس را در شبکه عصبی قرار دهیم، ما به سادگی با عکس پیکسل ۱۸ در ۱۸ مانند یک آرایه ۳۲۴ عددی رفتار می کنیم :

یادگیری ماشین آرایه عددی 8

برای رسیدگی و مدیریت ۳۲۴ ورودی، ما فقط سیستم عصبی خود را برای داشتن ۳۲۴ گره ورودی، گسترش خواهیم داد:

یادگیری ماشین شبکه عصبی تشخیص عدد 8

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

شبکه عصبی ما بسیار بزرگتر از قبلی می باشد.( ۳۲۴ ورودی به جای ۳ ورودی).ولی هر کامپیوتر مدرن دیگری می تواند یک شبکه عصبی  را با صد ها گره را در یک چشم به هم زدن، مدیریت کند. این شبکه حتی به خوبی می تواند روی گوشی تلفن همراه شما هم کار کند.

تنها کاری که باقی مانده است این است که شبکه عصبی را با اعداد ۸ و غیر ۸ آموزش دهیم تا یاد بگیرد که آن ها را از هم جدا کند. زمانی که ما عدد ۸ را در شبکه عصبی قرار دهیم، خواهیم گفت که احتمال اینکه عکس عدد ۸ باشد، ۱۰۰ درصد است و احتمال اینکه ۸ نباشد، صفر درصد خواهد بود. برای عکس هایی که مثال نقض هستند برعکس خواهد بود.

اینجا بعضی از داده های آموزش ما را می بینید :

یادگیری ماشین داده های آموزش اعداد دست نویس MNIST
داده های آموزش جذاب و شیرین!

ما می توانیم این مدل از شبکه های عصبی را در دقایق کمی روی یک لپ تاب مدرن آموزش دهیم. وقتی که انجام شد، ما یک شبکه عصبی خواهیم داشت که می تواند تصویرهای  اعداد ۸ را با دقت بالایی تشخیص دهد. به دنیای تشخیص تصویر خوش آمدید (حدود دهه ۸۰ میلادی) !

دید تونلی

این بسیار خوب است که به سادگی با قرار دادن پیکسل ها در شبکه عصبی، توانستیم یک سیستم تشخیص تصویر بسازیم. یادگیری ماشین یک جادوست!…درسته؟

خب به آن سادگی که فکر می کنید نیست.

اول خبر خوب، اینکه شناسنده ی عدد ۸ ما روی عکس های ساده ای که حرف، دقیقا وسط عکس قرار گرفته باشند، واقعا خوب کار می کند:

تست شبکه عصبی ساده تشخیص 8

ولی حالا خبرهای بد:

شناسنده ی عدد ۸ ما وقتی که حرف به خوبی مرکز عکس نشده باشد، تقریبا از کار می افتد. فقط یک تغییر کوچک موقعیت، همه چیز را خراب می کند:

مشکل شناسنده عدد 8

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

این سیستم در دنیای واقعی زیاد مفید نیست. مسائل دنیای واقعی هیچ وقت در آن حد واضح و ساده نیستند. خب ما نیاز داریم تا متوجه شویم چگونه می توانیم شبکه عصبی خود را طوری بسازیم که  در مواردی که عدد ۸ به خوبی وارد نشده است، درست کار کند.

ایده ی خشن  ۱ : جستجو با یک پنجره شناور

ما قبلا یک برنامه بسیار خوب برای پیدا کردن عدد ۸ که مرکز یک عکس باشد، ساخته ایم. چه می شود اگر همه ی اطراف عکس را اسکن کنیم تا عددها ۸ احتمالی را در بخش های کوچک تری پیدا کنیم، یک بخش در هر زمان، تا زمانی که یکی را پیدا کنیم؟

شناسایی عدد 8 با پنجره شناور

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

ایده ی خشن ۲ : داده ی بیشتر و شبکه ی عصبی عمیق

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

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

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

با استفاده از این تکنیک، ما می توانیم یک مخزن بی پایان از داده آموزشی را داشته باشیم.

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

برای بزرگتر کردن شبکه، ما فقط لایه هایی بر لایه های گره ها اضافه می کنیم :

شبکه عصبی تشخیص عدد 8 با داده های مصنوعی

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

این ایده از اواخر سال ۱۹۶۰وجود داشته است. ولی تا چندی پیش، آموزش این شبکه عصبی بزرگ خیلی کند و ناکار آمد بوده است. ولی وقتی ما متوجه شدیم که چگونه از کارت های گرافیکی  3 بعدی (این کارت ها برای انجام ضرب ماتریس با سرعت خیلی زیاد طراحی شده اند) به جای پردازنده معمولی کامپیوتر استفاده کنیم ، کار کردن با شبکه های عصبی بزرگ به طور ناگهانی کاربردی شد. در واقع، دقیقا همان کارت گرافیکی NVIDIA GeForce GTX1080 که برای بازی Overwatch استفاده می کنید، می تواند برای آموزش شبکه عصبی فوق العاده سریع استفاده شود.

کارت گرافیک انویدیا 1080 یادگیری ماشین

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

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

باید راه هایی وجود داشته باشد که بتوان شبکه عصبی را به حد کافی هوشمند ساخت که بدون آموزش اضافی بداند که عدد ۸ در هر کجای تصویر باشد، یکسان است. خوشبختانه این راه وجود دارد!

راه حل کانولوشن است

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

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

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

زمین با چمن و بتن پوشیده شده است.

یک بچه را می بینید

بچه روی یک اسب ارتجاعی نشسته است

اسب ارتجاعی روی چمن قرار دارد

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

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

ما نیاز داریم تا شبکه عصبی را متوجه تغییر ناپذیری ترجمه کنیم. یعنی اینکه یک عدد ۸، عدد ۸ است و فرقی نمی کند کجای عکس نشان داده شود.

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

کانولوشن چگونه کار می کند؟

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

اینجا خواهیم گفت کانولوشن چگونه کار خواهد کرد. گام به گام…

گام اول : تصویر را به بخش های تصویری تداخلی بشکنید

شبیه به پنجره شناورکه در بالا بررسی کردیم، بیایید یک پنجره شناور را بر روی کل تصویر اصلی بگذرانیم و هر نتیجه را به عنوان بخش تصویری جداگانه و کوچک ذخیره کنیم :

بخش بندی تصویر شبکه عصبی کانولوشنی

با انجام این، تصویر اصلی خود را به ۷۷ بخش تصویری  کوچک با اندازه مساوی تقسیم کرده ایم.

گام دوم : هر بخش تصویری را به صورت یک شبکه عصبی کوچک در بیاورید

قبلا، ما یک تصویر را در شبکه عصبی پردازش کردیم تا ببینیم عدد ۸ وجود دارد یا نه. ما دقیقا همین کار را اینجا انجام خواهیم داد، ولی با این تفاوت که این کار را برای هر بخش تصویری انجام می دهیم :

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

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

گام سوم : نتایج هر بخش را در  آرایه ای جدید، ذخیره می کنیم.

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

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

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

گام چهارم : نمونه برداری

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

تصویر اصلی در مقایسه با آرایه ها

برای کاهش دادن اندازه این  آرایه، ما از آن با استفاده از الگوریتم حداکثر تجمع ( Max Pooling ) نمونه برداری می کنیم. عجیب به نظر می رسد ولی اصلا اینگونه نیست!

ما فقط به هر یک از مربع های ۲ در ۲ در این  آرایه نگاه می کنیم و بزرگترین عدد را نگه می داریم:

شبکه های عصبی حداکثر تجمع

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

گام آخر : پیش بینی کنیم

تا کنون، ما یک عکس بسیار بزرگ را به شکل یک  آرایه کوچک در آوردیم.

حدس بزنید که چه می شود؟ آن  آرایه فقط دسته ای از شماره ها  می باشد، خب ما می توانیم از آن  آرایه کوچک به عنوان ورودی  برای شبکه عصبی دیگری استفاده کنیم. این شبکه عصبی نهایی تصمیم خواهد گرفت که عکس مطابقت دارد یا نه. برای متفاوت ساختن آن از مرحله ی  کانولوشن ما آن را شبکه کاملا متصل ( Fully Connected ) نامگذاری می کنیم.

خب، از شروع تا پایان، پایپ لاین ( خط لوله ) ( Pipeline ) ، پنج مرحله ای ما به صورت زیر می باشد :

خط لوله شبکه عصبی کانولوشنی

اضافه کردن گام های بیشتر

پاپ لاین پردازش تصویر ما مجموعه ای از گام ها می باشد: کانولوشن ، حداکثر تجمع و در نهایت یک شبکه ی کاملا متصل.

زمانی که شما می خواهید مسائل را در جهان واقعی حل کنید، این گام ها برای هر چند بار که بخواهید، می توانند ترکیب و انباشته شوند! شما می توانید ۲، ۳ و یا حتی ۱۰ لایه ی  کانولوشن داشته باشید. و همچنین می توانید هر زمانی که می خواهید اندازه داده ها را کم کنید، حداکثر تجمع را اضافه کنید.

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

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

این جا یک شبکه ی کانولوشنی عمیق واقع گرایانه تر را می بینید (مانند آن چه که در یک مقاله ی تحقیقی پیدا کنید) :

شبکه عصبی کانولوشنی برای شناسایی پرندگان

در این مورد، آن ها با یک عکس ۲۲۴ در ۲۲۴ پیکسل شروع می کنند، کانولوشن و حداکثر تجمع دو بار اجرا می شوند، کانولوشن ۳ بار دیگر انجام می شود، سپس حداکثر تجمع اجرا می شود و بعد ۲ لایه کاملا متصل را داریم. نتیجه نهایی این است که عکس به یکی از هزار دسته، کلاسه بندی می شود!

ساختن شبکه مناسب

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

برای پاسخ به این سوال باید تعداد زیادی از آزمایش ها و تست ها را انجام دهید. شما ممکن است قبل از اینکه ساختار بهینه و پارامترهای لازم برای مساله ای که در حال حل آن می باشید، را پیدا کنید، مجبور به آموزش ۱۰۰ شبکه باشید. یادگیری ماشین با آزمون و خطا های زیادی همراه است.

ساختن کلاسه بند پرندگان ما

ما نهایتا به حد اندازه می دانیم که چگونه برنامه ای بنویسیم که بتواند تصمیم بگیرد که تصویر پرنده است یا نه.

مثل همیشه ما نیاز به تعدادی داده برای شروع داریم. مجموعه داده رایگان  CIFAR 10شامل ۶۰۰۰ تصویر پرنده و۵۴۰۰۰ تصویر دیگر که پرنده نیستند، می باشد. ولی برای به دست آوردن داده بیشتر، ما همچنین مجموعه داده یCaltech-UCSD birds 2000  2011 را اضافه خواهیم کرد که تصویر ۱۲۰۰۰ پرنده دیگر را داراست.

اینجا  تعداد کمی از پرندگان از مجموعه داده ی ترکیبی ما را می بینید:

تصاویر پرندگان مجموعه داده

و اینجا تعدادی از ۵۲۰۰۰ عکس غیر پرنده :

تصاویر غیر پرنده ی مجموعه داده

این مجموعه داده به خوبی برای رسیدن به هدف ما کار خواهد کرد، ولی ۷۲۰۰۰ عکس که کیفیت پایین دارند، هنوز هم برای برنامه های دنیا ی واقعی بسیار کوچک هستند. اگر شما عملکرد در  سطح گوگل را می خواهید، به میلیون ها عکس بزرگ نیاز دارید. در یادگیری ماشین، داشتن داده ی بیشتر تقریبا همیشه مهم تر از داشتن الگوریتم های بهتر است. الان شما می دانید که چرا گوگل بسیار خوشحال است که به شما فضای نا محدود برای ذخیره ی عکس ها را پیشنهاد می کند. آن ها از شما چیز شیرین می خواهند، داده های شیرین!

برای ساختن  کلاسه بند مان، از TFlearn استفاده خواهیم کرد. Tflearn یک کتابخانه یادگیری عمیق از تنسورفلو گوگل است که به صورت AIP ساده شده ارائه شده است. این کتابخانه ساختن شبکه عصبی کانولوشنی را به سادگی نوشتن چند خط کد برای توضیح لایه های شبکه عصبی آسان می کند.

اینجا کد برای توضیح و آموزش شبکه را می بینید:

اگر شما در حال آموزش با یک کارت گرافیک خوب با حافظه کافی هستید (مانند یک Nvidia GeForce GTX 980T و یا حتی بهتر) این شبکه در کمتر از یک ساعت برای شما انجام خواهد شد. اگر در حال آموزش با یک  cpuمعمولی هستید، ممکن است خیلی بیشتر طول بکشد.

هرچقدر که آموزش ببیند، دقت آن افزایش خواهد یافت. بعد از گذر از مرحله اول، من ۴/۷۵% دقت را به دست آوردم. بعد از عبور از ۱۰ مرحله، به ۷/۹۱% رسید. بعد از ۵۰ مرحله یا بیشتر، دقت در حدود ۵/۹۵% محصور شد و آموزش اضافی تفاوتی ایجاد نکرد. به همین خاطر من آن را در همان جا متوقف کردم.

تبریک! برنامه ما حالا می تواند پرندگان را در عکس تشخیص دهد!

آزمودن شبکه ما

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

اما برای اینکه ببینیم شبکه ما چقدر تاثیرگذار است، باید آن را با تعدادی از تصاویر بیازماییم. مجموعه داده ای که من درست کردم، ۱۵۰۰۰عکس را برای تایید اعتبار نگه داشت. زمانی که من آن ۱۵۰۰۰عکس را از طریق شبکه اجرا کردم، ۹۵%از مواقع، جواب صحیح را پیش بینی کرد.

خیلی خوب به نظر می رسد…درست است؟ البته…بستگی دارد!

۹۵% دقت چقدر دقیق است؟

شبکه ما این ادعا را دارد که ۹۵% دقت را داراست. اما این می تواند مفاهیم مختلفی داشته باشد.

برای مثال، اگر ۵ درصد از عکس های آموزش دیده ی ما پرندگان باشند و ۹۵ درصد باقی مانده پرنده نباشند، چطور می شود؟ برنامه ای که در هر زمان مشخص “پرنده نبودن” را حدس می زند، ۹۵ درصد دقیق است. ولی همچنین ۱۰۰ درصد هم بلا استفاده و نا کارآمد خواهد بود.

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

به جای اینکه به درست یا غلط بودن پیش بینی هایمان فکر کنیم، بیایید آن ها را به ۴ دسته ی مجزا تقسیم کنیم.

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

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

نتیجه ی تایید اعتبار شبکه عصبی کانولوشنی

چرا ما نتایج مان را بدین صورت به قسمت های کوچکتر شکستیم؟ زیرا همه اشتباهات به طور مساوی به وجود نیامدند.

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

به جای اینکه فقط به دقت کلی نگاه کنیم، ما معیارهای دقت ( Precision ) و بازیابی ( Recall ) را حساب کردیم. معیار های دقت و بازیابی ، به ما تصویر واضحی از اینکه  چقدر خوب کار کرده ایم، می دهد:

معیار های دقت و بازیابی

این به ما می گوید ۹۷%از زمان هایی که ما پرنده را حدس زدیم، حدسمان درست بود! اما هچنین این را هم می گوید که ما فقط ۹۰% از پرنده های واقعی را در مجموعه داده پیدا کردیم. به عبارت دیگر، ممکن است همه پرندگان را پیدا نکرده باشیم ولی ما وقتی یکی از پرنده ها را پیدا می کردیم، کاملا مطمئن بودیم.!

از اینجا به بعد چه مسیری را خواهیم رفت؟

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

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

بیشتر بخوانید :

منبع Medium
0/5 (0 نظر)

درباره‌ی احمدرضا جعفری

همچنین ببینید

شبکه های تنسور عصبی بازگشتی RNTN

یادگیری عمیق به زبان ساده : شبکه های تنسور عصبی بازگشتی – قسمت یازدهم

برخی از الگو های ذاتاً سلسله مراتبی هستند ، مانند تجزیه درختی یک جمله از …

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *