训练GAN时遇到的一些问题(更新中……)

一、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博客

WGAN-GP方法介绍_子燕若水的博客-CSDN博客

十二、评价指标:

参考博客:Text to Image 文本生成图像定量评价指标分析笔记 Metric Value总结 IS、FID、R-prec等_图像生成评价指标_中杯可乐多加冰的博客-CSDN博客

【pytorch】FID讲解以及pytorch实现_fid pytorch_求求你来BUG行不行的博客-CSDN博客

十三、transforms

参考博客:神经网络数据增强transforms的相关操作(持续更新)_randomhorizontalflip_燃烧吧哥们的博客-CSDN博客

十四、深度学习调参经验

参考博客:

深度学习调参经验_adamw参数设置_怅然若失的猴的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>