訓練 GAN

使用 PyTorch 進行影像深度學習

Michal Oleszak

Machine Learning Engineer

產生器目標

 

 

GAN 工作流程圖。

  • 目標:生成能騙過鑑別器的假圖
  • 構想:用鑑別器回饋評估產生器表現
  • 鑑別器對產生器輸出的判定:
    • 真(標籤 1)-好,損失小
    • 假(標籤 0)-差,損失大
使用 PyTorch 進行影像深度學習

產生器損失

def gen_loss(gen, disc, num_images, z_dim):

noise = torch.randn(num_images, z_dim)
fake = gen(noise)
disc_pred = disc(fake)
criterion = nn.BCEWithLogitsLoss()
gen_loss = criterion( disc_pred, torch.ones_like(disc_pred) ) return gen_loss
  • 定義隨機雜訊
  • 產生假影像
  • 取得鑑別器對假影像的預測
  • 使用二元交叉熵(BCE)準則
  • 產生器損失:鑑別器預測與一個全 1 張量之間的 BCE
使用 PyTorch 進行影像深度學習

鑑別器目標

 

 

GAN 工作流程圖。

  • 目標:正確分類假圖與真圖
  • 產生器輸出應被判為假(標籤 0
  • 真實影像應被判為真(標籤 1
使用 PyTorch 進行影像深度學習

鑑別器損失

def disc_loss(gen, disc, real, num_images, z_dim):

criterion = nn.BCEWithLogitsLoss()
noise = torch.randn(num_images, z_dim)
fake = gen(noise)
disc_pred_fake = disc(fake)
fake_loss = criterion( disc_pred_fake, torch.zeros_like(disc_pred_fake) )
disc_pred_real = disc(real)
real_loss = criterion( disc_pred_real, torch.ones_like(disc_pred_real) )
disc_loss = (real_loss + fake_loss) / 2 return disc_loss
  • 定義二元交叉熵準則
  • 產生供產生器使用的輸入雜訊
  • 產生假圖
  • 取得鑑別器對假圖的預測
  • 計算假圖損失項
  • 取得鑑別器對真圖的預測
  • 計算真圖損失項
  • 最終損失為真、假損失項的平均
使用 PyTorch 進行影像深度學習

GAN 訓練迴圈

for epoch in range(num_epochs):
    for real in dataloader:
        cur_batch_size = len(real)


disc_opt.zero_grad()
disc_loss = disc_loss( gen, disc, real, cur_batch_size, z_dim=16)
disc_loss.backward() disc_opt.step()
gen_opt.zero_grad()
gen_loss = gen_loss( gen, disc, cur_batch_size, z_dim=16)
gen_loss.backward() gen_opt.step()
  • 迴圈遍歷各 epoch 與真實資料批次,計算當前批次大小
  • 重設鑑別器最佳化器的梯度
  • 計算鑑別器損失
  • 計算鑑別器梯度並執行最佳化步驟
  • 重設產生器最佳化器的梯度
  • 計算產生器損失
  • 計算產生器梯度並執行最佳化步驟
使用 PyTorch 進行影像深度學習

一起來練習吧!

使用 PyTorch 進行影像深度學習

Preparing Video For Download...