以下是修复PyTorch GAN训练中进度条问题的代码示例:

for epoch in range(Epoch):
    d_epoch_loss = 0
    g_epoch_loss = 0
    count = len(dataloader)
    processBar = tqdm(dataloader, unit='step', total=count)
    for step, (img, _) in enumerate(processBar):
        img = img.to(device)
        size = img.size(0)
        random_noise = torch.randn(size, 100, device=device)
        d_optim.zero_grad()
        # 判别器输入真实图片
        real_output = Dis(img)
        # 判别器在真实图像上的损失
        d_real_loss = loss_function(real_output, torch.ones_like(real_output))
        d_real_loss.backward()
        gen_img = Gen(random_noise)
        fake_output = Dis(gen_img.detach())  # 判别器输入生成图片,fake_output对生成图片的预测
        # gen_img是由生成器得来的,但我们现在只对判别器更新,所以要截断对Gen的更新
        # detach()得到了没有梯度的tensor,求导到这里就停止了,backward的时候就不会求导到Gen了
        d_fake_loss = loss_function(fake_output, torch.zeros_like(fake_output))
        d_fake_loss.backward()
        d_loss = d_real_loss + d_fake_loss
        d_optim.step()
        g_optim.zero_grad()
        fake_output = Dis(gen_img)
        g_loss = loss_function(fake_output, torch.ones_like(fake_output))
        g_loss.backward()
        g_optim.step()

        with torch.no_grad():
            d_epoch_loss += d_loss.item()
            g_epoch_loss += g_loss.item()

    with torch.no_grad():  # 之后的内容不进行梯度的计算(图的构建)
        d_epoch_loss /= count
        g_epoch_loss /= count
        D_loss.append(d_epoch_loss)
        G_loss.append(g_epoch_loss)
        print('Epoch:', epoch+1)
        gen_img_plot(Gen, test_input, epoch == 0, (epoch == Epoch))
    processBar.close()

代码解释:

  1. tqdm(dataloader, unit='step', total=count): 使用tqdm库创建进度条,并设置 unit='step',表示进度条以步数为单位,total=count 则指定总步数。
  2. for step, (img, _) in enumerate(processBar): 在循环中,使用enumerate获取数据批次索引和数据,并将数据传递给进度条对象processBar,从而更新进度条。
  3. d_loss.item(), g_loss.item(): 在计算 epoch 损失时,使用 .item() 获取损失值,避免累积计算时出现张量类型错误。

常见问题及解决方法:

  • 进度条卡住或无法更新: 可能是由于进度条没有正确地与数据加载器交互。尝试使用 tqdm(dataloader, unit='step', total=len(dataloader)),并将 for 循环中的 enumerate 更改为 enumerate(processBar)
  • 进度条无法显示总步数: 尝试在创建进度条时使用 total=len(dataloader) 参数,明确指定总步数。

其他建议:

  • 可以使用 leave=True 参数,让进度条在训练结束后保留。
  • 可以使用 desc='Training' 参数,在进度条前面显示描述信息。

通过以上代码和解释,您可以有效地解决PyTorch GAN训练中进度条的问题,并更直观地观察训练进度。

修复PyTorch GAN训练中的进度条问题

原文地址: https://www.cveoy.top/t/topic/nF7K 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录