首页 > 编程知识 正文

sagan源码最新版,francoise sagan

时间:2023-05-03 11:43:20 阅读:195367 作者:3159

一、背景

SAGAN全称为Self-Attention Generative Adversarial Networks,是由Han Zhang等人[1]于18年5月提出的一种模型。文章中作者解释到,传统的GAN模型都是在低分辨率特征图的空间局部点上来生成高分辨率的细节,而SAGAN是可以从所有的特征处生成细节,并且SAGAN的判别器可以判别两幅具有明显差异的图像是否具有一致的高度精细特征。SAGAN目前是取得了非常好的效果。

本文以CelebA数据集为例,用SAGAN生成更为精细的人脸图像,主要参考代码为[2]。

[1]文章链接:https://arxiv.org/pdf/1805.08318.pdf[2]参考代码:https://github.com/taki0112/Self-Attention-GAN-Tensorflow二、SAGAN原理

感觉入门系列的GAN文章网上的介绍还挺多,越新的文章解读越少,这里简单推荐一篇:

[3]SA-GAN - Self-Attention Generative Adversarial Networks 论文解读(附代码)

下面是自己对于文献的一些理解和介绍。

在我的上一篇文章GAN系列文章中:对抗神经网络学习(十)——attentiveGAN实现影像去雨滴的过程(tensorflow实现),初次了解到了attentiveNet引入GAN中的优势,引入attentiveNet来生成attentive map,能够让网络快速准确的定位到图像中的重点关注区域,当时就隐约觉得可以用这个思路来进一步优化GAN的模型结构,后来就看到了SAGAN采用了这个方法。

首先,作者关注GAN目前存在的问题:当我们训练多类别数据集时,GAN在某些图像类别上很难建模。通俗来说,GAN容易捕捉纹理特征但很难捕捉几何结构特征

However, by carefully examining (检查)the generated samples from these models, we can observe that convolutional GANs have much more difficulty modeling (建模)some image classes than others when trained on multi-class datasets. For example, while the state-of-the-art ImageNet GAN model excels at synthesizing image classes with few structural constraints (e.g. ocean, sky and landscape classes, which are distinguished(区分) more by texture(纹理) than by geometry(几何)), it fails to capture geometric or structural patterns that occur consistently(持续) in some classes (for example, dogs are often drawn with realistic fur (皮毛)texture but without clearly defined separate feet).

原因就在于这类模型依靠卷积来建立不同图像区域之间的依赖关系,而依赖关系的传递只能通过大范围的多个卷积层来实现。随着卷积大小的增加,网络的真实容量也在增加,但却损失了计算效率。而self-attentive,却能够做到依赖性和计算效率的平衡,因此文章引入self-attention机制

作者主要的贡献在于:

In this work, we propose(提出) Self-Attention Generative Adversarial Networks (SAGANs), which introduce a self-attention mechanism(机制) into convolutional GANs. The self-attention module is complementary(补充/辅助) to convolutions(卷积) and helps with modeling long range, multi-level dependencies across image regions(区域). Armed with(手持) self-attention, the generator can draw images in which fine details at every location are carefully coordinated(协调) with fine details in distant portions(部分) of the image. Moreover, the discriminator can also more accurately(准确地) enforce complicated geometric constraints on the global image structure. (作者引入self-attention机制,提出SAGAN。引入该机制后,生成器能够精细的细节,判别器能够实行几何限制。)

作者以一幅图来简单介绍self-attention:

简单来理解,最左边的图中的5个点是作者放置的5个点。而右侧的每张图对应一个点,内容则是这个点具有类似特征的区域,也就是上面说的most-attened regions。

之后,作者介绍了self-attention机制:

将self-attention机制引入到GAN中,可以得到SAGAN的loss函数:

为了使得SAGAN的训练稳定,作者还使用一点trick:
①在生成器和判别器中都使用了spectral normalization
②生成器和判别器的非平衡学习率(Imbalanced learning rate)

最终SAGAN的表现也很好:

SAGAN significantly outperforms the state of the art in image synthesis by boosting the best reported Inception score from 36.8 to 52.52 and reducing Fréchet Inception distance from 27.62 to 18.65.

关于文章中的公式推导和参数的设置,这里不再多说,最后只展示一下作者的效果图,看起来还是很惊艳的:

三、SAGAN实现过程 1. 所有文件结构

SAGAN的文件比较少,所有文件的结构为:

-- dataset # 数据集文件,需要自己下载 |------ CelebA |------ image1.jpg |------ image2.jpg |------ ...-- ops.py # 图层文件-- utils.py # 操作文件-- SAGAN.py # 模型文件-- main.py # 主函数文件 2. 数据准备

这次用的数据集依旧是CelebA人脸数据集

下载好数据集之后,将其解压放到'dataset/CelebA/'路径下即可。

四、实现结果

写完上述所有文件之后,运行main.py即可。实验过程比较慢,设置epoch为10,每个epoch内迭代10000次,我的GPU是GTX1060 3G,每个epoch大概需要近4000秒,即1个小时5分钟,所以还是非常耗时的。目前只进行了训练过程,所以只有训练过程的生成样本。

当epoch=0, iter=500时,也就是迭代500次,生成样本为:

当epoch=1,iter=0时,也就是运算了10000次,效果为:

当epoch=2,iter=0时,即运算20000次,效果为:

当epoch=4,iter=0,即运算40000次时,效果为:

当epoch=6,iter=0,即运算60000次时,效果为:

由于loss已经很小了,而且后面的训练效果其实差距也不大,所以也就没有再继续训练了。

五、分析

1. 训练过程中似乎出现了模式崩塌的现象,因为生成的样本都非常类似,这个还需要进一步检查。

2. 之前用DCGAN、WGAN、BEGAN也做过人脸生成,下面来比较一下他们的效果:

DCGAN生成图像的大小为64*64的, 但是可以明显的看到,DCGAN的生成结果中,很多人脸的姿态都非常相似,DCGAN很容易出现模式崩塌现象,而且DCGAN生成的人脸肤色偏黑,且图像中的噪点很多,边缘非常不平滑,生成的效果比较差。

WGAN理论上解决了模式崩塌现象,生成人脸的尺寸为128*128,肤色明显自然了很多,但是生成的效果很差,边界几乎看不清,而且有的图像几乎什么也看不出来,噪点也非常多。

BEGAN生成的人脸尺寸为64*64,它是再DCGAN的基础上扩展的,效果明显好了很多,生成图像偶尔有噪点,人物的五官和轮廓都非常清晰,整体来讲效果不错。

SAGAN生成的人脸尺寸是128*128,生成的结果中,出现了模式崩塌的现象,可能是我对人脸数据集没有做预处理,生成人脸的五官是很清晰,但是五官之外的轮廓就非常糟糕了。

这几种模型,目前来看,我的实验效果是BEGAN最好,可能是因为我对其他数据集没怎么做数据预处理吧。

reference:https://blog.csdn.net/z704630835/article/details/86648924

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。