AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
50/100 第五週:📌 生成對抗網路 GAN
50.小結與測驗:DCGAN 生成人臉圖像 🧑🎨 創造屬於自己的虛擬角色!
🌟 單元小結總覽:GAN 圖像生成核心篇(41~49)
🥊 41 GAN 對抗思維 G(生成器) vs. D(判別器)➜ 模仿騙子與警察訓練邏輯
🏗 42 生成器與判別器架構➜ G 用轉置卷積生成圖像;D 用卷積學會辨識真假
🎯 43 損失函數與訓練技巧➜ 對抗損失 + 循環一致性 + 模式崩潰的預防
🎨 44 DCGAN 原理與應用➜ 最常見入門架構,擅長生成臉、動漫等圖像
🎯 45 cGAN 有條件生成➜ 結合類別條件(如 0~9),控制生成結果
💅 46 StyleGAN風格革命➜ 高解析度虛擬臉孔、可分層控制樣貌與風格
🐴 47 CycleGAN 圖像轉換➜ 無需配對資料即可進行風格轉換(馬↔斑馬)
⚠ 48 訓練不穩解法➜ 判別器太強會導致 G 無法學習,需技巧調整
🌈 49 娛樂與藝術應用➜ GAN 廣泛應用於漫畫、動畫、虛擬偶像等產業
________________________________________
🧪 單選題測驗(每題皆附解析)
1️⃣ 為什麼 GAN 模型會出現「模式崩潰」?
A. 判別器輸出太慢
B. 使用了 cGAN
✅ C. 生成器只學會產生單一樣式圖像
D. 使用了 CycleGAN
📘 解析:
模式崩潰(Mode Collapse)指的是 G 產生的圖像缺乏多樣性,只重複產出少數固定模式。這常因 G 缺乏有效回饋或過度擬合某些樣本而產生。
________________________________________
2️⃣ 下列哪一項是 Conditional GAN (cGAN) 的特點?
A. 可處理語音轉文字任務
✅ B. 根據類別條件控制生成結果
C. 不需要判別器
D. 使用 Style Transfer 模型
📘 解析:
cGAN 的核心設計是讓 G 和 D 都輸入條件向量 y,例如數字、類別或文字描述,用於生成「指定類別」的圖像。
________________________________________
3️⃣ StyleGAN 中的「前段層」主要控制什麼?
A. 圖像亮度與飽和度
✅ B. 臉型輪廓與大結構
C. 判別真假
D. 輸出圖像解析度
📘 解析:
StyleGAN 採用風格分層控制,前段控制大結構(臉型、構圖),中層控制五官,後層則調整紋理與雜訊。
________________________________________
4️⃣ CycleGAN 最大優勢是什麼?
A. 不需要 GPU
B. 適用於分類任務
✅ C. 不需要成對資料也能進行圖像轉換
D. 可產出語音合成結果
📘 解析:
CycleGAN 使用「循環一致性損失」,讓模型能夠在沒有資料一對一對應的情況下,也能學會風格轉換。
________________________________________
5️⃣ 若訓練時判別器太強會發生什麼?
A. G 的輸出會變漂亮
✅ B. G 無法學習,梯度消失
C. 訓練更穩定
D. 模型變成分類器
📘 解析:
當 D 太強,會使 G 難以得到有用的回饋訊號(梯度幾乎為 0),導致訓練卡住,G 無法改善圖像品質。
________________________________________
🎨 示範任務:用 DCGAN 生成人臉圖像 🧑🎨
「創造屬於你的虛擬角色」
✅ Step 1:安裝必要工具
bash
pip install torch torchvision matplotlib
________________________________________
✅ Step 2:建立簡化版生成器
import torch
import torch.nn as nn
from torchvision.utils import make_grid
import matplotlib.pyplot as plt
# 生成器模型
class Generator(nn.Module):
def __init__(self):
super().__init__()
self.main = nn.Sequential(
nn.ConvTranspose2d(100, 128, 4, 1, 0),
nn.BatchNorm2d(128),
nn.ReLU(True),
nn.ConvTranspose2d(128, 64, 4, 2, 1),
nn.BatchNorm2d(64),
nn.ReLU(True),
nn.ConvTranspose2d(64, 3, 4, 2, 1),
nn.Tanh()
)
def forward(self, x):
return self.main(x)
# 初始化模型與隨機輸入
netG = Generator()
z = torch.randn(64, 100, 1, 1) # 批次生成64張圖像
fake_imgs = netG(z).detach()
# 顯示結果
grid = make_grid(fake_imgs, nrow=8, normalize=True)
plt.figure(figsize=(8,8))
plt.axis("off")
plt.title("DCGAN 生成的人臉圖像")
plt.imshow(grid.permute(1, 2, 0).cpu())
plt.show()
________________________________________
🎯 任務挑戰:
1. 將 ConvTranspose2d 結構擴展,使圖像解析度變為 64x64。
🛠 方法:
疊加更多層 nn.ConvTranspose2d,並調整 stride=2、padding=1、kernel_size=4
典型流程:
z → 4×4 → 8×8 → 16×16 → 32×32 → 64×64
2. 調整 z 的向量值(如改變標準差),觀察圖像風格是否有變化。
🔍 實驗方式:
原本 z ~ N(0, 1)
改為 z ~ N(0, 0.5)(較集中)或 z ~ N(0, 2)(較分散)
🎨 觀察結果:
較小 std → 圖像變得一致、保守、細節少
較大 std → 圖像風格多樣性上升,但也可能不穩定、失真
有助於探索潛在空間風格邊界
3. 使用 CelebA 或 FFHQ 預訓練模型微調結果,生成更高品質虛擬角色。
📦 操作建議:
下載 StyleGAN2 的 CelebA-HQ / FFHQ 預訓練模型
使用少量新資料進行微調(fine-tune),調整 W 空間分布
或固定生成器,僅訓練映射網路(projection)加快收斂
🎯 效果:提升人物五官自然度、細節紋理與一致性,更適合用於虛擬偶像、個人化角色生成