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

شبکه های Siamese و آموزش آن با استفاده از Keras، TensorFlow و یادگیری عمیق

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

    در این مقاله آموزشی می‌آموزید شبکه های Siamese را با استفاده از Keras، TensorFlow و یادگیری عمیق آموزش دهید و پیاده‌سازی کنید.

    شبکه های Siamese

    مقاله آموزشی پیش‌رو، بخش دوم از یک مقاله سه قسمتی است که به بررسی و مطالعه مبانی شبکه‌های عصبی Siamese می‌پردازد:

    • بخش اول: ایجاد جفت‌های تصویری برای شبکه های Siamese به کمک پایتون
    • بخش دوم: آموزش شبکه‌های عصبی Siamese به کمک Keras، TensorFlow و یادگیری عمیق
    • بخش سوم:‎ یافتن شباهت‌های‌ میان تصاویر با استفاده از شبکه‌های siamese

    در صورت استفاده از پیاده‌‌سازی شبکه عصبی Siamese‌‌، می‌توانیم:

    • دو ورودی به شبکه‌مان بدهیم
    • شبکه می‌تواند پیش‌بینی کند آیا دو تصویر به یک کلاس واحد تعلق دارند یا به دو کلاس متفاوت ( برای مثال تأئید اصالت)
    • می‌توانیم ضریب اطمینانConfidence score  شبکه را بررسی کنیم تا از درستی نتایج تأئید اصالت مطمئن شویم

    از جمله موارد کاربرد شبکه‌های عصبی Siamese می‌توان به بازشناسایی چهره، تأئید اصالت امضا، تطبیق نسخه‌های دارویی و غیره اشاره کرد.

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

    برای آشنایی با شیوه پیاده‌سازی و آموزش شبکه های Siamese با استفاده از Keras و TensdorFlow تا پایان این مقاله آموزشی با ما همراه باشید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق

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

    در گام بعدی شیوه پیکربندی محیط توسعه و آموزش شبکه‌های عصبی Siamese را به شما آموزش خواهیم داد.

    سپس ساختار دایرکتوری پروژه را با یکدیگر بازبینی و فایل پیکربندی را اجرا خواهیم کرد و در این فرایند از سه تابع کمکی استفاده خواهیم کرد:

    • برای ایجاد جفت‌های تصویری از متدی بهره می‌گیریم و سپس با استفاده از این جفت‌های تصویری شبکه Siamese را آموزش می‌دهیم
    • از یک لایه سفارشی CNN برای محاسبه فاصله‌های اقلیدسی میان بُردارهای موجود در شبکه استفاده می‌کنیم
    • از یک برنامه کمکی برای نگاشت روند آموزشی شبکه Siamese در دیسک استفاده می‌کنیم

    شبکه های Siamese چه نوع شبکه‌هایی هستند و شیوه کاری آن‌ها به چه شکل است؟

    شبکه های Siamese

    شکل ۱: پیاده‌سازی معماری شبکه Siamese دو ورودی می‌گیرد (چپ)، دو شبکه فرعی CNN یکسان برای هر یک از ورودی‌ها دارد و هر یک از یک لایه کاملاً متصل خروجی می‌دهند. فاصله اقلیدسی خروجی دو شبکه محاسبه و از طریق تابع فعال‌سازی سیگموید میزان تشابه را مشخص کند (راست)

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

    شکل ۱ معماری شبکه Siamese را نشان می‌دهد. با نگاه اول متوجه خواهید شد که معماری شبکه Siamese با معماری سایر شبکه‌های طبقه‌بندی تفاوت دارد.

    همان‌گونه که در تصویر فوق مشاهده می‌کنید، این شبکه دو ورودی و دو شاخه ( شبکه‌های همتاSister network ) دارد. هر یک از این شبکه‌های همتا کاملاً مشابه دیگری است. خروجی دو شبکه فرعی با یکدیگر ترکیب می‌شود و شبکه بر همین مبنا نرخ تشابه را خروجی می‌دهد.

    برای درک بهتر این موضوع، به شکل ۱ نگاه کنید:

    • در سمت چپ دو نمونه عددی (از دیتاست MNIST) به مدل Siamese ارائه می‌کنیم.هدف ما این است که مشخص کنیم آیا دو عدد به یک کلاس تعلق دارند یا خیر.
    • در قسمت میانی تصویر شبکه Siamese نشان داده شده است. دو شبکه فرعی معماری و پارامترهای یکسانی دارند و آینه یکدیگر هستند -به عبارت دیگر اگر وزن‌های یک شبکه فرعی را به روزرسانی کنیم، وزن‌های شبکه فرعی دوم هم به رزورسانی می‌شوند.
    • هر یک از شبکه‌های فرعی یک لایه کاملاً متصل (FC) خروجی می‌دهد. به طور معمول فاصله اقلیدسی میان این خروجی را محاسبه کرده و از تابع فعال‌سازی سیگموید آن را عبور می‌دهیم  تا مشخص کنیم این دو خروجی تا چه میزان با یکدیگر شباهت دارند. در صورتی‌که مقدار تابع فعال‌سازی سیگموید نزدیک به “۱” باشد، به این معنا است که دو خروجی به یکدیگر شباهت دارند و مقادیر نزدیک به “۰” نشان می‌دهند که دو خروجی شباهت کمی با یکدیگر دارند.

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

    دو تابع آخر به سه تصویر نیاز دارند ( سه تصویری ورودی به شبکه) که با جفت‌های تصویری (دو تصویر ورودی) که امروز استفاده می‌کنیم، تفاوت دارند.

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

    پیکربندی محیط توسعه

    در این سری مقالات آموزشی از کتابخانه‌های Keras و TensorFlow برای آموزش شبکه های Siamese کمک می‌گیریم. به همین دلیل از شما می خواهم محیط توسعه یادگیری عمیق خود را هم‌اکنون پیکربندی کنید.

    برای نصب TensorFlow و یا Keras بر روی سیستم خود می‌توانید از یکی از دو راهنمای مقابل کمک بگیرید:

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

    آیا در پیکربندی محیط توسعه به مشکل خورده‌اید؟

    شبکه های Siamese

    شکل ۲: آیا در پیکربندی محیط توسعه به مشکل خورده‌اید؟ در صورت تمایل به استفاده از به نوت‌بوک‌های Jupyter که از قبل پیکربندی شده‌اند و بر روی Google Colab اجرا می‌شوند، به عضویت PyImageSearch Plus درآیید.

    ساختار پروژه

    پس از آموزش شبکه Siamese بهتر است ساختار دایرکتوری پروژه را با یکدیگر بررسی کنیم.

    برای دانلود کد، مدل شبکه Siamese که از پیش آموزش دیده  به قسمت “Downloads” مراجعه کنید.

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق در ماژول pyimagesearch سه کد پایتون داریم:
    • Config.py : پارامترهای مهم از جمله ابعاد تصویر ورود، سایز دسته، تعداد دوره و غیره ذخیره می‌شود.
    • Siamese_netwrok.py : پیاده‌سازی شبکه (شبکه‌های همتا) در معماری مدل Siamese
    • Utils.py : شامل برنامه‌های کمکی است که از آن‌ها برای ایجاد جفت‌های تصویری استفاده می‌شود (که در قسمت اول راجع به آن‌ها توضیح دادیم)، فاصله اقلیدسی را به عنوان یک لایه Keras و TensorFlow محاسبه می‌کند و روند آموزش شبکه را به دیسک نگاشت می‌کند.
    Train_siamese_netwrok.py  از سه کد پایتون که در ماژول pyimagesearch قرار دارند، استفاده می‌کند تا:
    • دیتاست MNIST را از دیسک بارگذاری کند
    • جفت‌های تصویری مثبت و منفی از MNIST تولید کند
    • معماری شبکه Siamese را بسازد
    • جفت‌های تصویری را به شبکه Siamese آموزش دهد
    • مدل شبکه Siamese را سریال‌سازی کند و روند آموزشی را به دایرکتوری output نگاشت کند

    در گام بعدی فایل پیکربندی را ایجاد می‌کنیم.

    نکته: مدل از پیش‌آموزش دیده، که از بخش “Downloads” می‌توانید به آن دسترسی داشته باشید با استفاده از TensorFlow 2.3  آموزش دیده است. به همین دلیل به شما توصیه می‌کنم از TensorFlow 2.3 استفاده کنید. چنان‌چه ترجیح می‌دهید از نسخه متفاوتی از TensorFlow استفاده کنید، مشکلی ندارد. فقط برای آموزش و سریال‌سازی مدل باید، train_siamese_network.py  را اجرا کنید. البته توجه داشته باشید که باید این مدل را برای قسمت سوم و آخر این سری مقالات آموزشی ذخیره کنید؛ در قسمت آخر این مقاله آموزشی برای مقایسه تصاویر از شبکه Siamese که آموزش دیده استفاده می‌کنیم.

    ایجاد فایل پیکربندی شبکه Siamese

    فایل پیکربندی ما کوتاه است. config.py  را باز کنید و کدل مقابل را وارد کنید:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۵ ابعاد ورودی IMG_SHAPE  را مقداردهی می‌کند. از آنجایی‌که از دیتاست عددی MNIST استفاده می‌کنیم، تصاویر ما ۲۸×۲۸ با یک کانال سیاه و سفید هستند.

    سپس BATCH_SIZE   و تعداد تکرار آموزش را مشخص می‌کنیم.

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

    در گام بعدی مسیرهای خروجی را مشخص می‌کنیم:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۱۲ مسیر BASE_OUTPUT  را به عنوان دایرکتوری output راه‌اندازی می‌کند.

    سپس از مسیر BASE_OUTPUT  برای پیدا کردن مسیر دسترسی به MODEL_PATH  استفاده می‌کنیم؛ MODEL_PATH  مدل سریال سازی شده Keras/ TensorFlow است.

    از آنجایی که برای پیاده‌سازی شبکه Siamese به یک لایه Lambda نیاز داریم، از فرمت SaveModel استفاده می‌کنیم که طبق سند TensorFlow بهتر می‌تواند اشیای و پیاده‌سازی‌های سفارشی را مدیریت کند.

    خروجی فرمت SaveModel یک دایرکتوری مدل شامل بهینه‌ساز، توابع زیان و متریک‌ها ( saved_model.pb ) و هم‌چنین وزن‌های مدل خواهد بود ( که در یک دایرکتوری /variables  ذخیره می‌شوند).

    پیاده‌سازی معماری شبکه Siamese با استفاده از Keras و TensorFlow

    شبکه های Siamese

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

    معماری شبکه Siamese از ۲ یا بیش از ۲ شبکه همتا تشکیل می‌شود ( در شکل ۳  با رنگ قرمز نشان داده شده‌اند). در واقع شبکه همتا، یک شبکه عصبی کانولوشن ساده است که یک لایه کاملاً متصل (FC) را خروجی می‌دهد که برخی مواقع به آن لایه تعبیه شده گفته می‌شود.

    در هنگام ساخت معماری شبکه Siamese :

    • برای شبکه‌های همتا نمونه سازیInstantiate  می‌کنیم
    • یک لایه Lambda می‌سازیم که فاصله اقلیدسی میان خروجی‌های دو شبکه همتا را محاسبه کند
    • یک لایه FC با یک گره و یک تابع فعال‌سازی سیگموید ایجاد می‌کنیم

    در نتیجه یک شبکه Siamese ایجاد می‌شود.

    اما ابتدا باید  شبکه همتای معماری شبکه Siamese را پیاده‌سازی کنیم.

    در دایرکتوری پروژه خود، Siamese_netwrok.py  را باز کنید:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۲ تا ۸ پکیج‌های پایتون مورد نیاز را بارگذاری می‌کنند. اگر قبلاً هم با استفاده از Keras یا TensorFlow یک CNN آموزش داده‌اید، به خوبی اهمیت بارگذاری این پکیج‌ها را درک می‌کنید.

    برای آشنایی بیشتر با CNNها به شما توصیه می‌کند مقاله آموزشی من را با موضوع Keras و کتاب من تحت عنوان یادگیری عمیق برای بینایی کامپیوتر به کمک پایتون را مطالعه کنید.

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

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق تابع build_siamese_model دو پارامتر می‌پذیرد:
    • inputShape : ابعاد (طول، عرض و تعداد کانال‌ها) تصاویر ورودی. چنان‌چه از دیتاست MNIST استفاده کنیم، تصاویر ورودی ۱×۲۸×۲۸ خواهند بود.
    • embeddingDim : ابعاد لایه آخر شبکه که کاملاً متصل است را خروجی می‌دهد.

    خط ۱۲ ابعاد ورودی را برای شبکه همتا مقداردهی می‌کند.

    خط ۱۵ تا ۲۲ دو مجموعه از مجموعه‌ لایه‌‌های CONV => RELU => POOL   تعریف می‌کند. هر لایه CONV در مجموع ۶۴ فیلتر ۲×۲  را می‌آموزد. سپس تابع فعال‌سازی ReLU را اجرا کرده و ادغام بیشینه Max pooling  را با یک گام ۲×۲ اعمال می‌کنیم.

    و پایان ساخت معماری شبکه Siamese:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق  

    خط ۲۵ ادغام میانگین عمومی Global average pooling را بر روی حجم ۶۴×۷×۷  اعمال می‌کند (با فرض ورودی ۲۸×۲۸ شبکه) و در نتیجه یک خروجی ۶۴ بُعدی به دست می‌آید.

    pooledOutput را می‌گیریم و سپس یک لایه کاملاً متصل به اندازه بُعد embeddingDim اعمال می‌کنیم (خط ۲۶)؛ این لایه Dense خروجی شبکه همتا خواهد بود.

    خط ۲۹، Model شبکه همتا را می‌سازد که به تابع فراخون می‌شود.

    در ادامه می‌توانید خلاصه‌ای از مدل را مشاهده کنید:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق مدلی که ساختیم به شرح زیر است:
    • هر شبکه همتا یک ورودی ۱×۲۸×۲۸ دریافت می‌کند.
    • سپس یک لایه CONV اعمال می‌کنیم تا ۶۴ فیلتر را بیاموزد. ادغام بیشینه با یک گام ۲×۲ اعمال می‌شود تا ابعاد را به ۶۴×۱۴×۱۴  کاهش دهد.
    • یک لایه CONV دیگر ( که ۶۴ فیلتر را می‌آموزد) و لایه ادغام اعمال می‌شوند و ابعاد را به ۶۴×۷×۷ کاهش می‌دهند.
    • ادغام میانگین عمومی اعمال می‌شود تا حجم ۶۴×۷×۷ به ۶۴ بُعد کاهش دهد.
    • خروجی ۶۴ بُعدی ادغام به لایه FC که ۴۸ گره دارد، منتقل می‌شود.
    • بُردار ۴۸ بعدی، خروجی شبکه همتا خواهد بود.

    در کد train_siamese_network.py  شیوه ایجاد دو نمونه از شبکه همتا را می‌آموزید و سپس ساخت معماری شبکه Siamese به پایان می‌رسد.

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

    پس از پیاده‌سازی فایل پیکربندی، شبکه همتای معماری شبکه siamese، نوبت به توابع کمکی و متدهایی می‌رسد که در فایل utils.py  ماژول pyimagesearch قرار دارند.

    فایل utils.py  را باز کنید:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۲ تا ۴ پکیج‌های پایتون که به آن‌ها نیاز داریم را بازگذاری می‌کنند.

    Keras/ TensorFlow بَک‌اِند را بارگذاری می‌کنیم و از این طریق می‌توانیم لایه سفارشی Lambda فاصله اقلیدسی را بسازیم.

    از کتابخانه matplotlib برای ساخت یک تابع کمکی استفاده می‌کنیم؛ این تابع کمکی روند آموزش شبکه را نگاشت می‌کند.

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

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق  

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

    • برای آموزش شبکه Siamese به جفت مثبت و هم‎چنین به جفت منفی نیاز داریم
    • جفت مثبت به تصاویری گفته می‌شود که به یک کلاس واحد تعلق دارند ( برای مثال دو نمونه از عدد ۸)
    • جفت منفی به تصاویر گفته می‌شود که به کلاس‌های مختلف تعلق دارند ( برای مثال، یک تصویر ۱ را نشان می‌دهد و تصویر دیگر ۳)
    • تابع make_pairs  یک مجموعه ورودی از images و labels مرتبط با آن‌ها را دریافت می‌کند و سپس جفت‌های مثبت و جفت‌های منفی را برای آموزش ایجاد می‌کند و آن‌ها را به تابع فراخون باز می‌گرداند.

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

    تابع بعدی ما euclidean_distance  است که یک vectors  دوگانه دریافت می‌کند و سپس با استفاده از توابع Keras/ TensorFlow فاصله اقلیدسی میان آن‌ها را محاسبه می‌کند:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق تابع euclidean_distance  فقط یک پارامتر، vectors ، می‌گیرد؛ vectors  خروجی لایه‌های کاملاً متصل شبکه‌های همتا و هم‌چنین معماری شبکه Siamese است.

    vectors  را به دو بخش featsA و featsB تقسیم می‌کنیم (خط ۵۰) و سپس مجموع تفاوت مربعSquared difference  میان این بُردارها را محاسبه می‌کنیم (خط ۵۳ و ۵۴).

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

    به یاد داشته باشید که ما به جای NumPy و SciPy، از توابع Keras/ TensorFlow باری محاسبه فاصله اقلیدسی استفاده می‌کنیم.

    حتماً می‌پرسید چرا؟

    بهتر نیست از توابع فاصله NumPy و SciPy استفاده کنیم؟

    چرا به خودمان زحمت بدیم و مجدداً فاصله اقلیدسی را با Keras/ TensorFlow پیاده‌سازی کنیم؟

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

    برای دستیابی به این هدف از یک لایه سفارشی Lambda استفاده خواهیم کرد که با استفاده از آن می‌توانیم توابع دلخواه Keras/TensorFlow را درون یک مدل تعبیه کنیم ( چرا از توابع Keras/TensorFlow برای محاسبه فاصله اقلیدسی استفاده می‌کنیم؟)

    آخرین تابع، plot_training ۱  با فراخوان model.fit ، روند آموزشی و ۲ یک خروجی plotPath  می‌پذیرد.

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق متغیر روند آموزشی مدل H خواهد بود و بر همین اساس زیان و دقت آموزش و اعتبارسنجی را نگاشت می‌کنیم. نگاشت خروجی در دیسک و در plotPath ذخیره می‌شود.

    ایجاد کد آموزش شبکه Siamese با استفاده از Keras و TensorFlow

    اکنون می‌توانیم کد آموزش شبکه Siamese را اجرا کنیم!

    در کد train_siamese_network.py :

    • دیتاست MNIST را از دیسک بارگذاری می‌کنیم.
    • جفت‌های تصویری آموزشی و آزمایشی را ایجاد می‌کنیم.
    • دو نمونه از build_siamese_model  ایجاد می‌کنیم که در نقش شبکه‌های همتا عمل کنند.
    • خروجی‌های شبکه‌های همتا را از طریق تابع سفارشی euclidean_distance  نمایش می‌دهیم و فرایند ساخت معماری شبکه Siamese را به اتمام می‌رسانیم.
    • تابع فعال‌سازی سیگموید را بر روی خروجی فاصله اقلیدسی اجرا می‌کنیم.
    • معماری شبکه Siamese را با جفت‌های تصویری آموزش می‌دهیم.

     

    ممکن است در نگاه اول این فرایند پیچیده به نظر برسد. اما تمامی این کارها را می‌توانیم با کمتر از ۶۰ خط کد انجام دهیم!

    train_siamese_network.py  را باز کنید و :

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۲ تا ۱۰ پکیج‌های پایتون که به ان‌ها نیاز داریم را بارگذاری می‌کنند. مهم‌ترین این پکیج‌ها عبارتند از:
    • build_siamese_model : مولفه‌های شبکه همتای معماری شبکه Siamese را می‌سازد.
    • config : پیکربندی‌های آموزش را ذخیره می‌کند.
    • utils  : شامل توابع کمکی است که از آن‌ها برای ساخت جفت‌های تصویری، نگاشت روند آموزشی، محاسبه فاصله اقلیدسی به کمک توابع Keras/TensorFlow استفاده کردیم.
    • Lambda : فاصله اقلیدسی را می‌گیرد و در معماری شبکه Siamese تعبیه می‌کند.

    پس از بارگذاری پکیج‌های مورد نیاز می‌توانیم دیتاست MNIST را از دیسک بارگذاری و پیش‌پردازش کنیم و جفت‌های تصویری را ایجاد کنیم:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۱۴ دیتاست عددی MNIST را از دیسک بارگذاری می‌کند.

    سپس تصاویر MNIST را از [۰,۲۵۵] به [۰,۱] مقیاس‌بندی می‌کنیم و بدین وسیله آن‌ها را پیش پردازش می‌کنیم (خط‌های ۱۵ و ۱۶) و سپس یک کانال بُعد اضافه می‌کنیم (خط‌های ۱۹ و ۲۰).

    از تابع make_pairs  برای ایجاد جفت‌های مثبت و منفی مجموعه‌های آموزشی و آزمایشی استفاده می‌کنیم (خط‌های ۲۴ و ۲۵). برای آشنایی بیشتر با تابع make_pairs  بخش اول این مقاله را مطالعه کنید.

    حالا معماری شبکه Siamese را می‌سازیم:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۲۹ تا ۳۳ شبکه‌های همتا را می‌سازند.
    • ابتدا دو ورودی، برای هر کدام از تصاویر موجود در جفت تصویری یک ورودی، می‌سازیم (خط‌های ۲۹ و ۳۰).
    • خط ۳۱ معماری شبکه همتا را می‌سازد که نقش featureExtractor را دارد.
    • هر یک از تصاویر موجود در جفت تصویری از featureExtractor رد می‌شود و در نتیجه یک بُردار ویژگی ۴۸ بُعدی شکل می‌گیرد (خط‌های ۳۲ و ۳۳). از آنجایی که در هر جفت دو تصویر وجود دارد، دو بُردار ویژگی ۴۸ بُعدی خواهیم داشت.

    شاید این سؤال برای‌تان پیش بیاید که چرا build_siamese_model  را دوبار فراخون نکردیم؟خب ما دو شبکه همتا داریم، درست است؟

    درسی که در بخش اول یاد گرفتید را هیچ وقت فراموش نکنید:

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

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

    و برای اتمام فرایند ساخت معماری شبکه Siamese:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط ۳۶ برای محاسبه euclidean_distance  میان featsA و  featsB شبکه از یک لایه Lambda استفاده می‌کند (به یاد داشته باشید که اگر هر یک از تصاویر موجود در جفت‌های تصویری را از طریق استخراج کننده ویژگی شبکه همتا منتقل کنیم این مقادیر ایجاد می‌شوند (خروجی)).

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

    خروجی تابع [۰,۱] مقیاس‌بندی شده و به همین دلیل در اینجا از تابع فعال‌سازی سیگموید استفاده می‌کنیم. اگر به   نزدیک باشد بدین معنی است که جفت‌های تصویری شباهت کمی با یکدیگر دارند ( و متعلق به کلاس‌های گوناگونی هستند) و اگر مقدار خروجی نزدیک به ۱  باشد، می‌توانیم نتیجه بگیریم که جفت‌های تصویری شباهت زیادی به هم دارند ( و احتمال اینکه به یک کلاس یکسان تعلق داشته باشند، زیاد است).

    خط ۳۸ Model شبکه Siamese را می‌سازد. inputs شامل جفت تصویری، یعنی همان imgA و imgB است. outputs شبکه تابع فعال‌سازی سیگموید است.

    پس از اتمام فرایند ساخت معماری شبکه Siamese می‌توانیم آموزش را آغاز کنیم:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق خط‌های ۴۲ و ۴۳ تابع هزینه آنتروپی متقاطع دودویی را در نظر می‌گیرند و شبکه Siamese را کامپایل می‌کنند.

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

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

    خط ۴۷ تا ۵۱ شبکه Siamese را با جفت‌های تصویری آموزش می‌دهند.

    پس از اتمام فرایند آموزش مدل، می‌توانیم آن را در حافظه ذخیره کنیم و روند آموزشی را ترسیم کنیم:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق تبریک! شما توانستید با موفقید کد آموزش شبکه Siamese را اجرا کنید!

    آموزش شبکه Siamese با استفاده از Keras و TensorFlow

    اکنون می‌توانیم شبکه Siamese را با استفاده از Keras و TensorFlow آموزش دهیم! برای دانلود کد به بخش “Downloads” مراجعه کنید.

    سپس یک terminal باز کنید و فرمان مقابل را اجرا کنید:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق
    شبکه های Siamese

    شکل ۴: آموزش دیتاست MNIST به شبکه Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق

    همان‌گونه که در نمودار فوق مشاهده می‌کنید، مدل در مجموعه اعتبارسنجی به نرخ دقت  ۱۰/۸۸% ~ دست یافت. به زبان ساده مدل ۸۸% مواقع می‌تواند به درستی یکسان بودن کلاس تصاویر ورودی را مشخص کند.

    شکل ۴ روند آموزش مدل را در بیش از ۱۰۰ تکرار نشان می‌دهد. عملکرد مدل تا اندازه‌ای منجسم و ثابت است. با توجه به این که مقدار هزینه اعتبارسنجی کمتر از مقدار هزینه آموزش است می‌توان امیدوار بود که بتوانیم نرخ دقت مدل را با «آموزش بیشتر» افزایش داد.

    اگر نگاهی به دایرکتوری output بیندازید، یک دایرکتوری به نام siamese_model خواهید دید:

    برای دانلود کد بر روی این لینک کلیک کنید.

    آموزش شبکه های Siamese با استفاده از Keras، TensorFlow و یادگیری عمیق این دایرکتوری شامل شبکه Siamese ذخیره شده است. در سومین بخش از این سری مقالات شیوه مقایسه و یافتن شباهت‌های میان تصاویر ورودی را با استفاده از این شبکه‌ها می‌آموزید.

    چکیده

    در این مقاله آموزشی شیوه پیاده‌سازی و آموزش شبکه های Siamese را با استفاده از Keras، TensorFlow و یادگیری عمیق آموختید.

    در این نوشتار شبکه Siamese را با دیتاست MNIST آموزش دادیم. ورودی شبکه Siamese دو تصویری (تصویر عدد) است و سعی می‌کند مشخص کند این دو تصویر به یک کلاس واحد تعلق دارند یا به دو کلاس مختلف.

    برای مثال، اگر دو تصویر به شبکه بدهیم و هر دوی آن‌ها شامل ۹ باشند، شبکه Siamese اعلام می‌کند که شباهت زیادی میان دو تصویر است و دو تصویر به یک کلاس واحد تعلق دارند.

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

    در این مقاله آموزش برای سهولت از دیتاست MNIST استفاده کردیم تا مبانی شبکه های Siamese را به خوبی بیاموزیم. این فرایند آموزش را می‌توانید در حوزه‌هایی از جمله تشخیص چهره، تأئید اصالت امضا و تطبیق نسخه‌های دارویی و غیره به کار ببندید.

    در قسمت آخر این سری از مقالات به شما نشان خواهیم داد که مدل شبکه Siamese که آموزش دیده و ذخیره شده چگونه می‌تواند شباهت‌های میان تصاویر را پیش‌بینی کند.

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

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

    مقاله قبلی

    ربات انسان نمای تسلا ؛ ایلان ماسک به دنبال فتح یک دنیای جدید

    مقاله بعدی

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

    نظرات

    پاسخ دهید

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