Global & adaptive pooling

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

هایپرپارامتر هایی Pooling

  • stride
  • kernel size
  • average or max بودن تابع

درشبکه های عمیق و در لایه های fully connected پارامتر های این لایه ها  به سایز ورودی وابسته بود ولی در لایه های کانولوشنی تعداد پارامتر ها تنها به اندازه و تعداد فیلتر بستگی دارد. برای مثال وقتی مانند شکل زیر لایه آخر5 در 5 در 100 باشد (feature map تصویر) و به یک لایه fully connected صد تایی وصل میکنیم.اگر تصویر ورودی مقداری بزرگتر شود این لایه 100*5*5 تغییر می کند مثلا سایز آن 100*7*7 می شود ، پس تعداد وزن هایی که به نورون های لایه آخر وصل می شوند تغییر می کند.

مشکل : تعداد وزن های لایه flat  و fully conected

راه حل :  global average pooling(GAP)

روش کار

در مقاله [Lin et al., 2013. Network in network] به جای fully connected  ها در انتها global average pooling میزنیم تا future map ها را مستقیم به softmax وصل کنیم و از fully connected  استفاده نکنیم.

لایه آخر را pooling با kernel هم سایز  تصویر ورودی (activation map) میذاریم تا درانتها تنها یک کانال باقی بماند، یعنی طول و عرض هرچه باشد 1 شده و عمقش همان باقی می ماند. حال همین لایه را مستقیم به fully connected وصل می کنیم.

ResNet50 هم به صورت غیر مستقیم از average pooling استفاده کرده. به این صورت که لایه pooling آخرش اندازه خروجی (2048 * 1* 1) شده است ولی از  fully connected ها هم برای کلاس بندی انتهایی استفاده کرده است.

بررسی لایه های آخر  ResNet50

در لایه های انتهایی شبکه به دلیل وجود , Activation ، AveragePooling2D و لایه Dense  برای ما مهم هستند.

  • ابتدا  لایه activation  را بررسی می کنیم؛ این لایه شامل2048  نقشه فعال سازی (activation map )  که سایز آن (7 * 7) است، می باشد.در تصویر بالا k  همان تعداد activation map ها است.

k ={1, 2, 3, …., 2048}

  • لایه (GAP) AveragePooling2D   سایز هر کدام از این  activation map   ها را از (7 * 7) به (1 * 1) کاهش می دهد.
  • لایهDense  که صرفا ورودی را صاف کرده و بدون تغییر در اطلاعاتی که در لایه قبلی GAP ایجاد شده است  تنها دسته یا کلاس آن خروجی را مشخص می کند. حال برای اینکه شبکه هایی که طراحی می کنیم به سایز ورودی وابسته نباشند می توان از این لایه صرف نظر کرد و لایه GAP  را مستقیما به softmax  متصل کرد.

مزایا :

  • متناسب تر با شبکه های کانولوشنی است. زیرا با  ساختار convolution ها بیشتر دارد.  fully connected ساختار کانولوشن را به هم می ریزد. ارتباط بین دسته بندی لایه آخر و  feature map  ها حفظ می کند.
  • از overfitting جلوگیری می کند. : هیچ پارامتری برای بهینه سازی ندارد واز  overfitting  هم دراین لایه جلوگیری می کند. و می توان با کانولوشن بیشتر ، کاری کنیم عمق افزایش یافته و داده کمتری از دست برود.
  • به جابجایی حساس نیست. : نسبت به جابجایی های تصویر عملکرد بهتری دارد. مثلا شبکه ایی برای شناسایی سگ داریم و دیگر جایگاه سگ در هرجای تصویراهمیتی ندارد.

 

استفاده از global average pooling   در framework  های مختلف

در keras کد global average pooling  به صورت زیر است که تنها dataform را میگیرد و سایز ورودی نمی خواهد چون نسبت به سایز activation map سایز آن را انتخاب میکند.

 

pytorch

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

 

 

fastai

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

 

مسئله : تشخیص نژاد های مختلف سگ

دیتا شامل پوشه عکس ها و یک فایل اکسل شامل نام عکس و نژادش است.

در کد بالا آدرس پوشه عکس ها را داده خط 2 سایز ورودی را مشخص کرده در خط 3 شبکه را resnex124 تعریف کرده ایم و خط 4  batch size رو هم 58 گذاشتم.

(اگر روی gpu کارکنید و 2 یا 3 گیگ رم دارید احتمالا باید تعداد batch size   را کم کنید.)

لیبل ها را از فایل csv خونده واون label  باز کن و لیستش کن و طول اون لیست رو به ما بعده منهای یک برای جدا کردن هدر لیست  که همان تعداده داده های ماست، توسط تابع get_cv_index(n)   ایندکس های cross validation را جدا می کند اینگونه که 20 درصد index ها را برای cross validation  جدا میکند.

 

 

کد بالا نشان می دهد تا اینجا دو پوشه train و test همراه با label ها جدا شده است.

فایل csv را با پاندا خونده و 5تای اولشو نمایش می دهد.

تعداد هر کلاس را پیدا کرده ایم.

تابع pivot_table   :

 

به تابع tfms_from_model معماری ، سایز ورودی، ارگومیشن هم میخواهیم به صورت side_on ، بیشترین زوم هم 1.1 باشه بر روی تصاویر(چقدر روی عکس هربار رندوم زون کند)

تابع ImageClassifierData.from_csv می گوید از همان ساختاری که عکس های توی یک پوشه هستند و لیبل ها در  csv استفاده  کن. مسیر پوشه ها و اسم پوشه های train و test  را گرفته و اگر valdation_index  بهش پاس بدیم توی train_set اونا رو در نظر نمیگیره. توی اکسل پسوند اسم عکس ها وجود نداشته و به عنوان suffix پسوند پاس داده شده.

بر روی تمام فایل ها سایز ها گرفته و  تمام سایز ها را در size_d  دارد

سایز سطر و ستون را جدا کرده و به صورت هیستوگرام نمایش می دهد. که هیستوگرام نشان می دهد بیشتر تصاویر سایزی در اندازه 500 تا 1000 و کمتر از هزار هستند. پس تصاویر من در اندازه های بزرگ اند.

تابع فوق  داده ها را برمیگرداند با سایز تصویر و batch size ورودی دلخواه. هروقت تابع صدا شود یک trasformation میزند و سپس تصاویر را به اندازه batch size در متغییر data ریخته و در انتها قبل از بازگردانی تصاویر کوچکتر از 300 را ابتدا به 340 تبدیل کرده و سپس در پوشه tmp ذخیره میکند که حداقل تغییر اندازه از 340 باشد به اون سایز که cashing یک بارانجام شده باشد تا در تغییر اندازه تصاویر خیلی بزرگ به سایز کوچک overhead کمتری داشته باشیم و سرعت افزایش بیابد.(چون میخواهیم هر epoch را با یه سایزی پیش بریم)

 

از ConvLearner  متد pretrained را صدا زده و معماری و داده و پارامتر precompute هم true قرار میدهد.

متدpretrained  درای پارامتر ps است که بیانگر احتمال dropout است.

(در هنگام اجرای کد بالا با خطا مواجهه شدید وزن هارا دانلودکرده و در پوشه اشاره شده قرار دهید.)

 

با learning rate  ده به توان منفی 2 ، به تعداد 5 epoch می زند. با سایز وردوی 224 در 224

precompute را false کرده تا data argumation ما فعال بشه.

 

cycle_len= 1  بیانگر این است که یکی   یکی بره بالا

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

 

 

دیده می شود که بعد از adavtivePooling سایز ورودی از 2048 به سایز 4069 تغییر یافته است.

باTTA() می خواهد ببیند که می توان validation را بهتر کرد ..

مدل را ذخیره می کند.

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

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

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

+ کد ها در Jupyter Notebook

مقدمه:

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

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

مقدمه ای بر شبکه‌های مولد تخاصمی (Generative Adversarial Networks)

یادگیری بدون نظارت (Unsupervised Learning)
همان‌طور که پیش‌تر بحث شده بود، یکی از حوزه های یادگیری ماشین، یادگیری بدون نظارت است که در آن داده‌ها برچسب ندارند. در یادگیری بدون نظارت هدف اصلی، یادگیری ساختار داده‌ها می‌باشد.

 

ادامه خواندن مقدمه ای بر شبکه‌های مولد تخاصمی (Generative Adversarial Networks)

Neural Style Transfer

 Style Transferیکی از کاربردهای Deep Learning در هنر است که مشابه Deep Dream می‌باشد.

در این کاربرد یک عکس content و یک عکس style داریم. هدف این شکه ساختن عکسی است که image آن از عکس content و style آن از عکس style گرفته شده باشد. یعنی content را حفظ کرده و آنرا به سبک style ببرد.

به طور کلی به object ها content و به  .pattern,texture,color,. ها style گفته می‌شود.

نمونه ای از خروجی‌های این شبکه :

آن‌چه ConvNet ها یاد می‌گیرند

همان‌طور که میدانید لایه‌های اول به featureهای generalتر مانند خط و لبه و لایه‌های آخر ه feature‌های abstractتر حساس‌اند.

از visualization برای درک اینکه هر لایه چه تفسیری از image دارد، استفاده می‌شود. و این به عنوان hyper parameter برای style trafnsfer استفاده می‌شود. (برای مثال: استفاده از کدام لایه style را بهتر حفظ می‌کند.)

در مقاله Zeiler & Fergus سه متد درباره visualization معرفی شده است.

ادامه خواندن Neural Style Transfer

آشنایی با شبکه های عصبی بازگشتی – RNN

برای درک بهتر این مبحث ابتدا برخی از مساله هایی که با کمک RNN ها قابل حل است را بررسی می کنیم:

  • Music generation : در این نوع از مسائل ما به شبکه یک نت تصادفی (random token) و یا بخشی از یک موسیقی را می دهیم و شبکه ادامه آن موسیقی را برای ما تولید می کند.
  • Sentiment classification : در این مسائل شبکه با داده های افرادی که درباره موارد مختلف هم نظر و هم امتیاز داده اند آموزش می بیند تا بتواند پس از آن با مشاهده نظر هر کاربر با هر تعداد کلمه ای امتیازی که احتمالا وی به آن محصول می داده را مشخص کند.
  • DNA sequence analysis : در این نوع از مسائل معمولا یک رشته DNA نویزی به شبکه داده می شود تا شبکه نویزهای آن را حذف کند و رشته DNA سالم را تحویل بدهد. (کلیک کنید.)
  • Machine Translation : با کمک شبکه های RNN می توان این کار را به صورت دقیق تری از ترجمه لغت به لغت انجام داد. در اصل شبکه پس از آموزش باید بتواند عبارت ها با تعداد کلمات متفاوت را از یک زبان به زبان دیگر ترجمه کند.
  • Video activity recognition : در این نوع از مسائل تلاش می شود تا شبکه طوری آموزش ببیند که پس از مشاهده چندین فریم از یک فیلم بتواند فعالیتی که در آن صحنه اتفاق می افتد تشخیص دهد.
  • Name entity recognition : در تمامی زبان ها بسیاری از کلمات می توانند اسم خاص باشند یا نباشند. (مثلا روحانی یا Harry Potter) در این مسائل هدف آموزش شبکه ای است که بتواند اسامی خاص را در جملات تشخیص دهد.
  • Speech Recognition : در این مساله برای آموزش شبکه ای تلاش می شود که بتواند صدا یا گفتار را به متن یا نوشتار تبدیل کند.

ادامه خواندن آشنایی با شبکه های عصبی بازگشتی – RNN

تشخیص اشیا در تصویر با YOLO object detection

Object detection یا تشخیص شی در تصویر چیست ؟

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

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

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

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

  • شناسایی یا دسته‌بندی شیء: در شناسایی شیء، یک تصویر خام را تحویل می‌گیرید و باید تشخیص دهید که مربوط به کدام دسته می‌شود.
  • دسته‌بندی و مکان‌شناسی: در این حالت شما یک تصویر دارید که فقط یک شیء در آن وجود دارد و باید جای آن شیء را پیدا کنید. به این کار «مساله‌ مکان‌شناسی» نیز می‌گویند.
  • پیداکردن شیء: در این حالت شما باید موقعیت شیء در تصویر را پیدا کنید. این اشیا می‌توانند از کلاس‌های متفاوت باشند.
  • تقسیم‌بندی تصویر: تقسیم‌بندی تصویر وظیفه‌ سنگین‌تری است. در این حالت باید تمام پیکسل‌ها را بر اساس دسته‌ درست آن پیدا کنید.

 

روش ها و الگوریتم های موجود :

1 – روش های اولیه و سنتی :

در این روش ها مسئله را با رویکرد های ساده تری انجام میدهند. بعنوان مثال ابتدا تصویر را به یک شبکه سگمنتیشن داده و با روش های موجود به سگمنت کردن اشیا موجود در تصویر پرداخته و پس از مشخص شدن محدوده اشیا در تصویر هر کدام را جداگانه به یک شبکه دسته بند میدهیم تا کلاس آن نیز مشخص شود.
این روش ها زمان بر بوده و عملا برای تشخیص اشیا به صورت real time کارآمد نیستند. برای مثال روش selective search

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

2 – روش های مدرن و پیشرفته :

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

از جمله این روش ها و الگوریتم ها میتوان روش YOLO و SSD را نامبرد.

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

 

YOLO : You Only Look Once

کامل‌ترین سیستم‌ بلادرنگ (Real time) در یادگیری عمیق و حل مسائل تشخیص تصویر است. همان‌طور که در تصویر زیر مشاهده می‌کنید، این الگوریتم ابتدا تصویر را به بخش‌های مختلف تقسیم می‌کند و هر بخش را علامت‌گذاری می‌کند، سپس الگوریتم شناسایی را به صورت موازی برای تمامی این بخش‌ها اجرا می‌کند تا ببیند هر بخش به کدام دسته‌بندی تعلق می‌گیرد. بعد از شناسایی کامل اشیا، آن‌ها را به هم متصل می‌کند تا دو هر شیء اصلی یک جعبه باشد.

همه‌ این کارها به صورت موازی انجام می‌شوند؛ در نتیجه به صورت بلادرنگ است و می‌تواند تا 40 تصویر را در یک ثانیه پردازش کند. با اینکه این مدل کمی نسبت به RCNN عملکرد ضعیف‌تری دارد، ولی به دلیل بلادرنگ بودن آن، می‌توان از آن برای حل مشکلات روزانه استفاده کرد. در زیر تصویری از معماری YOLO را مشاهده می‌کنید.

نحوه تشخیص شی در تصویر توسط الگوریتم yolo :

در شبکه ی YOLO تصاویر به صورت فرضی به N در N ناحیه تقسیم می شوند. به ازای هر کدام از این نواحی فرض می شود که K شی امکان حضور دارند. شبکه به صورتی طراحی شده است که در نهایت به ازای تمامی نواحی امکان وجود اشیا در آن ناحیه ها – دسته ی آن شی و همچنین مختصات کادر دور شی را پیش بینی می کند.

با توجه به اینکه کادر دور هر شی ۴ مختصات دارد و همچنین دسته ی مورد نظر شی یک بردار C تایی هست و همین طور یک عدد برای احتمال وجود شی داریم پس به ازای هر شی یک تنزور (4 + 1 + C) تایی مورد نیاز است.

با توجه به اینکه فرض شد در هر تصویر N در N ناحیه وجود دارد و هر ناحیه احتمال حضور K شی به صورت بیشینه وجود دارد و هر شی نیز تزوری (4 + 1 + C) نیاز دارد پس در انتهای شبکه تنزوری KNN(C+1+4) وجود دارد که به پیشبینی کادر اشیا و احتمال آنها و دسته آنها می پردازد.

در نسخه نخست این شبکه پس از لایه های کانولوشن ویژگی ها خطی شده و به لایه های تمام متصل تحویل داده شده و در نهایت پیشبینی ها انجام می شوند در حالی که در نسخه های بعدی به جای ایجاد تنزوری به این ابعاد حجیم یک کرنل کانولوشن با ابعاد K(C+1+4) به نحوی بر روی ویژگی های آخرین لایه ی کانولوشن کانوالو می شود که ناحیه های ادراکی آن (Receptive Field) بر روی هر یک از N*N ناحیه از تصور ورودی قرار بگیرند و عملیات پیشبینی انجام شود.

 

تفاوت عمده این شبکه با شبکه ی RCNN این است که این شبکه به صورت سراسری (End-to-End) کار می کند و بحث تشخیص مکان اشیا را بدون نیاز به الگوریتم های بیرونی (Selective Search در RCNN) حل می کند و سرعت بسیار بالایی دارد و تماما با استفاده از شبکه های عصبی پیاده سازی شده و در نتیجه قابلیت موازی سازی بسیار مناسبی بر روی پردازنده هایی مثل GPU ها و FPGAها را داراست.

در فرایند اموزش شبکه yolo مختصات نقاطی را که میابد به صورت زیر تقسیم شده و با کاست فانکشن مناسب سعی در بهبود پبش بینی اشیا موجود در تصویر میکند

Cost function :

نتایج نهایی تشخیص اشیا روی تصویر توسط YOLO :