GAN系列:论文阅读——SimGAN( Simulated + Unsupervised Learning )

把对抗思想用于改善生成图像的质量:保留生成图像重要的语义/标注信息,生成细节部分,使得图像更加逼真(即simulate)。训练对抗网络仅需要图像,不需要任何标注信息(unsupervised)。获得的图像称为refined images可以作为数据用于训练其他模型,相当于数据扩增,能使模型能力大幅度提升。该文主要内容:

1. 定义无监督学习模型SimGAN对合成的假图像进一步修正(refine)使其更逼真;

2. 修改SimGAN中的目标函数使修正后的图像能保留标注信息;

3. 改进模型的训练框架,稳定训练过程和控制refiner的结果。

一:SimGAN架构

SimGAN由refiner和判别器两部分组成,因此区别于普通GAN中生成器和判别器的对抗,这里是refiner和判别器进行对抗。算法如下图所示,可知refiner的输入是合成的假图像x_i,输出是修正过的图像R_\theta(x_i)。判别器的输入是修正过的图像R_\theta(x_i)和真实图像y_j(注意下标i和j,说明判别器的输入图像不是对应关系),输出是图像为修正的概率。借助判别器,SimGAN不断强化refiner的能力,使其得到更高质量的修正图像。其实和GAN原理相同,只不过生成器生成的内容改变了一点。

以gaze的实验为例,refiner网络R_\theta主体是残差结构,4个残差块(residual block)叠加,每个残差块中包含两个卷积层,卷积核大小3*3,输出64个特征图。最后的残差块接一个卷积核大小1*1的卷积层,输出一张特征图作为refined synthetic image,如下图所示:左侧为自己画的具体结构图,右侧为论文中残差模块的示意图。

注意:看了一下代码,残差应该是和残差块输入进行了element-wise相加,因此有相同的通道数。所以在残差模块前必须将输入图像batch变换到64个channels。代码里是通过卷积核为3*3,无步幅(因此尺度不变)的卷积实现的,共64个卷积核,因此得到的特征图是64个。然后才输入到四个连续的残差块中。因此下图input后应更改为加入一个卷积层,然后再进入ResNet Block。

        

判别器网络D_\phi中包含5个卷积层和2个最大池化层,具体结构如下图:

由此可知,整个对抗网络是全卷积网络,并且refiner中的卷积均没有stride,也没有池化层,这使得每层的操作都能保留全局/每个像素的信息(如果卷积有步长,是会漏掉部分信息的;池化同理;而全连接则会失去图像的空间结构)。论文中还提到refiner网络和判别器网络的最后一层感受野大小是接近的,这个还不是很明白,要看代码再计算一下。

二:SimGAN目标函数

目标函数的形式根据模型的目的而改变,SimGAN的目的是让合成图像更加真实,必须要保留其标注信息。普通的GAN进行无监督学习生成的图像是随机的,具有一定的不可控性。那么SimGAN如何生成标注信息不变(也就是图像的关键语义信息必须保留)又更加真实的图像呢?

让图像更真实可以借助判别器,和普通GAN的原理相同,因此SimGAN中refiner的目标函数中保留了该项:\sum_{i}l_{real}(\theta;\tilde{x}_i,y),用于为合成图像增加真实性;另一方面,保留图像的标注/语义信息,是通过最小化refiner输入输出图像间的像素差值实现的,这部分在目标函数中体现为:\lambda l_{reg}(\theta;\tilde{x}_i,x_i)

原文中提到,想让合成的图像更真实,就相当于在合成图像和真实图像间建立桥梁,让合成图像沿着该桥梁走即可。这个桥梁的建立就是依靠了GAN的思想,判别器D_\phi的作用就是判别一张图像是修正的还是真实的,因此目标函数为:

L_D(\phi)=-\sum _ilog(D_\phi(\tilde{x_i}))-\sum _j1-log(D_\phi(y_j))

注意:该形式下,判别器是给修正图像高分,给真实图像低分。因此实验中计算交叉熵损失时,修正图像的标签为1,真实图像标签为0。

借助判别器的输出,refiner关于增强真实性的式子为\sum_{i}l_{real}(\theta;\tilde{x}_i,y)=-\sum _{i}log(1-D_\phi(R_\theta(x_i)));关于另一部分\lambda l_{reg}(\theta;\tilde{x}_i,x_i),保留标注信息其实有点抽象,文中举例为:对于gaze estimation的图像,不可以改变gaze direction;对于手势识别,不能改变关键点位置。\lambda l_{reg}(\theta;\tilde{x}_i,x_i)在文中称作self-regularization loss,定义为refiner输入输出间像素差值的L1范数。因此refiner的目标函数完整形式为:L_R(\theta)=-\sum _ilog(1-D_\phi(R_\theta(x_i)))+\lambda\left \| R_\theta(x_i)-x_i \right \|_1

另外,refiner毕竟是个生成的过程,可能会生成某些artifacts的部分隐藏在整张图像中试图蒙混过关(是不是之前李宏毅老师提到的夹带小抄的做法?),因此该论文中的判别器不针对整张图像判别,而是对一张图像的patches进行判别(原理是修正图像的patch也是修正的,判别器应该具有识别它们的能力,有点赶鸭子上架的感觉,强迫判别器进化)。这个方法的另一个好处是,一张图像可以得到多个patches,相当于数据集扩增了好几倍。基于大量数据,refiner和判别器的性能都会有所提升。因此判别器的输出不是一个标量,而是具有W*H的空间结构,表示一张图像的W*H个patches,每一个patch的得分。因此目标函数中包含了判别器的值都是多个patches的交叉熵损失的和,如下图所示:

三:模型性能改进

GAN的训练有一个难收敛的问题,前面听李宏毅老师的课程时提到过,最后通过WGAN进行了改进。这篇论文也利用了一些训练中的技巧改善了这个问题。GAN的训练过程是先优化判别器,最优判别器得到的就是生成图像和真实图像分布间的JS散度,然后在所有JS散度中找到最小的以完成生成器的优化。然而,由于图像是高维空间的低维流形,生成图像和真实图像的分布很大概率上是互不重叠的,导致不同的最优判别器得到的JS散度都是相同的,自然不会为生成器的更新提供梯度,导致了整个模型的不收敛,因此一般会说不要把判别器训练得太好。本论文中使用的技巧是,将之前refiner的输出缓存,结合当前refiner的输出,各自占比一半,作为输入更新判别器的参数,如下图所示:(私以为该方法有效是因为,把过去refiner的输出和当前的修正图像结合,相当于改变了当前或者说是最近几次refiner输出的修正图像的分布,因此判别器就算很强,因为输入分布变化了,也不再适用该判别器了,那么判别器优化后的结果就不是两个分布间的JS散度,就不容易出现梯度消失的现象)。

该方法的原理基础是:即使是之前refiner的输出,也永远是修正图像而不是真实图像,更新的判别器也应该具有识别该修正图像的能力。因此该方法另一个作用就是,让判别器时刻记住之前的修正图像特点,不会只针对当前refiner的输出进行自我进化(因为GAN的训练特点就是refiner和判别器交替更新,refiner也是时刻改变的,当前refiner的映射已经不同于之前,判别器如果只学习当前的映射关系是过于片面的,判别器的效果就会不稳定)。

本文的实验结果很全面,一方面可视化了修正图像和原本的合成图像,如下图所示:

可以看到眼睛附近的皮肤细节被生成了,但gaze direction并没有改变。

另一方面,通过观察者的辨别结果展示了修正图像以假乱真的能力,如下图所示:51.7%的概率说明修正图像对于人眼来说已经很接近真实图像了。

同时,下面的曲线图将这种以假乱真的能力量化了,量化方法是用一个CNN网络预测gaze direction,预测结果编码为一个三维向量,计算分别用修正图像和真实图像训练CNN后的预测结果之间的L2 loss,结果如下图:

可以看到,修正后的图像作为训练集明显提升了模型的预测能力。

同时,论文也提供了最直观的模型预测错误率指标作为参考:

这篇论文的内容大概就是这些,总体上通过无监督学习的方式refine合成图像,同时不改变其标注信息,这使得其可以作为数据扩增的方法(注意:合成图像的标注信息可以是通过conditional GAN得到的,SimGAN保留了标注信息也相当于保留了标签,相当于产生了真实的带标签数据,可用于监督学习和非监督学习)。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值