You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GAN训练首个epoch Generator与Discriminator损失最低是否正常?

简易GAN训练异常问题排查

训练时观察到生成器、判别器损失在第一个epoch达到最低值,后续无收敛迹象,首次训练损失曲线如下:
首次训练GAN损失曲线

按建议调整代码后训练效果无改善,同时调用torch.ones()时报错argument size (position 1) must be tuple of ints, not Tensor,10轮训练后损失曲线如下:
二次训练GAN损失曲线

核心代码错误

  • 可视化对象错误:代码中vutils.make_grid传入的是fake_samples_labels(全0/全1的分类标签张量),而非生成器输出的假样本图,全程没有正确可视化生成结果,无法通过视觉判断生成效果。
  • 训练梯度串流:训练判别器时,前向传播传入的fake_samples没有做detach()操作,反向传播计算判别器损失时梯度会同步回传到生成器,等于训练判别器的步骤也在修改生成器参数,完全打乱了GAN交替训练的逻辑。
  • 日志打印逻辑错误:当前代码用n == batch_size - 1作为epoch结束的打印判断条件,n是dataloader的批次序号,batch_size是单批样本数32,既不能正确匹配epoch的结束位置,也无法正确统计每轮的损失值。额外定义的epochs变量每步迭代都累加,完全不代表实际训练轮次。
  • torch.ones()报错原因:该接口要求传入的形状参数必须是整数构成的元组,报错原因是传参时把张量类型的值当成了维度参数传入,只要保证传入的batch_size是整数类型即可解决。

首epoch损失触底的原因

训练初期判别器还未学会区分真实样本和生成样本,两边损失值天然处于低位;但由于上述梯度串流、逻辑错误的问题,训练很快进入失衡状态:要么判别器快速过拟合,能100%判别所有生成样本为假,生成器无法拿到有效梯度更新;要么两边参数更新互相干扰,直接进入模式崩溃状态,损失长期卡在高位震荡,不会继续收敛。
另外当前使用的全连接层结构拟合能力有限,学习28*28尺寸的RGB图像分布本身就容易出现欠拟合、训练不稳定的问题。

关键修正代码

# ---------- 判别器训练段修正 ----------
discriminator.zero_grad()
output_discriminator_real = discriminator(real_samples) 
loss_discriminator_real = loss_function(output_discriminator_real, real_samples_labels)  

# 对生成样本加detach,切断生成器梯度路径,避免训练判别器时改动生成器参数
output_discriminator_fake = discriminator(fake_samples.detach())  
loss_discriminator_fake = loss_function(output_discriminator_fake, fake_samples_labels) 

loss_discriminator = (loss_discriminator_real + loss_discriminator_fake)/2        
loss_discriminator.backward()
optimizer_discriminator.step()

# ---------- 生成样本可视化修正 ----------
# 把原来传入的fake_samples_labels换成生成器输出的fake_samples
image_list.append(vutils.make_grid(fake_samples, padding=2, normalize=True))

# ---------- 日志打印逻辑修正 ----------
# 删除多余的epochs计数变量,用dataloader总长度判断epoch结束位置
if n == len(train_loader) - 1:
    # 取item()把张量转成数值打印,避免占用计算图内存
    print(f"Epoch: {epoch} Loss D.: {loss_discriminator.item()}")
    print(f"Epoch: {epoch} Loss G.: {loss_generator.item()}")

训练优化建议

  • 优化器参数调整为GAN训练常用配置:Adam学习率设为2e-4,betas=(0.5, 0.999),比当前默认参数稳定性更高。
  • 不要用损失值高低判断GAN收敛状态:正常训练的GAN两个网络的损失会长期在固定区间震荡,需要每隔2-3轮保存生成的样本图,通过视觉效果判断生成质量。
  • 若后续生成效果仍不理想,可以把全连接结构替换为DCGAN的卷积结构,对图像数据的拟合能力远强于全连接网络,训练稳定性也更高。

内容的提问来源于stack exchange,提问作者Sterik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:48:10