GAN训练首个epoch Generator与Discriminator损失最低是否正常?
简易GAN训练异常问题排查
训练时观察到生成器、判别器损失在第一个epoch达到最低值,后续无收敛迹象,首次训练损失曲线如下:
按建议调整代码后训练效果无改善,同时调用torch.ones()时报错argument size (position 1) must be tuple of ints, not Tensor,10轮训练后损失曲线如下:
核心代码错误
- 可视化对象错误:代码中
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
相关产品推荐
相关产品推荐

