一、GAN网络在训练的时候D的loss在不断的减小,G的loss在不断增加怎么办?
这是因为判别器太强了,无法给G有效的指导,所以需要适当降低D的网络能力:
1 减小D的层数,但是减的太过了也会出现最后无法指导G的情况
2 减小D的学习率
在训练的过程中又出现了G和Dloss不按照正常的情况下降和上升:
网上查找的原因是:种情况是判别器太强了,压制了生成器。
查询资料后总结的方法
1 提升G的学习率,降低D的学习率。
2 G训练多次,D训练一次。
3 使用一些更先进的GAN训练目标函数。
当模型分布的支持与目标分布(真实图像)的支持不相交时,存在一个能够很好区分模型分布和目标分布的discriminator,在这种情况下,discriminator对输入的导数为0,这样generator的训练会完全停止。也可能不停止,但是一般D loss会变为0,G loss一直波动,甚至有可能爆炸,生长,这会导致GAN的训练非常困难
GAN判别器损失越低越好?
在GAN网络中,生成器和判别器是相互博弈的关系,生成器一直在学习造假技术,企图以假乱真,而判别器一直在学习鉴别技术,希望能辨别真假。对于判别器,判别器损失越低,意味着它的分类能力越好。对于生成器,它的目标是尽可能地欺骗判别器,所以生成器希望判别器的损失越高越好。我们假设一个理想情况,如果你的生成器生成的内容足够好,好到能以假乱真,这也是你想要的情况,在这个情况下,判别器自然是无法轻易辨别真伪的,因为你生成的内容实在是太好了,判别器既然做不到辨别真伪,那它肯定是一直有损失的。
因此,判别器损失越来越低不一定是好事情,它需要在生成器和判别器之间找到一个平衡点,才能得到最好的生成结果。
判别器损失趋近于0是为什么?
很多同学的GAN网络判别器损失可能会出现趋近于0的情况,这说明判别器太强了,判别器太强的结果就是无法给生成器提供有效的指导,这就需要我们需要适当降低判别器的网络能力,比如说简化判别器网络结构,降低参数量,或者减小判别器的学习率。
二、复现CGAN代码时一些和标签有关的问题
引入标签时要用到整数:例如MNIST的标签是0-9的十个整数,不允许出现1.4或1.5这种的情况,即需要使用这类功能
round 四舍五入
floor 向下取整
ceil 向上取整
a = torch.tensor(1.14)
a.floor() 是 tensor(1.)
a.ceil() 是 tensor(2.)
a = torch.tensor(1.499)
a.round() 是 tensor(1.)
a = torch.tensor(1.5)
a.round() 是 tensor(2.)
三、torchvision版本导致预训练模型不能使用的问题
有时候会在D中套用一个分类模型,基本上用的是放在torchvision.models中的预训练模型。版本不同的torchvision存着不同的模型,图一是老版本的,图二是新版本,对比起来明显新版本可用的预训练模型多很多,如果找不到的话建议更新。
至于torch和torchvision版本对应情况,CSDN和官方都有,我当时看的这篇:
Pytorch环境配置——cuda、、cudnn、torch、torchvision对应版本(最全)及安装方法_torch和cuda版本对应_William.csj的博客-CSDN博客
四、拥有多GPU时候,把整个GAN完全放到某个GPU中跑
import os
os.environ['CUDA_VISIBLE_DEVICES']='0,1,2,3'
cuda = True if torch.cuda.is_available() else False #查看cuda是否可用
generator = Generator() #创建G模型
discriminator = Discriminator()#创建D模型
generator.cuda()#GPU加速G模型
discriminator.cuda()#GPU加速D模型
FloatTensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor #在GPU上生成Tensor
如果我们要让模型完全在显卡1上跑,则需要加以下几句话
torch.cuda.set_device(1)
#这句话的意思是让cuda指定到1显卡中使用
#不加的话默认是显卡0,则Tensor会在显卡0上生成
#这会使得显卡0占用部分显存
generator = nn.DataParallel(generator,device_ids=[1])
discriminator = nn.DataParallel(discriminator,device_ids=[1])
参考博客:在GPU上运行pytorch程序(指定单/多显卡)_torch.device多显卡_华科附小第一名的博客-CSDN博客
五、“Assertion input_val >= zero && input_val <= one failed”报错
问题:意思是模型需要一个(0,1)之间的数,但你给的不在这个区间(就好比根号里是需要大于等于0的数,但你给了-1)
原因:大概率是因为把损失函数设置成了BCELoss
解决:
1.在不改变损失函数的情况下,在判别器最后的输出层加一个sigmoid函数
2.直接改损失函数,MSELoss就行或者其他的
六、使用AdaptiveAvgPool2d的相关问题
模拟resnet,但是使用了,然后输出变成了batch乘以维度,使用output.flatten(start_dim=1)即可解决
这里后来我思考了以下,这边经过一个AdaptiveAvgPool2d后,形成的tensor的dimension应该是[batch_size, channels, 1, 1],用squeeze的愿意是希望将tensor的最后两个维度去掉,边进行全连接层的计算。
于是将这一行改为:
output = self.fc(output.flatten(start_dim=1))#这一行出错
参考博客:PyTorch模型转ONNX后再转TensorRT遇到的几个报错_tensorrt 如何定位那个算子出错?_森尼嫩豆腐的博客-CSDN博客
七、多模型分类结果投票融合
投票策略:三个模型的输出,假设有两个及以上模型预测出相同的标签,即将这个标签作为一个最后预定的标签。少数服从多数原则
参考博客:多模型分类结果投票融合_多模型投票_小千不爱内卷的博客-CSDN博客
模型投票融合代码_后期融合投票_一个关注技术成长的小博主的博客-CSDN博客
八、Pytorch —— AttributeError: ‘DataParallel’ object has no attribute ‘xxxx’
参考博客:【Bug解决】AttributeError: ‘DataParallel‘ object has no attribute ‘XXX‘_不吃饭就会放大招的博客-CSDN博客Pytorch —— AttributeError: ‘DataParallel’ object has no attribute ‘xxxx’_attributeerror: 'dataparallel' object has no attri_Chris_zhangrx的博客-CSDN博客
九、loss = nn.CrossEntropyLoss(reduction=‘none‘)
参考博客:loss = nn.CrossEntropyLoss(reduction=‘none‘)_hlllllllhhhhh的博客-CSDN博客
十、生成对抗网络GAN论文总结+复现代码
参考博客:生成对抗网络GAN论文总结+复现代码(已完成28篇,未完待续。。。)_对抗神经网络gan以及后续论文_iiiiiiimp的博客-CSDN博客
十一、WGAN,WGAN-GP
参考博客:【Pytorch】(十)生成对抗网络之WGAN,WGAN-GP_wgan-gp pytorch_二进制人工智能的博客-CSDN博客
十二、评价指标:
参考博客:Text to Image 文本生成图像定量评价指标分析笔记 Metric Value总结 IS、FID、R-prec等_图像生成评价指标_中杯可乐多加冰的博客-CSDN博客
【pytorch】FID讲解以及pytorch实现_fid pytorch_求求你来BUG行不行的博客-CSDN博客
十三、transforms
参考博客:神经网络数据增强transforms的相关操作(持续更新)_randomhorizontalflip_燃烧吧哥们的博客-CSDN博客
十四、深度学习调参经验
参考博客: