Contrast GAN--- 实现CycleGAN无法实现的“眼一瞎, 猫变狗”,“手一抖,单车变摩托”

Contrast GAN--- 实现CycleGAN无法实现的“眼一瞎, 猫变狗”,“手一抖,单车变摩托”
可以看到,猫变狗,单车变摩托了。效果看上去有点尴尬,但毕竟是初步效果是有了。
但这篇论文的主要贡献是提出了一个“Contrast distance”。

主要思想

我要从小猫变小狗,变的小狗与真实像狗要像,但是到底像到什么程度呢?输入是猫,那么起码生成的小狗,与真实的小狗的相像程度,要大于与其输入的猫的相像程度吧。其实就是一个triple loss的思想。我们要想生成的是狗,希望生成的狗输入真实狗的那一类,那么这两只狗的距离,肯定要小于生成的狗与输入的猫的距离。因为狗与猫是不同类,他们的距离属于类间距离。所以这种”Contrast distance”就相当于类间距离大于类内距离。
Contrast GAN--- 实现CycleGAN无法实现的“眼一瞎, 猫变狗”,“手一抖,单车变摩托”

损失

对于G来说就有三个损失,除了最简单的 重建损失,还有GAN损失(用LSGAN来让稳定性高点),最后就是这里的重点 对比损失了。比较简单的就是下面这样写:

fxfy>fyfy¯

因为我们要比较的距离不是直接在raw image上进行比较,起码是semantic上的距离吧。所以就用一个Dcy来提取语义信息,并在特征上进行约束。为了避免模式塌陷,用f¯y,即抽取多张真实的狗图,提取特征再取个平均,而不是任意抽一张。
那么距离的具体定义:
Q(fy,fx,fy¯)=logefyfy¯2efyfy¯2+efyfx2

可以看到,如果fyfy¯2fyfx2 小的越多,那么Q值就越小。所以G就最小化Q,而Dcy就最大Q就行。
Contrast GAN--- 实现CycleGAN无法实现的“眼一瞎, 猫变狗”,“手一抖,单车变摩托”

Contrast GAN--- 实现CycleGAN无法实现的“眼一瞎, 猫变狗”,“手一抖,单车变摩托”

Contrast GAN--- 实现CycleGAN无法实现的“眼一瞎, 猫变狗”,“手一抖,单车变摩托”

值得注意的是,这里只需要用一个cycle网络就行。原因就是因为加了Q约束。

隐藏层加类别选择的方法

Contrast GAN--- 实现CycleGAN无法实现的“眼一瞎, 猫变狗”,“手一抖,单车变摩托”

这个还是挺常用的,就是你如果要进行对G加入一定的条件,比如这里是要求让G生成狗,那么你在latent representation中直接加入“one-hot”类型的特征就行。不过如果是在隐藏层特征中加入“标签”,比如这里 1*64的被扩展成 16*16*64。当然不能胡乱扩展,扩展方式是,每个spaital size的点,都有one-hot这么多通道。可以这样理解,对于每个点来说,64个通道,只有一个值是1,其余全部为0。相当于这个点是被赋予了“狗”的标签。扩展的16*16*64, 每次只有一个面(假设是第3个)是1,其余63个面全为0。经过网络训练后,会自动认为第3个通道面为1的话,就专门提取一些有助于变成狗的特征。(以后有更好的解释再补充吧。。)其实这在很多地方都这样弄,比如Generative Adversarial Text to Image Synthesis, 在D的隐藏层也是这样加入类别选择的。