不知道题主是本科生还是硕士研究生。我都说一下吧。
先说做什么,什么能做,最后再说怎么做。
如果是本科生,通常毕设只关注应用,对论文的contribution没有什么实质性要求,所以比较好的思路就是利用现在相对易学、易用的开源网络,来构造一个应用场景,然后把模型跑起来并用在这个场景中OK了。
从易到难,GAN常见的应用场景有以下几种:
1、把GAN直接当分类器来用。
先考虑一种简单情况,例如你有一个只包含卡通人物的数据集,你在该数据集上可以做一个最简单的原生GAN,该GAN在训练好后可以让生成器从一个含有随机高斯噪声的图像去生成一张卡通人物。这的确没有什么用....... But,与此同时,你得到了一个判别器D。D可以用来判断一张图像是否是被生成出来的。如果你熟悉了GAN,你会明白以下事实:D工作的原理是判断一张图像是否与你的卡通人物数据集的分布相近。所以D可以用来判断出那些不是卡通人物的图像。换句话说,你可以说你在做异常检测。
再考虑稍微复杂点的例子,你含有一个包含许多动物的数据集,并且有标签。也就是说,每张图像是什么动物是事先知道的。这个时候你可以使用Conditional GAN来让生成器从一张含有随机高斯噪声的图像和一个指定标签(例如“猫”)来生成一种动物的图像。同上面第一个例子相似,在模型训练完成后,你除了会得到一个生成器G,还会有一个判别器D。此时的判别器在某些设计下(题主有兴趣再追更吧)能够作为动物的分类器来使用。那么这样做和传统直接练一个分类网络的区别在哪? 答案是你多了一个生成器。 通过生成器生成的图像(尤其是图像质量并不那么逼真的情况下),你可以分析模型学到了什么。 换言之,你可以说你在做模型可解性的部分工作。这样就把你和传统分类网络区别开了。但这么做不一定能说服真正懂GAN的boss,有一些细节需要理解清楚才能忽悠的过去。
2、风格迁移
风格迁移和很多GAN任务一样,都属于image-to-image translation这个大的topic下面。但是因为种种原因(例如,很难找到一个统一的模型在所有image-to-image translation任务上都表现得好),不同任务大概率还是会用不同的模型。
风格迁移可以算是最简单的场景了。你可以把风格迁移嵌入到一个小的图像编辑app里,例如可以让一张冬天的照片变成夏天,或者梵高的画变成莫奈的画,诸如此类。
在仅仅只考虑毕业的问题上,我个人强烈建议题主尝试这个题目。它既简单,同时给老师的视觉效果又非常不错,容易弥补contribution不足的问题。
3、表情迁移
一样属于image-to-image translation。但是因为任务有一些特殊性,所以现在已经衍生出了非常多的算法。简单来做,可以和风格迁移采用几乎完全一样的方法。但是要做的稍微那么不错,就需要付出巨大努力。并且因为表情迁移任务本身过于简单直白,老师可能会提出一堆让你难以回答的问题。例如,你把一张在哭的图像变成了在笑的图像,老师可能会问怎么笑的更灿烂一点???为什么人物的头发有些许小变化???
如果你能下决心去读50篇paper的话,这些基本都不会难住你。But。。。。你都在知乎提问了,不是吗?
好吧,场景大概就这么几个。
通常硕士论文需要一定的contribution在里面。如果你们不要求,那么请参照上述本科生。如果要求了,恭喜你,你掉入了一个比你其他同学都大很多的坑。
闲话少说,我来救你于水生火热。
要有contribution,你必须要知道现状。目前为止,关于GAN的研究最重要的一点就是如何让GAN的训练更加稳定。目前有许多非常著名的方法都是针对这个问题提出来的,比如WGAN、Spectral Norm,Projection discriminator等等。以事后诸葛亮的角度来看,这些方法其实都不够精美。但请注意,此刻的我是“事后诸葛亮”。。。
我把上面这个点稍微展开一点,希望题主能认真看,看明白,然后我会说该怎么做。
我们的问题是:GAN怎么训练才能更加稳定。目前为数不多的理论是关于网络的Lipschitz 连续性。研究者们相信(不是特别严谨,但不影响理解),如果网络满足Lipschitz 连续性,那么GAN的训练会比较稳定。
简单来说,如果一个函数的变化是有界的,那么我们说它是Lipschitz 连续的。而对于一个函数,它的变化率通常可以用梯度来表示。所以我们自然地想到在训练GAN的过程中,让梯度有界不就行了吗?
所以就出现了对GAN中的梯度进行截断、对梯度归一化、对梯度做惩罚项等等操作。But,所有这些操作都是“强行”让网络看起来是Lipschitz 连续的。所以它们各自的有效性并不能轻易看出。
所以你可以尝试做以下工作。
1、找一个你能跑地动的数据集,详细、充分地尝试并对比上述方法,找到它们各自特点和有效性。你可以改变的实验设置包括数据集大小,图像尺寸等等(这点真不是凑工作量,实际中很有意义)。
2、考虑这些方法可应用在不同任务上,题主可以尝试最简单的原生GAN和Conditional GAN;
3、使用Inception score和FID作为你的评价指标,来分析你的结论。
上述工作量看起来很weak吗?Google的BigGAN也只比上述三点多做了一两点。所以你不要怕被diss。
最后,说怎么做。
不管你最后尝试哪一种做法,我都强烈建议题主按照如下顺序开展工作:
1、仔细阅读CycleGAN这篇文章,链接如下:
2、Github上拉下CycleGAN的源码,读会每一行(代码量不大),地址:
https:// github.com/junyanz/Cycl eGAN
3、阅读BigGAN这篇文章,这篇文章是实践性文章代表,里面列举许多有效的训练GAN的策略和套路,非常值得读,文章链接如下:
4、做完123,你会发现GAN真的不难。现在就train你自己的模型,写你自己的场景。
5、遇到不会的怎么办?继续读论文,读完论文读源码。当你把CycleGAN彻底读懂后,你会发现大多数论文和源码原来都差不多。
6、还有问题怎么办?Call me pls.
有疑问,再追更。