修复PyTorch GAN训练中的进度条问题
以下是修复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()
代码解释:
tqdm(dataloader, unit='step', total=count): 使用tqdm库创建进度条,并设置unit='step',表示进度条以步数为单位,total=count则指定总步数。for step, (img, _) in enumerate(processBar): 在循环中,使用enumerate获取数据批次索引和数据,并将数据传递给进度条对象processBar,从而更新进度条。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训练中进度条的问题,并更直观地观察训练进度。
原文地址: https://www.cveoy.top/t/topic/nF7K 著作权归作者所有。请勿转载和采集!