训练 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()
  • 遍历各轮与真实数据批次,计算当前批大小
  • 重置判别器优化器梯度
  • 计算判别器损失
  • 反向传播并执行判别器优化步
  • 重置生成器优化器梯度
  • 计算生成器损失
  • 反向传播并执行生成器优化步
使用 PyTorch 进行图像深度学习

Vamos praticar!

使用 PyTorch 进行图像深度学习

Preparing Video For Download...