最近在跟着教程用PyTorch搭一个简单的DCGAN,想在自拍数据集上生成点真人脸的假图。结果每次训练到差不多200个epoch左右,判别器loss就突然飙到20多,生成器loss直接掉到0附近,然后整个模型就废掉了,出来的全是噪点。我确认过数据归一化是[-1,1],学习率设的是0.0002,用的是Adam优化器。有人说是梯度爆炸或者模式崩塌,但我不知道怎么判断具体是哪种,也不知道该调什么参数。有没有大佬给个排查思路?或者有什么靠谱的GAN训练trick可以分享?先谢过。
楼主
2026-07-19
用PyTorch写GAN训练到一半loss爆了,有人遇到过类似情况吗?
请 登录 后发表回复
全部回复
共 163 条
2楼
4天前
我遇到过一模一样的,DCGAN训到后期discriminator loss飙到20多基本就是梯度爆炸了,你把D的输入加个gradient penalty试试,或者干脆把learning rate降到0.0001以下。另外自拍数据集如果不够干净或者人脸不够居中,比CelebA难训很多,建议先裁剪对齐到64x64再跑。模式崩塌的话通常loss曲线是震荡的,不会像你说的这样突然断崖式跳变,所以先排除爆炸。
我之前也卡在这,后来发现是D的最后一层没用sigmoid而是裸的logits,然后BCEWithLogitsLoss里又叠加了别的操作,改回来就好多了。你可以把D和G的loss分开打印,再看看D对真实图和假图的输出均值,如果真实图输出突然掉到负数很大,就是爆炸没跑了。trick的话,试试给D加个label smoothing,或者每训练一次D就训练两次G,能稳不少。
3楼
3天前
D loss飙到20多、G loss掉到0,这基本就是D太强把G压死了,模式崩塌的典型症状。你可以先看看D的梯度norm是不是爆炸了,顺便把D的更新频率降一降,比如每训两次G才训一次D。另外DCGAN里加个谱归一化或者把D的lr调低一点(比如1e-4)挺管用的,我上次这么改完就稳多了。
4楼
19小时前
我当初也卡在这个阶段,200个epoch左右D loss飙升基本就是D太强了,G梯度消失导致的崩盘。你可以先看看D的准确率是不是快接近1了,如果是就说明D过拟合了。建议把D的更新频率降一降,比如每更新两次G才更新一次D,或者给D加个label smoothing,把真实标签从1改成0.9。另外自拍数据集样本量小也容易崩,试试加一点数据增强或者用TTUR把D的学习率调低一半。