GANの学習

PyTorch で学ぶ画像向け Deep Learning

Michal Oleszak

Machine Learning Engineer

生成器の目的

 

 

GANのワークフロー図。

  • 目的:識別器を欺く偽物を生成
  • 考え方:識別器で生成器の性能を評価
  • 生成器の出力に対する識別器の分類:
    • 実(ラベル 1)— 良い、小さい損失
    • 偽(ラベル 0)— 悪い、大きい損失
PyTorch で学ぶ画像向け Deep Learning

生成器の損失

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 で学ぶ画像向け Deep Learning

識別器の目的

 

 

GANのワークフロー図。

  • 目的:偽と実を正しく分類
  • 生成器の出力は偽(ラベル 0)と分類されるべき
  • 実画像は実(ラベル 1)と分類されるべき
PyTorch で学ぶ画像向け Deep Learning

識別器の損失

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 で学ぶ画像向け Deep Learning

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()
  • エポックと実データのバッチを反復し、現在のバッチサイズを取得
  • 識別器オプティマイザの勾配をリセット
  • 識別器の損失を計算
  • 勾配計算と最適化ステップを実行(識別器)
  • 生成器オプティマイザの勾配をリセット
  • 生成器の損失を計算
  • 勾配計算と最適化ステップを実行(生成器)
PyTorch で学ぶ画像向け Deep Learning

Passons à la pratique !

PyTorch で学ぶ画像向け Deep Learning

Preparing Video For Download...