چیتشیت
مدلهای GAN از DCGAN تا StyleGAN
GANs from DCGAN to StyleGAN
توابع زیان، کد DCGAN، مدلهای Pix2Pix، CycleGAN و StyleGAN. مقادیر پیشفرض، نشانههای شکست و راهحلها.
فهرست مطالب
مولد StyleGAN
معمارییک گام آموزش
گامبهگام- نمونهبرداریگرفتن یک دسته دادهی واقعی و نوفهی
zاز N(0, I). - گام Dامتیازدهی به تصاویر واقعی در برابر 1 و
G(z).detach()در برابر 0. - گام Gتولید نمونههای جعلی تازه. امتیازدهی به
D(G(z))در برابر 1. - تکراریک گام D، سپس یک گام G، در هر دسته.
- آزمون ارزیابیهر 100 گام، شمارش نمونهها در هر مُد. هشدار در صورت کمتر بودن از 50.
- بررسیمشاهدهی 64 نمونه در پایان هر دوره (epoch).
- تعادلبرابری
p_G = p_dataو خروجی 0.5 برای D در همهجا.
توابع زیان و فرمولها
مفهومها- مینیماکس
- $\min_G \max_D \; \mathbb{E}_x[\log D(x)] + \mathbb{E}_z[\log(1 - D(G(z)))]$
- تابع زیان D
- آنتروپی متقاطع دودویی با real = 1 و fake = 0.
- تابع زیان G
- مقداری برابر با $-\log D(G(z))$. این فرم غیراشباعکننده است.
- مدل WGAN
- تابع $\text{loss}_D = \mathbb{E}[D(\text{fake})] - \mathbb{E}[D(\text{real})]$ و $\text{loss}_G = -\mathbb{E}[D(\text{fake})]$
- تابع زیان G در Pix2Pix
- $-\log D(x, G(x)) + \lambda \cdot \lVert y - G(x) \rVert_1$
- سازگاری چرخهای
- $F(G(x)) \approx x$ و $G(F(y)) \approx y$.
- فرمول AdaIN
- $y_{\text{scale}} \cdot \frac{x - \mathrm{mean}(x)}{\mathrm{std}(x)} + y_{\text{bias}}$
- کوتاهسازی
- رابطه $w' = \hat{w} + \psi \cdot (w - \hat{w})$. شرط $\psi < 1$ تنوع را فدای کیفیت میکند.
تابع train_step در DCGAN
کدpython
opt_d.zero_grad()
d_real = D(real) # لاجیتها، استفاده از سیگموئید فقط درون تابع زیان
d_fake = D(G(z).detach()) # هیچ گرادیانی وارد G نمیشود
loss_d = (F.binary_cross_entropy_with_logits(d_real, torch.ones_like(d_real))
+ F.binary_cross_entropy_with_logits(d_fake, torch.zeros_like(d_fake)))
loss_d.backward()
opt_d.step()
opt_g.zero_grad()
d_fake = D(G(z)) # گذر دوم گراف را نگه میدارد
loss_g = F.binary_cross_entropy_with_logits(d_fake, torch.ones_like(d_fake))
loss_g.backward() # تابع زیان غیراشباعکننده برای G
opt_g.step()
وظایف در قالب کد
کار و کد| وظیفه | کد |
|---|---|
| ساخت مولد | Generator(z_dim=64, img_channels=3, feat=32) |
| پوشش کانولوشن D با SN | spectral_norm(c) |
| ساخت بهینهسازها | Adam(lr=2e-4, betas=(0.5, 0.999)) |
| نمونهبرداری در حالت eval | sample(G, n=8, z_dim=z_dim, device=device) |
| شمارش پارامترها | sum(p.numel() for p in G.parameters()) |
| شرطیسازی G یا D | inp = z + one_hot(c, num_classes) |
| نگاشت z به w | w = mapping(z, mapping_net) |
| کوتاهسازی w | w_bar[i] + psi * (w_test[i] - w_bar[i]) |
مقایسهی چهار مدل GAN کنار هم
مقایسه| فاکتور | DCGAN | Pix2Pix | CycleGAN | StyleGAN |
|---|---|---|---|---|
| ورودی | نوفهی z | تصویر x، دراپاوت به عنوان نوفه | تصویر از دامنهی X | نگاشت z به w |
| مولد | کانولوشنهای ترانهاده، خروجی با tanh | شبکهی U-Net با اتصالات میانبُر | تبدیل G: X to Y و F: Y to X | مقدار ثابت به همراه AdaIN در هر بلوک |
| تابع زیان اضافی | ندارد | ضریب λ در L1 | سازگاری چرخهای | تنظیم طول مسیر در StyleGAN2 |
| داده | فقط تصاویر | جفتشده (x, y) | غیرجفتشده | دامنهی محدود، چهرهها |
| کاربرد | خط مبنا برای 32x32 | طرح اولیه به عکس واقعی | اسب به گورخر، فصلها | چهرههای واقعگرایانه، ویرایش تصویر |
یک گذر در برابر گامهای متعدد
مقایسه| فاکتور | Pix2Pix | SD-Img2Img | SDXL-Turbo | ControlNet + SDXL |
|---|---|---|---|---|
| گامها | 1 | 20 | 1-4 | 20-30 |
| ابعاد 512² روی یک پردازندهی L4 | حدود 30 میلیثانیه | حدود 1.2 ثانیه | حدود 0.15-0.35 ثانیه | حدود 3-5 ثانیه |
مقادیر پیشفرض
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
Adam `lr` | 2e-4 | پیشفرض DCGAN برای G و D |
Adam `betas` | (0.5, 0.999) | مقدار کم برای beta1 |
z_dim | 64 | نوفه برای مدل 32x32 DCGAN |
D LeakyReLU slope | 0.2 | تمام لایههای D |
Pix2Pix λ on L1 | 100 | شروع از اینجا، کاهش تدریجی |
PatchGAN field | ~70×70 | تعداد پیکسل به ازای هر سلول خروجی |
Truncation ψ | 0.7 | استفاده از 1.0 برای حفظ تنوع |
TTUR ratio | 2-4 | یادگیری سریعتر D نسبت به G |
عیبیابی
عیبیابیزیان D پایین، نوسان زیان G، افت تنوع
- علت
- فروپاشی مُد
- راهحل
- تبعیض مینیدسته، بهنجارسازی طیفی، برچسبها
دقت D حدود 100٪، زیان G بالا و بدون تغییر
- علت
- پیروزی D بر G
- راهحل
- کوچکتر کردن D، کاهش نرخ یادگیری D، هموارسازی برچسبها
نوسان هر دو زیان بدون روند مشخص
- علت
- نوسان شدید
- راهحل
- استفاده از TTUR یا فاصلهی واسرشتاین
دقت D بالای 95٪
- علت
- قدرت بیش از حد D
- راهحل
- کاهش نرخ یادگیری D به میزان 2 تا 5 برابر
یکی از مُدهای واقعی هرگز ظاهر نمیشود
- علت
- حفظ کردن یک مُد توسط G
- راهحل
- افزودن نوفه به ورودیهای D، یا WGAN-GP
خروجی شرط را نادیده میگیرد
- علت
- سیگنال شرطی ضعیف در D
- راهحل
- شرطیسازی زودهنگام D، استفاده از تصویرسازی D
تاری خروجی Pix2Pix
- علت
- وزن بیش از حد زیان L1
- راهحل
- کاهش تدریجی λ پس از رسیدن به پایداری
دستسازههای قطرهای (droplet)
- علت
- صفر شدن میانگین توسط AdaIN
- راهحل
- مدولاسیونزدایی وزنها در StyleGAN2
اصطلاحات
اصطلاحها- DCGAN
- کانولوشنهای استرایددار، بهنجارسازی دستهای، ReLU در G و LeakyReLU در D.
- WGAN-GP
- فاصلهی واسرشتاین به همراه جریمهی گرادیان.
- SN
- بهنجارسازی طیفی (spectral norm). ثابت لیپشیتز هر لایهی D را محدود میکند.
- TTUR
- قاعدهی بهروزرسانی دو مقیاس زمانی. استفاده از دو نرخ یادگیری مختلف.
- cGAN
- مدل GAN شرطی. هر دو شبکهی G(z, c) و D(x, c) شرط ورودی را میبینند.
- PatchGAN
- مدل D یک شبکهی N × N از امتیازهای هر پچ تولید میکند.
- AdaIN
- بهنجارسازی نمونهای تطبیقی. بهنجارسازی و سپس تغییر مقیاس و شیفت با w.
- FID
- معیار Fréchet Inception Distance؛ هرچه کمتر باشد بهتر است.
چه زمانی از چه مدلی استفاده کنیم
نکتهها- GAN: تولید تصویر بلادرنگ زیر 10 میلیثانیه، انتقال سبک، تبدیل تصویر به تصویر.
- StyleGAN3: چهرههای واقعی انسان با ژست و زاویهی ثابت.
- Pix2Pix: هزاران نمونهی دادهی جفتشده، یک وظیفهی محدود و استنتاج سریع.
- CycleGAN: تبدیل تصویر به تصویر بدون دادههای جفتشده.
- شبکهی نگاشت فریزشده: انطباق دامنه تنها با چند تصویر معدود.
- دیفیوژن یا تطبیق جریان: مسائل چندوجهی یا بدون ساختار مشخص.
پرسشها
پرسش و پاسخ- چرا در گام D از
G(z).detach()استفاده میشود؟ - مانع از جریان گرادیان به G هنگام بهروزرسانی D میشود.
- چرا تابع زیان غیراشباعکننده به کار میرود؟
- در اوایل آموزش مقدار
D(G(z))نزدیک به صفر است؛ تابع زیان اولیهی G دچار محوشدگی گرادیان میشود. - چرا قبل از نمونهبرداری به حالت eval میرویم؟
- تا بهنجارسازی دستهای از آمارههای انباشته استفاده کند.
- چرا D جفت (x, y) را میبیند؟
- بدون دیدن x، مدل D قادر به سنجش سازگاری خروجی نیست.
- چرا StyleGAN هنوز کاربرد دارد؟
- فقط یک گذر رو به جلو دارد. تولید چهرهی 1024² زیر 10 میلیثانیه روی یک کارت 4090.
- آیا GAN میتواند مقدار p(x) را بدهد؟
- خیر، این یک مدل چگالی ضمنی است و فقط نمونهبرداری میکند.