PixToPix
در این بخش قصد داریم مدلی را پیاده سازی کنیم که با دادن یک تصویر به شبکه ، تصویری مشابه الگوهای زیر از شبکه بگیریم . برای مثال بتوانیم عکسی در فضای آفتابی از یک منظره به شبکه بدهیم و تصویر همان منظره را در فضای ابری بخواهیم ، و یا اینکه عکس سیاه سفید از یک شی را به شبکه داده و عکس رنگی آن را از شبکه بگیریم ، و مثال هایی از این قبیل …
در شکل زیر میتوانید نمونه هایی از این دسته را مشاهده نمایید :
همانطور که در تصویر بالا مشاهده میکنید میتوانیم با داشتن لبه های یک کیف به تصویر اصلی کیف ، با داشتن منظره ای در هوای افتابی به آن منظره در هوای ابری و با داشتن segment های یک ساختمان به تصویری مشابه از یک ساختمان واقعی و با داشتن عکس سیاه سفید به عکس رنگی تصویرمان برسیم .
در اینجا می توانید نمونه های از این عملیات را به طور آنلاین مشاهده نمایید .
شبکه GAN
همانطور که می دانید در ساختار یک شبکه ی GAN دو واحد اصلی Genarator و Discriminator داریم ، که در واقع کار اصلی واحد Generator تولید عکس های جعلی و به مرور یادگیری تولید عکس های واقعی تر و شبیه تر به نمونه ی عکس های اصلی ، و وظیفه ی واحد Discriminator یادگیری فرایند تشخیص عکس جعلی از عکس واقعی می باشد .
به مرور هر دو شبکه ی Generator و Discriminator به ترتیب یاد میگیرند عکس های واقعی تر تولید و عکس های تقلبی را تشخیص دهند ( واحد Generator سعی در فریب دادن واحد Descriminator دارد ) . پس بدین ترتیب ( همانظور که در بخش های قبلی دیدیم ) generator یک نویز را به عنوان ورودی میگیرد و تصویری تولید میکند و Discriminator عکس تولیدی واحد Generator را گرفته و سعی در تشخیص جعلی بودن یا نبودن آن دارد .
Conditional GAN :
conditional generative adverserial nets ها در واقع شبکه ها ی GAN ای هستند که می توان با اضافه کردن یک ترم به Generator و Discriminator از شبکه بخواهیم آن چه مورد نظر ماست را تولید کند . برای مثال میتوانیم نویزی که قرار است به جنریتور بدهیم با یک one hot که عدد 3 را نشان می دهد concat کرده و به generator بدهیم تا برای مثال شبکه ای که دیتا ی Mnist را آموزش دیده بتواند عدد 3 را تولید کند یا برای مثال به طور پیشرفته تر از شبکه بخواهیم یک انسان که تصویرش را دریافت می کند ، بتواند پیرتر کند .
بدین ترتیب اگر فرایند Train را بدین گونه تغییر دهیم ( یک ترم اضافه به Discriminator و Generator بدهیم ) میتوانیم آنچه گفته شد را پیاده سازی کنیم .
شبکه ی Generator :
در این بخش از یک auto encoder برای پیاده سازی این شبکه استفاده میکنیم.
همانطور که میدانید auto encoder دارای یک سری لایه ی convlution در لایه های اول ( کوچک کردن طول و عرض و بزرگ کردن عمق ) تا رسیدن به یک bottle neck ، و یک سری لایه ی TransposeConvolution ( بزرگ کردن طول و عرض و کوچک کردن عمق ) تا رسیدن به سایز اولیه می باشد ، بدین صورت عکس ورودی را تا یک جایی کوچک کرده و سپس به ابعاد اولیه می رساند .
در شکل زیر نمونه ی این شبکه را مشاهده می نمایید :
همانطو که در تصویر بالا مشاهده می کنید ، ورودی شبکه ی Generator یک عکس سیاه سفید بوده که این شبکه سعی در تولید عکس رنگی ( در مشابه ترین حالت ممکن به عکس رنگی اصلی در دیتاست) دارد .
ایده ای که در قسمت مطرح شد استفاده از skip connection های مشابه در شبکه ی Resnet بود ، به عبارتی از لایه ی n ام encoding به لایه n ام decoding یک skip connection با این هدف که ممکن است نیازی به طی کردن همه ی لایه های کانولوشن و به طبع تمام لایه های دی کانولوشن ( Transpose Convolution ) نباشد ، و با طی کردن تعداد کمتری از این لایه ها به هدف مربوطه برسیم ، بدین منظور ایده ای مطابق شکل زیر بیان گردید که به آن اصطلاحا U–Net می گویند.
شبکه ی Discriminator :
این شبکه که وظیفه ی تشخیص دیتای واقعی ( دیتای موجود در دیتاست ) از دیتای غیر اصلی و جعلی ( تصویر تولید شده ی Generator ) را دارد ، ساختاری کانولوشنی مطابق شکل زیر داراست .
همانطور که مشاهده می کنید ورودی این واحد ، ورودی شبکه ( مثلا عکس سیاه سفید ) به علاوه عکس Unknown ( دلیل Unknown نامیدن این تصویر این است که نمیدانیم این عکس توسظ Generator تولید شده و یا تصویر اصلی رنگی ) می باشد .
پس بدین ترتیب شبکه ی Discriminator سعی دارد با دریافت یک عکس سیاه سفید و یک عکس رنگی ( تولید شده ی Generator و یا عکس رنگی اصلی ) عکس های جعلی را از اصلی تشخیص دهد .
از آنجایی که این شبکه در خروجی یک تابع Sigmoid دارد و مقادیر بین 0 تا 1 برمیگرداند ، در واقع قضاوت سخت گیرانه ای دارد یعنی حتی اگر تنها یک پیکسل تفاوت مشاهده کند خروجی را نزدیک به 0 نشان می دهد ،از این رو میتوانیم در خروجی به جای داشتن یک سیگموید از یک ماتریس 30 در 30 در 1 استفاده کنیم ، که هر عدد در این ماتریس میتواند بین اعداد 0 و 1 باشد ( یعنی در واقع به جای یک سیگموید 30 در 30 عدد سیگموید داریم ) که هرعدد نزدیک به 1 و یا نزدیک به 0 در این ماتریس به ترتیب بیانگر مساوی بودن یا نبودن 70 پیکسل در تصویر مورد مقایسه است . به عبارت ساده تر اگر اولین عدد این ماتریس ( خانه ی سطر 1 و ستون 1 ) 0.9 باشد ، بیانگر یکسان بودن 70 پیکسل اول تصویر است. ( از آنجایی که 70 * 30 یعنی 2100 عددی بزرگتر از 256 که سایز تصویر ماست ، می باشد ، overlap نیز وجود خواهد داشت)
تعریف خطای شبکه ی Discriminator :
از آنجایی که این شبکه وظیفه دارد عکس تولید شده ی Generator بگیرد و واقعی یا جعلی بودن آن را تشخیص دهد ، پس این مدل باید در راستای تشخیصِ درست دیتای اصلی از دیتای تولید شده ی Generator آموزش ببیند . پس بدین ترتیب 2 خطا برای این شبکه قابل تعریف و اعمال برای به روز رسانی وزن های آن می باشد :
1) خطای ناشی از تشخیص نادرست دیتای اصلی به عنوان دیتای جعلی .
2) خطای ناشی از تشخیص نادرست دیتای جعلی ( تولید شده ی Generator ) به عنوان دیتای اصلی .
اعمال این دو خطا را در شکل زیر میتوانید مشاهده نمایید .
تعریف خطای شبکه ی Generator
1) خطای ناشی از شکست در فریب دادن Discriminator :
با توجه به آنچه که گفته شد شبکه ی Generator باید بتواند عکس هایی تولید کند که شبکه ی Discriminator را فریب دهد ، به ظوری که شبکه ی Discriminator با گرفتن عکسی که Generator تولید می کند ، لیبل True به معنای اصلی بودن عکس برگرداند ، پس برگرداندن هر چیزی جز 1 برای Generator ، یک خطا محسوب می شود (چون در فریب دادن Discriminator موفق نبوده ) و قابل انتشار در شبکه ی Generator برای به روز رسانی وزن های آن است .
2) خطای ناشی از تفاوت عکس تولید شده با عکس واقعی :
علاوه بر این شبکه ی Generator باید بتواند تا حد امکان عکس های نزدیک به عکس واقعی تولید کند و فقط فریب دادن Discriminator نتیجه ی مطلوب نیست ، پس بدین ترتیب تفاوت عکسی که تولید می کند با عکس واقعی نیز خطایی قابل انتشار برای آموزش و بهتر شدن شبکه ی Generator می باشد .
در شکل زیر فرایند اعمال دو خطای تعریف شده مشاهده میگردد :
شبکه های اجتماعی