در این مقاله ما توانایی شبکه GAN در تولید تصاویر جدید را خواهیم دید، در نگاه نخست این موضوع کمی جادویی به نظر میرسد.
یک شبکه مولد-ممیز (GAN) یک دسته از چارچوبهای یادگیری ماشین هستند که در سال 2014 توسط آقای Ian Goodfellow و همکارانش طراحی شد. دو شبکه عصبی ( مولد و ممیز) مانند یک بازی با یکدیگر رقابت میکنند. در این تکنیک تولید داده جدید با استفاده از آمارهای یکسان انطور که در مجموعه آموزشی است، یادگرفته میشود.
در این پست، ما یک شبکه GAN را برای ایجاد تصاویر از صورت گربهها آموزش میدهیم. ما از یک دیتاست تصاویر گربهها استفاده خواهیم کرد که از بیش از 15700 تصویر گربه تشکیل شده است. از آنجایی که مدلسازی مولد یک روش یادگیری بدون نظارت است، به همین دلیل هیچگونه برچسبی بر روی تصاویر وجود ندارد.
در گام نخست ما تمام کتابخانههای ضروری را وارد برنامه میکنیم.
دیتاست برنامه شامل بیش از 15700 فایل تصویری با فرمت JPG است که درون پوشه cats قرار دارند. مکان پوشه این دیتاست را در متغیر DATA_DIR قرار میدهیم.
حال دیتاست را با استفاده از کلاس ImageFolder از کتابخانه torchvision بارگذاری می کنیم. می توانیم اندازه تصاویر را به مقدار 64x64 پیکسل تغییر بدهیم و مقادیر پیکسلها را به میانگین و انحراف معیار 0.5 نرمالسازی کنیم این کار به ما این اطمینان را میدهد که مقادیر پیکسل ها همواره بین 1 و 1- باقی بمانند که برای یادگیری discriminator راحتر است. همینطور ما برای بارگذاری داده ها درون batchها (بستهها) از یک data loader استفاده میکنیم.
حال شبکههای عصبی Discriminator و Generator را میسازیم. Generator تصاویر را تولید میکند و Discriminator تشخیص میدهد که آیا تصویر داده دریافت شده واقعی است و یا جعلی است. هر دو آنها با هم رقابت خواهند کرد و هر دو در کار خود بهتر خواهند شد!
ورودی مولد یک بردار یا ماتریس از اعداد تصادفی است که بعنوان خوراک برای تولید تصویر استفاده میشود. مولد میتواند یک شکل تانسور (128,1,1) را به یک تانسور تصویر (3,28,28) تبدیل کند.
در اینجا برای مولد از تابع ConvTranspose2d بجای Conv2d استفاده شده است، از تابع ConvTranspose2d معمولا برای گسترش یک تانسور به یک تانسور بزرگتر استفاده میشود. این کار برعکس یک لایه کانولوشنی عادی است که برای کاهش یک تانسور به تانسور کوچکتر استفاده میشود. تصویر زیر مولد را بصورت بصری نمایش میدهد.
ممیز (Discriminator)
ممیز یک تصویر را به عنوان ورودی خود میگیرد و سعی میکند آنرا با برچسب "واقعی" یا "ساختگی" دستهبندی کند. در اینجا ممیز یک ورودی را به شکل تانسور (3x64x64) میگیرد و آنرا به یک تانسور (1x1x1) تبدیل میکند.
نکتهای دیگر استفاده از تابع nn.Flatten است، این تابع روش داخلی pytorch برای مسطح سازی تانسورهاست. تصویر زیر ممیز را بصورت بصری نمایش میدهد.
تابع زیر پس از هر دور فراخوانی میشود تا تصویر تولید شده را ذخیر کند.
گام بعدی ایجاد یک تابع آموزشی برای ممیز و مولد است. برای آموزش هر دو شبکه از تابع آموزش استفاده خواهد شد.
تابع آموزش زیر برای ممیز است.
تابع آموزش زیر برای مولد است.
حال ما یک تابع آموزش میسازیم که ممیز و مولد را آموزش میدهد.
اکنون آماده آموزش مدل هستیم، مقادیر نرخ یادگیری و تعداد دوره تکرار را مشخص میکنیم:
lr=0.0002 , epoch=60
نتایج
پس از آموزش مدل برای 60 دور، میتوانیم تصاویر تولید شده را مشاهده کنیم.
همانطور که می بینیم تصاویر تولید شده از مدل، مشابه تصاویر واقعی هستند.
کد کامل را میتوانید در آدرس زیر بیابید:
https://github.com/shubham7169/Projects/blob/master/CAT-dcgan.ipynb