生成对抗网络GAN图像生成实例

本文实现了DCGAN [1],这是一种生成对抗网络。DCGAN模型将完全连接层替换为全局池层。众所周知,GAN的目的是在鉴别器和发生器之间实现纳什均衡。也就是说,这两种模式都不应该表现得特别好。实验所使用的数据集为CUB200-2011,这是一个鸟类数据集,训练集包含5994个图像,实验设置如下所示:训练次数为200次,学习率为0.0002。此外,我切下原始图像的中心作为模型的输入,模型的大小是128×128像素。

代码:

main.py

DCGAN.py

与原始图像相比,生成的图像如下图所示。左边的格子是真实图像,右边的是生成的图像。

可以观察到,假图像与真图像接近,甚至有些生成的图像很难与真图像区分开来。当然,有些图像在绿色背景下有点模糊。为了观察生成的图像的演变,我还将这些伪图像在不同时期进行了可视化。有趣的是,在早期阶段已经提取了一些潜在的特征。在第50次迭代中,整个鸟类的轮廓已经开始出现。

下图显示了训练过程中损失的变化。我们可以看到生成器的损耗比鉴别器的略高。其中一个可能的原因是全连通层(自己加的)的存在。我们还可以看到它们的损失都不稳定,这可能导致模式崩溃。


另外,为了验证GAN的原理,我设置了一个比原来更高的学习率(0.001)。我发现生成器的损失立即收敛到0,而鉴别器的损失保持在一个较高的水平,这就是为什么很难训练GAN模型的原因。

最后我借助Grad-CAM[2]将DCGAN中鉴别器的不同中间层的注意可视化。Grad-CAM利用流入CNN的最后一个卷积层的梯度信息为每个神经元分配重要值。具体地说,类c的梯度通过使用y^c(softmax之前的Logits)来计算,并且特征图的激活值被定义为a^k。这些回流梯度与宽度和高度维度(分别以ij索引)上的全局池策略一起应用,以获得神经元重要性照明\alpha^c\k。等式??和??描述了这个过程。

    \[ \alpha_{k}^{c}=\frac{1}{Z} \sum_{i \in w} \sum_{j \in h} \frac{\partial y^{c}}{\partial A_{i j}^{k}} \]

    \[ L_{G r a d-C A M}^{c}=\operatorname{ReLU}\left(\alpha_{k}^{c} * A^{k}\right) \]

 

在数据集CUB200-2011下,DCGAN中鉴别器的最后一个卷积层的热图如下图所示。第二列和第三列分别是Grad-CAM和Grad-CAM++ [3]的热图。最后两列是叠加在原始图像上的结果。我选择把让鉴别器做出虚假判断的注意力形象化。从结果可以看出,在大多数情况下,热值较高的地方不是鸟类,而是环境,这说明在GAN模型中,鉴别器不应表现得如此糟糕。

 

[1] Radford, Alec, Luke Metz, and Soumith Chintala. "Unsupervised representation learning with deep convolutional generative adversarial networks." arXiv preprint arXiv:1511.06434 (2015).

[2] Selvaraju, Ramprasaath R., et al. "Grad-cam: Visual explanations from deep networks via gradient-based localization." Proceedings of the IEEE international conference on computer vision. 2017.

[3] Chattopadhay, Aditya, et al. "Grad-cam++: Generalized gradient-based visual explanations for deep convolutional networks." 2018 IEEE Winter Conference on Applications of Computer Vision (WACV). IEEE, 2018.

 

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注