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

داده افزایی و جلوگیری از بیش‌برازش مدل در مسائل طبقه‌بندی تصویر

    0
    مدت زمان مطالعه: ۱۱ دقیقه

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

    تمامی کدهای به کار رفته در این مطلب آموزش را می‌توانید از GitHub دانلود کنید. این داده‌ها با استفاده از Google Colab و GPU فعال، آموزش داده شده‌اند.

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

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

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

    • سوگیری مدل نسبت به یک کلاس خاص را کاهش می‌دهد. در نتیجه‌ی این عمل الگوریتم به خوبی می‌تواند تعمیم دهد.

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

    داده افزایی

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

    مقدمه

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

    ساخت پایپ‌لاین داده

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

    • تغییر ابعاد تصویر ورودی
    • تبدیل تصاویر به آرایه‌ها
    • فیلتر کردن تصاویر (اجباری نیست)
    • تغییر مقیاس تصاویر ( افزایش وضوح عکس یا کاهش وضوح عکس)

    در این مقاله آموزشی به توصیف مورد ۱ و ۲ بسنده می‌کنیم.

    در گام اول برای آشنایی بیشتر با نحوه بارگذاری یک تصویر در یک آرایه،  داده‌ها را به صورت دستی بارگذاری می‌کنیم (به جای استفاده از tf.data). برای انجام این کار می‌توانیم از کد زیر استفاده کنیم:

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

    در این قسمت به شما نشان می‌دهیم که چگونه می‌توان با استفاده از کلاس image (در کتابخانه Keras) داده‌های را به صورت دستی بارگذاری کرد. ما داده‌ها را به صورت تصایر رنگی با ابعاد ۲۲۴ در ۲۲۴ بارگذاری می‌کنیم. برای انجام این کار gray_scale را بر روی False تنظیم می‌کنیم:

    با اجرای کد زیر می‌توانید تصاویری را که به صورت دستی (به صورت فهرستی از آرایه‌ها) بارگذاری کردید، به arrays تبدیل می‌کنید:

    حالا که تمامی تصاویر را به آرایه تبدیل کردیم، می‌توانیم فرایند ساخت مدل را آغاز کنیم.

    ساخت مدل

    برای ساخت مدل باید موارد زیر را در نظر بگیریم:

    1. یک شبکه ورودی که تصاویری در ابعاد ۲۲۴×۲۲۴×۳ و یک تابع فعال‌سازی ReLU را به عنوان ورودی دریافت می‌کند.
    2. اولین لایه کانولوشن ۲ بُعدی با ۳۲ فیلتر؛ اندازه هر یک از فیلترهای این لایه ۷ در ۷ است.
    3. یک لایه پولینگ ماکزیمم ۲ بُعدی برای اولین لایه کانولوشن؛ اندازه کرنل این لایه ۲ در ۲ است.
    4. دومین لایه کانولوشن ۲ بُعدی با ۱۶ فیلتر؛ اندازه هر یک از فیلترهای این لایه ۵ در ۵ است و یک تابع فعال‌سازی ReLU هم دارند.
    5. یک لایه ادغام بیشینه ۲ بُعدی برای دومین لایه کانولوشن؛ اندازه کرنل این لایه ۲ در ۲ است.
    6. سومین لایه کانولوشن ۲ بُعدی با ۸ فیلتر؛ اندازه هر یک از فیلترهای این لایه ۵ در ۵ است و یک تابع فعال‌سازی ReLu هم دارند.
    7. یک لایه ادغام بیشینه ۲ بُعدی برای سومین لایه کانولوشن؛ کرنل این لایه ۲ در ۲ است.
    8. یک لایه مسطح ( تا تمامی اطلاعات را به یک لایه FC منتقل کند).
    9. یک لایه پنهان متشکل از ۳۰۰ نورون و یک تابع فعال‌سازی ReLU.
    10. یک لایه پنهان متشکل از ۱۰۰ نورون و یک تابع فعال‌سازی ReLU.
    11. دو لایه خروجی، به این دلیل که می‌خواهیم مدل احتمال اینکه تصویر به کلاس Dog تعلق دارد یا به کلاس Cat را پیش‌بینی کند.

    برای نوشتن تمامی این موارد در TensorFlow می‌توانیم از کد زیر استفاده کنیم:

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

    داده افزایی

    اجزای شبکه

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

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

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

    داده افزایی

    با نگاهی به نتایج آموزش مدل (نمودار فوق) متوجه می‌شویم که در آغاز آموزش مدل، نرخ دقت آن ۵۰% بوده و به تدریج به ۱۰۰% رسید، اما نرخ دقت آن بر روی داده‌های اعتبارسنجی در آغاز ۵۰% بود و بر روی ۶۸% ثابت مانده است.

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

    اما زمانی که داده‌های اعتبارسنجی را به مدل تغذیه کردیم ( که قبلاً آن‌ها را ندیده بود) و نتایج را با نتایج واقعی مقایسه کردیم، متوجه شدیم که این مدل توانسته با نرخ دقتی برابر با ۶۸%، کلاس تصاویر را به درستی پیش‌بینی کند. با این تفاسیر می‌توانیم نتیجه بگیریم که مدل، داده‌های آموزشی را به خوبی یاد گرفته اما عملکردش بر روی داده‌های اعتبار سنجی (که قبلاً آن‌ها را ندیده) از چیزی که انتظار داشتیم ضعیف‌تر بوده است.

    نرخ دقت ۶۸% خوب است، اما زمانی که آن را با نرخ دقت مدل در هنگام آموزش با داده‌های آموزشی مقایسه می‌کنیم (که ۹۷% بوده)، اصلاً قابل قوبل نیست و نشان می‌دهد که مدل دچار بیش‌برازش شده است. برای رفع این مشکل می‌توانیم از راهکارهای زیر استفاده کنیم:

    1. داده افزایی
    2. تکنیک‌های منظم‌سازی ( مثل dropouts)

    داده افزایی

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

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

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

    به کمک کلاس image generator و اجرای یکی از تکنیک‌های زیر می‌توانیم تصاویر بیشتری ایجاد کنیم:

    • چرخش عکس
    • زوم کردن
    • برگردان عکس
    • برش عکس
    • افزودن نویز به عکس

    برای افزایش داده‌ها، در قدم اول باید image data generator را از Keras بارگذاری کنید. کلاس‌های مربوط به داده‌های آموزشی و داده‌های اعتبارسنجی را به صورت جداگانه نمونه‌سازی کنید. سپس پارامترهایی که می‌خواهید به صورت خودکار  بر روی داده‌های موجود اعمال شوند و داده‌های جدید ایجاد کنند را مشخص کنید. برای نمونه می‌توان به برگردان افقی، چرخش ( با تعیین زاویه چرخش) و غیره اشاره کرد.

    اجرای تکنیک داده افزایی

    برگردان عکس

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

    داده افزایی

    برگردان عکس

     

    چرخش عکس

    برای چرخاندن عکس، زاویه چرخش را مشخص کرده و کد زیر را اجرا کنید، من زاویه چرخش را بر روی ۴۵ درجه تنظیم کرده‌ام:

    داده افزایی

    چرخش عکس

     

    زوم‌ کردن

    در تکنیک زوم کردن، بازه زوم بین ۰ تا ۱ مشخص شده است. به همین دلیل اگر بازه زوم را بر روی ۷/۰ تنظیم کنید، زوم تصویر به صورت تصادفی بین ۰ و ۷۰% متغیر خواهد بود. برای اجرای تکنیک زوم کردن، ایتدا باید بازه زوم عکس را مشخص کنید. من بازه زوم را بر روی ۶/۰ تنظیم کرده‌ام ( یعنی حداکثر میزان زوم ۶۰% خواهد بود):

    داده افزایی

    زوم کردن

     

    حالا تمامی این تکنیک‌ها را در کنار هم قرار می‌دهیم تا ببینیم تکنیک‌های داده افزایی توانسته‌اند به بهبود عملکرد مدل کمک کنند یا نه:

    داده افزایی

    اجرای تمامی تکنیک‌های داده افزایی بر روی عکس

     

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

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

    این تکنیک‌ها از این لحاظ خوب هستند که اگر مدل بتواند ۸۰ تا ۹۰ درصد از داده‌ها را به درستی یاد بگیرد، می‌توانیم مطمئن شویم که در سناریوهای واقعی هم عملکرد یکسانی خواهد داشت.

    با این وجود، عملکرد مدل هنوز هم به اندازه کافی خوب نیست. زمانی که مدل را با داده‌های اعتبارسنجی آموزش می‌دهیم، عملکرد آن بین ۶۵ تا ۷۰ درصد است، اما ما امیدواریم بتوانیم مدل بسازیم که نرخ دقت‌ آن بر روی  بین ۹۵ تا ۱۰۰ درصد باشد. برای دستیابی به این هدف می‌توانیم تعداد دورهای آموزش مدل را افزایش دهیم و یا تکنیک‌های منظم‌سازی بیشتری به آن اضافه کنیم. در مقالات آتی بیشتر به این موضوع می‌پردازیم.

    داده افزایی

    عملکرد مدل

    نتیجه‌گیری / مقایسه مدل

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

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

    معماری مدلی که در این مطلب آموزشی ساختیم، از ۳ لایه کانولوشن با ۳۲، ۱۶ و ۸ فیلتر و یک لایه FC و ۲  لایه پنهان (۳۰۰ نورون در لایه اول و ۱۰۰ نورون در دومین لایه پنهان) تشکیل شده بود.

    ما برای اینکه نشان دهیم معماری‌های عصبی رایانشی هم می‌توانند تعمیم دهند از این مدل استفاده  کردیم؛ محاسبات ساده هم می‌توانند با صرف هزینه کمتر  این کار را انجام دهند و این در حالی است که معماری‌های عصبی بزرگ برای انجام این کار انرژی زیادی صرف می‌کنند.

    این مطلب چه میزان برای شما مفید بوده است؟
    [کل: ۰ میانگین: ۰]

    کاربرد هوش مصنوعی در پیشرفت فناوری‌های انرژی

    مقاله قبلی

    دستاورد جدید پژوهشی در زمینه هوش مصنوعی توسط عضو علمی دانشگاه پیام نور مرکز اردکان به چاپ رسید

    مقاله بعدی

    شما همچنین ممکن است دوست داشته باشید

    نظرات

    پاسخ دهید

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