GAN--提升GAN训练的技巧汇总

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

前言

GAN模型相比较于其他网络一直受困于三个问题的掣肘:

 1. 不收敛;模型训练不稳定,收敛的慢,甚至不收敛;

 2. mode collapse; 生成器产生的结果模式较为单一;

 3. 训练缓慢;出现这个原因大多是发生了梯度消失的问题;

本文主要以下几个方面入手,聚焦于解决以上三个问题的一些技巧:

  • 改变损失函数,更换更好的优化目标

  • 在损失函数中增加额外的惩罚机制或者正则手段

  • 避免过拟合

  • 更好的优化模型

  • 使用监督学习

01

特征匹配

生成器试图生成最好的图像来欺骗鉴别器。当两个网络不断对抗时,“最佳”图像会不断变化。然而,优化可能变得过于贪婪,并使其成为永无止境的猫捉老鼠游戏。这是模型未收敛且模式崩溃的情景之一。

特征匹配改变了生成器的损失函数,以最小化真实图像的特征与生成的图像之间的统计差异。通常,我们测量其特征向量均值之间的L2距离。因此,特征匹配将目标从零和博弈扩展到真实图像中的匹配特征。下面是特征匹配新的目标函数:

a1e99a677446ef04b0ec9841c557bee7.png

其中$f(x)$是一个从判别器D中提取出来的特征向量,如下图所示:

baee7b10cde7b9f08a86981e8e25d66f.png

训练过程中,每个batch计算实际图像特征的平均值,每个batch都会有波动,可以减轻mode collapse,特征匹配它引入了随机性,使得鉴别器更难以过拟合。

当GAN的训练不稳定时,使用特征匹配是很有效的。

02

减小判别器的batch

出现mode collapse时,生成的图像看起来都差不多,为了缓解这个问题,我们将不同batch的实际图像和生成的图像分别送入判别器,并计算图像x与同一批次图像的相似度。我们在鉴别器的一个密集层中附加相似度9aa8dc9016cd9333cbda7c19d5cd394f.png,以分类该图像是真实的还是生成的。 

85f2b9817c0fa4f2a048ace655415adb.png

如果出现了mode collapse,则生成的图像的相似性增加。如果模式崩溃,则鉴别器可以使用这个值来检测出生成的图像不够好进而给生成器更多的惩罚。

图像d7f936bcea07f268a4b2a0bdb4f54de6.png与同一批次中的其他图像之间的相似度f7b87e923cb4b39bf502106ee617adec.png由变换矩阵T计算。

88ecaac93550ed31c1920391589f131b.png

在上图中,7a3f938b8c41356ec40b92e8ed998e18.png是输入的图像,4d7a14376ad30e55d3732c32d1f73559.png是同一个batch里剩下的部分。使用变换阵T去转换特征741a9c08bc7f6cc30854d08bc7aeffcd.png1d4d3fdef6349f4699fcc17a44381387.png(维度B*C):  

eb279bd4da5842b5fb7674d79ecf9853.png

进而,我们可以使用L1-norm得出图像i和图像j之间的相似度5364095064deca8238d89e9370b60875.png809726b487cab219e221493f2a91e703.png

图像935f47f0bd11592a2a502325d3f4c727.png和同一个batch里的图像的相似度6a7f52fb17d703745bdf95cf1ee06c60.png是:

4b7b29938f1c3b1d5f98a12c7db9ce20.png以下是公式总览:

e3b5771f22019e754429660fd042360c.png

引自paper:Improved Techniques for Training GANs

Minibatch的判别方法能够非常快速地生成视觉上较好的样本,并且在这方面它比特征匹配更好用。

03

标签平滑

深度网络可能会发生过拟合。例如,它使用很少的特征来对对象进行分类。为了缓解这个问题,深度学习使用正则话和dropout来避免过拟合。

在GAN中,如果鉴别器依赖于一小组特征来检测真实图像,则生成器可以仅生成这些特征以仅利用鉴别器。优化可能变得过于贪婪并且不会产生长期效益。在GAN中,过拟合受到严重伤害。为了避免这个问题,当任何真实图像的预测超过0.9(D(实际图像)> 0.9)时,我们会对鉴别器进行惩罚。这是通过将目标标签值设置为0.9而不是1.0来完成的。这是伪代码:

p = tf.placeholder(tf.float32, shape=[None, 10])
# Use 0.9 instead of 1.0.
feed_dict = {  p: [[0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0]] # Image with label "3"}
# logits_real_image is the logits calculated by
# the discriminator for real images.
d_real_loss = tf.nn.sigmoid_cross_entropy_with_logits(
                    labels=p, logits=logits_real_image)

04

Historical averaging

此方法中,旨在对过去训练留下的t个参数求平均,以对当前模型的参数做正则。

43a490aa42b293abe356042f4eb90ac9.png

对于使用非凸目标函数的GAN来说,历史平均可以使模型绕平衡点停止并充当阻尼力以收敛模型。(有点类似二阶优化方法)

05

使用标签

许多数据集都带有样本对象类型的标签。训练GAN已经很难了,因此,指导GAN训练的任何额外帮助都可以大大提高性能。将标签添加为潜在空间z的一部分有助于GAN训练。以下是CGAN中用于利用样本中标签的数据流。

6ea22c40c54cec52bdf15898aaef4a07.png

06

损失函数

研究员们提出了很多的损失函数,见下图:

5b1cf8d2427dcbba1b72b100cc27b984.png

我们决定不在本文中详细介绍这些损失函数,详细的解释可以去参考相应论文。

以下是某些数据集中的一些FID分数(衡量图像质量,值越小越好)。这是一个参考点,但需要注意的是,对于哪些损失函数表现最佳还为时尚早。实际上,目前还没有单一的损失函数在所有不同数据集中表现最佳,所以,做实验的时候不妨多试几个损失函数,不要看网上传什么损失函数好就用哪个。

709f07bde3892088e5de1ccadfc8be74.png

(MM GAN是原始论文中的GAN成本函数。NS GAN是解决同一篇论文中消失的渐变的替代损失函数。)

但是想训练好GAN,仍需要小心的去拟合和调参,在随意的更换损失函数之前,不妨先耐心地调调参。

07

一些小技巧

  • 将图像像素值缩放在-1和1之间。使用tanh作为生成器的输出层

  •  用高斯分布实验取样z

  •  BN通常可以稳定训练

  •  使用PixelShuffle和转置卷积进行上采样

  •  避免最大化池用于下采样,使用带步长的卷积

  •  Adam优化器通常比其他方法更好(在GAN中)

  •  在将图像输入鉴别器之前,将噪声添加到实际图像和生成的图像中

GAN模型的动态尚未得到很好的理解。所以一些提示只是建议,里程可能会有所不同。例如,LSGAN报告称RMSProp在他们的实验中有更稳定的训练,所以,调参很重要。

08

Virtual batch normalization (VBN)

BN成为许多深度网络设计中的必备项。BN的均值和方差来自当前的小批量。但是,它会在样本之间创建依赖关系,生成的图像不是彼此独立的。

97d1d9fd3b2d88d79bfd19d242c1c304.png

下图的图像是训练失败的图像,也反映了在生成的图像显示同batch中的颜色色调相似。

256734a14899b84b56f32efc20a6b225.png

最初,我们从随机分布中抽样z,为我们提供独立样本。但是,BN产生的偏差超过了z的随机性。

虚拟批量标准化(VBN)在训练之前对参考批次进行采样。在前向传递中,我们可以预先选择参考batch来计算BN的归一化参数(μ和σ)。但是,由于我们在整个训练中使用相同的batch,因此有可能使用此参考batch发生过拟合。为了缓解这种情况,我们可以将引用批处理与当前批处理相结合,以计算规范化参数。

09

随机种子(Random Seed)

用于初始化模型参数的随机种子影响GAN的性能。如下所示,测量GAN性能的FID分数在50次单独运行(训练)中有所不同。但是范围相对较小,可能仅在稍后的微调中完成。

031620dc652d8eb543a2c173b6a3bb67.png

10

Batch Normalization

DGCAN强烈建议将BN添加到网络设计中。BN的使用也成为许多深度网络模型的一般实践。但是,会有例外。下图演示了BN对不同数据集的影响。y轴是FID得分越低越好。正如WGAN-GP论文所建议的那样,BN最好不使用。我们建议读者检查BN上使用的损失函数和相应的FID性能,并通过实验验证来设置。

42ab2abbbad5b674ecc1ead43c5dc2bb.png

6bfd26ba9fd1d32a809de17444401a89.png

11

多重GAN

模式崩溃可能并不全是坏事。当模式崩溃时,图像的某些区域质量通常会提高。实际上,我们可能会为每种模式收集最佳模型,并使用它们来重建不同的图像模式(玄学调参)。

c54d5f5cb28491a624b52586c10f4012.png

12

平衡生成器和判别器

判别器和生成器总是处博弈中以相互削弱。模式崩溃和梯度减小通常被解释为判别器和生成器之间的不平衡。我们可以通过关注平衡生成器和判别器之间的损耗来改进GAN。不幸的是,解决方案似乎难以捉摸。我们可以保持判别器和生成器上的梯度下降迭代次数之间的静态比率。即使这看起来很吸引人,但很多人怀疑它的好处。通常,我们保持一对一的比例。但是一些研究人员还测试了每个生成器更新的5个判别器迭代的比率。还提出了使用动态力学平衡两个网络。但直到最近几年,我们才对它有所了解。

另一方面,一些研究人员挑战平衡这些网络的可行性和可取性。一个训练有素的判别器无论如何都会给生成器提供高质量的反馈。而且,训练生成器总是赶上判别器并不容易。相反,我们可能会将注意力转向寻找在生成器性能不佳时不具有接近零梯度的损失函数。

359ec39df23dd79e91e8a39ad1fa4adf.png

13

生成器、判别器的容量

判别器的模型通常比生成器更复杂(更多的权重和更多的层),良好的判别器提供高质量的信息。在许多GAN应用中,我们可能遇到瓶颈,增加生成器容量(增加生成器的层数)显示没有质量改进。在我们确定瓶颈并解决它们之前,增加生成器容量似乎并不是调参的优先考虑项。

14

进一步阅读

本文中,我们没有对某一具体方向做深入的探讨,只是给出了一个大概的方向,GAN的训练仍是一个遗留问题,需要诸位亲自探究。

 8efa77ede267b8370ddc66ca006dfa4e.gif

END

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

61a198f9f8b70dd314304458424fa5cb.png

e9f595705218a54d16188df1f94cbc8d.png

  • 1
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
cyclegan-pytorch-master是一个基于PyTorch深度学习框架实现的CycleGAN模型。CycleGAN是一种无监督的图像转换方法,它可以在两个不同领域的图像之间进行双向转换。 具体而言,cyclegan-pytorch-master中的代码实现了CycleGAN中的生成器判别网络,以及训练循环和测试函数。生成器网络负责将输入图像从一个领域转换到另一个领域,而判别网络则用于区分生成的图像和真实的图像。生成器判别使用卷积神经网络结构进行建模,可以通过训练过程不断优化网络参数。 在训练循环中,通过最小化生成图像和真实图像之间的差异,使得生成器能够逐渐学习到领域之间的映射关系。同时,判别也在不断优化中,使其能够更准确地区分生成的图像和真实的图像。通过交替训练生成器判别,CycleGAN可以实现两个领域之间的双向图像转换。 此外,在cyclegan-pytorch-master中还包含了测试函数,可将训练好的模型应用于新的图像转换任务。测试函数可以加载已训练好的生成器模型,并将输入图像转换到另一个领域中。通过这种方式,用户可以在训练过的模型上进行图像转换,实现各种有趣的应用,如狗到猫的转换、夏天到冬天的转换等。 总而言之,cyclegan-pytorch-master是一个实现了CycleGAN模型的PyTorch代码库,可用于图像领域之间的双向转换任务,并提供了训练循环和测试函数来支持模型的训练和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值