آیا از اینکه خبر ها و داستان های بی پایانی در مورد یادگیری ماشین می خوانید ولی آن ها را متوجه نمی شوید، خسته شده اید؟ بیایید این موضوع را تغییر دهیم!
اینبار قرار است که یاد بگیریم چگونه برنامه هایی بنویسیم که با استفاده از یادگیری ماشین، اشیا را در تصاویر تشخیص بدهند. به بیان دیگر قرار است جادوی سیاهی را توضیح دهیم که به Google Photos اجازه می دهد تا تصاویر شما را بر اساس آنچه درون تصاویر است، جستجو کند.
مجموعه ی یادگیری ماشین جذاب است!
دقیقا مثل قسمت اول و قسمت دوم، این راهنما برای کسانی است که درمورد یادگیری ماشین کنجکاو هستند ولی نمی داند از کجا شروع کنند. این هدف برای هر کس قابل دسترسی است؛ به این معنی که کلی گویی های زیادی انجام می دهیم و از گفتن خیلی از جزئیات خودداری می کنیم. ولی چه کسی اهمیت می دهد؟ اگر این مطلب همه را به یادگیری ماشین مشتاق کند، پس به هدف خود رسیده ایم!
(اگر قبلا قسمت اول و قسمت دوم را نخوانده اید، الان آنها را بخوانید.)
تشخیص اشیا با یادگیری عمیق
احتمالا کمیک های معروف Xkcd را قبلا دیده باشید.
موضوع بر پایه این نظریه است که یک بچه سه ساله هم می تواند تصویر یک پرنده را تشخیص دهد ولی فهمیدن اینکه چگونه کامپیوتر اشیا را تشخیص می دهد، بیش از۵۰ سال است که دانشمندان را سردرگم کرده است.
در چند سال گذشته ما نهایتا یک رویکرد خوب برای شناخت اشیا با استفاده از شبکه های عصبی کانولوشنی پیدا کرده ایم. با این گخ این عبارت به نظر می رسد که تعدادی کلمات ساختگی از داستان های علمی تخلیلی William Gibson باشد، ولی اگر شما آن ها را یکی یکی بررسی کنید نظرات کاملا قابل فهم هستند.
خب بیایید انجامش دهیم، برنامه ای بنویسیم که پرندگان را تشخیص دهد.
نمونه آغازی
قبل از اینکه یاد بگیریم که چگونه تصاویر پرندگان را تشخیص دهیم، بیایید یاد بگیریم چگونه چیزهای بسیار آسان تر مانند عدد دست نویس ۸ را تشخیص دهیم.
در قسمت دوم ما درباره ی اینکه چگونه شبکه های عصبی قادر به حل مسائل پیچیده توسط اتصال تعداد زیادی از نورون های ساده به یکدیگر هستند، یاد گرفتیم. ما یک شبکه عصبی کوچک ساختیم تا قیمت یک خانه را بر اساس اینکه چند اتاق دارد، چقدر بزرگ است و در کدام محله قرار دارد، حدس بزنیم :
و همچنین ما این را نیز می دانیم که یادگیری ماشین همان الگوریتم های عمومی هستند که می توانند برای حل کردن مشکلات مختلف توسط داده های مختلف، دوباره استفاده شوند. خب بیایید همین شبکه عصبی را تغییر دهیم تا متن دست نویس را تشخیص دهد. ولی برای اینکه این کار را ساده تر کنیم، ما فقط تلاش خواهیم کرد تا یک عدد را تشخیص دهد، شماره ۸.
یادگیری ماشین فقط زمانی کار می کند که شما داده را داشته باشید؛ ترجیحا داده های زیادی هم داشته باشید. خب، ما برای شروع به تعداد بسیار زیادی عدد ۸ دست نویس نیاز داریم. خوشبختانه محققان مجموعه دادهMNIST از اعداد دست نویس را برای این منظور ایجاد کرده اند.MNIST شامل ۶۰۰۰۰ تصویر از ارقام دست نویس که هر کدام در ابعاد ۱۸در ۱۸می باشند، تهیه می کند. اینجا بعضی نمونه ها از اعداد ۸ از مجموعه داده نشان داده شده است :
اگر در آن مورد دقیق فکر کنید، می بینید که همه چیز عدد است.
شبکه عصبی که ما در قسمت دوم ساختیم، با استفاده از ۳ عدد به عنوان ورودی ساخته شد. (۳اتاق، 2000 متر مربع مساحت وغیره). ولی ما الان می خواهیم عکس ها را با شبکه عصبی خود پردازش کنیم. چگونه می توانیم به جای اعداد، عکس را در شبکه عصبی وارد کنیم؟
پاسخ بسیار ساده است. شبکه عصبی اعداد را به عنوان ورودی می پذیرد. برای کامپیوتر، یک عکس مانند شبکه ای از اعداد است که نشان می دهد هر پیکسل چقدر تاریک است :
برای اینکه یک عکس را در شبکه عصبی قرار دهیم، ما به سادگی با عکس پیکسل ۱۸ در ۱۸ مانند یک آرایه ۳۲۴ عددی رفتار می کنیم :
برای رسیدگی و مدیریت ۳۲۴ ورودی، ما فقط سیستم عصبی خود را برای داشتن ۳۲۴ گره ورودی، گسترش خواهیم داد:
توجه کنید که شبکه عصبی ما الان دو خروجی نیز دارد.(به جای اینکه فقط یکی داشته باشد).اولین خروجی احتمال اینکه عکس عدد ۸ باشد را پیش بینی می کند و دومین خروجی احتمال اینکه ۸ نباشد را پیش بینی خواهد کرد. با داشتن یک خروجی مجزا برای هر نوع از شی که می خواهیم تشخیص دهیم، می توانیم از یک شبکه عصبی برای کلاسه بندی اشیا به گروه ها، استفاده کنیم.
شبکه عصبی ما بسیار بزرگتر از قبلی می باشد.( ۳۲۴ ورودی به جای ۳ ورودی).ولی هر کامپیوتر مدرن دیگری می تواند یک شبکه عصبی را با صد ها گره را در یک چشم به هم زدن، مدیریت کند. این شبکه حتی به خوبی می تواند روی گوشی تلفن همراه شما هم کار کند.
تنها کاری که باقی مانده است این است که شبکه عصبی را با اعداد ۸ و غیر ۸ آموزش دهیم تا یاد بگیرد که آن ها را از هم جدا کند. زمانی که ما عدد ۸ را در شبکه عصبی قرار دهیم، خواهیم گفت که احتمال اینکه عکس عدد ۸ باشد، ۱۰۰ درصد است و احتمال اینکه ۸ نباشد، صفر درصد خواهد بود. برای عکس هایی که مثال نقض هستند برعکس خواهد بود.
اینجا بعضی از داده های آموزش ما را می بینید :
ما می توانیم این مدل از شبکه های عصبی را در دقایق کمی روی یک لپ تاب مدرن آموزش دهیم. وقتی که انجام شد، ما یک شبکه عصبی خواهیم داشت که می تواند تصویرهای اعداد ۸ را با دقت بالایی تشخیص دهد. به دنیای تشخیص تصویر خوش آمدید (حدود دهه ۸۰ میلادی) !
دید تونلی
این بسیار خوب است که به سادگی با قرار دادن پیکسل ها در شبکه عصبی، توانستیم یک سیستم تشخیص تصویر بسازیم. یادگیری ماشین یک جادوست!…درسته؟
خب به آن سادگی که فکر می کنید نیست.
اول خبر خوب، اینکه شناسنده ی عدد ۸ ما روی عکس های ساده ای که حرف، دقیقا وسط عکس قرار گرفته باشند، واقعا خوب کار می کند:
ولی حالا خبرهای بد:
شناسنده ی عدد ۸ ما وقتی که حرف به خوبی مرکز عکس نشده باشد، تقریبا از کار می افتد. فقط یک تغییر کوچک موقعیت، همه چیز را خراب می کند:
این به این خاطر است که شبکه ما فقط الگو عدد ۸ را که به خوبی مرکز عکس قرار گرفته باشد به یاد دارد و هیچ نظری در این باره که یک عدد ۸ خارج از مرکز چیست، ندارد. سیستم ما دقیقا یک الگو را می شناسد، فقط و فقط یک الگو.
این سیستم در دنیای واقعی زیاد مفید نیست. مسائل دنیای واقعی هیچ وقت در آن حد واضح و ساده نیستند. خب ما نیاز داریم تا متوجه شویم چگونه می توانیم شبکه عصبی خود را طوری بسازیم که در مواردی که عدد ۸ به خوبی وارد نشده است، درست کار کند.
ایده ی خشن ۱ : جستجو با یک پنجره شناور
ما قبلا یک برنامه بسیار خوب برای پیدا کردن عدد ۸ که مرکز یک عکس باشد، ساخته ایم. چه می شود اگر همه ی اطراف عکس را اسکن کنیم تا عددها ۸ احتمالی را در بخش های کوچک تری پیدا کنیم، یک بخش در هر زمان، تا زمانی که یکی را پیدا کنیم؟
این رویکرد پنجره شناور نامیده می شود. این عمل راهکاری خشن می باشد که در بعضی موارد محدود، خوب کار می کند ولی واقعا ناکارآمد است. شما مجبور خواهید بود تا یک تصویر را برای پید اکردن اشیایی با سایزهای مختلف بارها و بارها چک کنید. ما می توانیم بهتر از این عمل کنیم!
ایده ی خشن ۲ : داده ی بیشتر و شبکه ی عصبی عمیق
ما وقتی شبکه خود را آموزش دادیم، فقط اعداد ۸ که مرکز عکس هستند را نشان دادیم. ولی اگر ما آن را با داده ی بیشتری آموزش دهیم، که شامل اعداد ۸ در موقعیت ها و اندازه های مختلف در سر تا سر عکس است، چه می شود؟
ما حتی نیازی به جمع آوری و آموزش داده جدید نداریم. ما فقط نیاز به یک اسکریپت برای تولید عکس هایی از تصاویر آموزشی قبلی با انواع موقعیت های مختلف، داریم. این یک تکنیک خیلی مهم و مفید است.
با استفاده از این تکنیک، ما می توانیم یک مخزن بی پایان از داده آموزشی را داشته باشیم.
افزایش تعداد داده ها مساله را برای شبکه ی عصبی ما سخت تر می کنند، ولی ما می توانیم آن را با بزرگتر کردن شبکه عصبی، جبران کنیم و بنابرین شبکه عصبی قادر خواهد بود تا الگوهای پیچیده ی بیشتری را یاد بگیرد.
برای بزرگتر کردن شبکه، ما فقط لایه هایی بر لایه های گره ها اضافه می کنیم :
ما این را شبکه عصبی عمیق می نامیم زیرا لایه های زیادی نسبت به یک شبکه عصبی سنتی دارد.
این ایده از اواخر سال ۱۹۶۰وجود داشته است. ولی تا چندی پیش، آموزش این شبکه عصبی بزرگ خیلی کند و ناکار آمد بوده است. ولی وقتی ما متوجه شدیم که چگونه از کارت های گرافیکی 3 بعدی (این کارت ها برای انجام ضرب ماتریس با سرعت خیلی زیاد طراحی شده اند) به جای پردازنده معمولی کامپیوتر استفاده کنیم ، کار کردن با شبکه های عصبی بزرگ به طور ناگهانی کاربردی شد. در واقع، دقیقا همان کارت گرافیکی NVIDIA GeForce GTX1080 که برای بازی Overwatch استفاده می کنید، می تواند برای آموزش شبکه عصبی فوق العاده سریع استفاده شود.
ولی با وجود اینکه ما می توانیم شبکه عصبی بسیار بزرگتر کنیم و آن را به سرعت با کارت های گرافیکی ۳ بعدی آموزش دهیم، ولی شبکه ی ما هنوز نتوانسته ما را به راه حلی برساند. ما نیاز داریم تا هوشمند تر شویم تا بدانیم چگونه عکس را در شبکه عصبی پردازش کنیم.
در این مورد بیاندیشید. منطقی به نظر نمی رسد که یک شبکه را آموزش دهید تا عدد ۸ را در بالای عکس تشخیص دهد آن هم به صورت جداگانه از عدد ۸ ی که در پایین تصویر قرار دارد به گونه ای که گویا این دو کاملا متفاوت هستند.
باید راه هایی وجود داشته باشد که بتوان شبکه عصبی را به حد کافی هوشمند ساخت که بدون آموزش اضافی بداند که عدد ۸ در هر کجای تصویر باشد، یکسان است. خوشبختانه این راه وجود دارد!
راه حل کانولوشن است
به عنوان یک انسان، شما به صورت بصری می بینید و می دانید که تصاویر، الگو یا ساختار مفهومی دارند. این تصویر را در نظر بگیرید:
به عنوان یک انسان، شما فورا الگوی این عکس را می توانید متوجه شوید:
زمین با چمن و بتن پوشیده شده است.
یک بچه را می بینید
بچه روی یک اسب ارتجاعی نشسته است
اسب ارتجاعی روی چمن قرار دارد
مهم تر از همه، ما می توانیم متوجه یک کودک شویم و فرقی ندارد که روی چه سطحی باشد. لازم نیست که کودک را برای هر سطح ممکن که می تواند روی آن ظاهر شود، دوباره بیاموزیم.
ولی تا کنون شبکه عصبی ما نمی تواند این کار را انجام دهد چون فکر می کند عدد ۸ در قسمت مختلفی از عکس، یک چیز کاملا متفاوت است. شبکه عصبی نمی تواند متوجه شود که حرکت یک شی در اطراف عکس، آن را به یک چیز متفاوت تبدیل نمی کند. به این معنی که آن باید شناسایی هر شی در هر موقعیت ممکن را دوباره یاد بگیرد.
ما نیاز داریم تا شبکه عصبی را متوجه تغییر ناپذیری ترجمه کنیم. یعنی اینکه یک عدد ۸، عدد ۸ است و فرقی نمی کند کجای عکس نشان داده شود.
ما این کار را با استفاده از فرایندی به اسم کانولوشن ( 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را امتحان کنید تا با ساختار شبکه های عصبی مختلف آشنا شوید. این کتابخانه، مجموعه داده ای از تصاویر را درون خود دارد، پس شما حتی مجبور به پیدا کردن عکس ها نیستید.
همچنین حالا شما به حد کافی می دانید تا بتوانید به یادگیری درباره ی موضوعات دیگر یادگیری ماشین اقدام کنید. چرا اکنون نحوه ی نحوه استفاده از الگوریتم ها برای آموزش کامپیوتر برای بازی کردن بازی های آتاری را نیاموزیم؟ چرا این موضوع بعدی برای یادگیری نباشد؟
بیشتر بخوانید :
- فواید هوش مصنوعی
- هوش مصنوعی اینستاگرام
- منطق فازی در هوش مصنوعی
- مخترع هوش مصنوعی
- استارگیت : نبرد غولهای تکنولوژی بر سر هوش مصنوعی فوق پیشرفته
یک نظر
دنبال کنید : 10 برنامه برتر تشخیص چهره اندروید در سال 2019 - مجله شهاب