草庐IT

一文总结图像生成必备经典模型(一)

马鹏森 2023-04-20 原文

本文将分 2 期进行连载,共介绍 16 图像生成任务上曾取得 SOTA 的经典模型。

  • 第 1 期:ProGAN、StyleGAN、StyleGAN2、StyleGAN3、VDVAE、NCP-VAE、StyleGAN-xl、Diffusion GAN

  • 第 2 期:WGAN、SAGAN、BIG-GAN、CSGAN、LOGAN、UNet-GAN、IC-GAN、ADC-GAN

您正在阅读的是其中的第 1 期。前往 SOTA!模型资源站sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。

本期收录模型速览

模型SOTA!模型资源站收录情况模型来源论文
ProGANhttps://sota.jiqizhixin.com/project/0190e1fa-5643-4043-8b75-9b863a6d20db
收录实现数量:1
支持框架:TensorFlow
Progressive Growing of GANs for Improved Quality, Stability, and Variation
StyleGANhttps://sota.jiqizhixin.com/project/e072cfc0-26c3-40e7-a979-60df61170c7a
收录实现数量:75
支持框架:TensorFlow、PyTorch
A Style-Based Generator Architecture for Generative Adversarial Networks
StyleGAN2https://sota.jiqizhixin.com/project/a07f5a80-bf97-4a33-a2a8-4ff938b1b82f
收录实现数量:1
支持框架:TensorFlow
Analyzing and Improving the Image Quality of StyleGAN
StyleGAN3https://sota.jiqizhixin.com/project/6f7d3d51-762a-4d23-a572-3ea79ab49b4f
收录实现数量:2
支持框架:TensorFlow、PyTorch
Alias-Free Generative Adversarial Networks
VDVAEhttps://sota.jiqizhixin.com/project/0ed2229c-722b-47fb-b6aa-d22dedf87f1b
收录实现数量:1
支持框架:PyTorch
Very Deep VAEs Generalize Autoregressive Models and Can Outperform Them on Images
NCP-VAEhttps://sota.jiqizhixin.com/project/74d15cbe-7f75-434a-a1cf-a69ae303eec6A Contrastive Learning Approach for Training Variational Autoencoder Priors
StyleGAN-xlhttps://sota.jiqizhixin.com/project/01d16b00-e79f-4527-a7e3-08354b5d9b47
收录实现数量:1
支持框架:PyTorch
StyleGAN-XL: Scaling StyleGAN to Large Diverse Datasets
Diffusion GANhttps://sota.jiqizhixin.com/project/9aa9b499-adec-46a3-aef9-4cd73e1c13ec
收录实现数量:1
支持框架:PyTorch
Diffusion-GAN: Training GANs with Diffusion

生成模型是一种训练模型进行无监督学习的模型,即,给模型一组数据,希望从数据中学习到信息后的模型能够生成一组和训练集尽可能相近的数据。图像生成(Image generation,IG)则是指从现有数据集生成新的图像的任务。图像生成模型包括无条件生成和条件性生成两类,其中,无条件生成是指从数据集中无条件地生成样本,即p(y);条件性图像生成是指根据标签有条件地从数据集中生成样本,即p(y|x)。

图像生成也是深度学习模型应用比较广泛、研究程度比较深的一个主题,大量的图像库也为SOTA模型的训练和公布奠定了良好的基础。在几个著名的图像生成库中,例如CIFAR-10、ImageNet64、ImageNet32、STL-10、CelebA 256、CelebA64等等,目前公布出的最好的无条件生成模型有StyleGAN-XL、Diffusion ProjectedGAN;在ImageNet128、TinyImageNet、CIFAR10、CIFAR100等库中,效果最好的条件性生成模型则是LOGAN、ADC-GAN、StyleGAN2等。

 我们在这篇文章中介绍图像生成必备的TOP模型,从无条件生成模型和条件性生成模型两个类别分别介绍。图像生成模型的发展非常快,所以与其它几个topic不同,图像生成中必备的TOP模型介绍主要以近两年的SOTA模型为主。

 

一、无条件生成模型

1.1 ProGAN

生成性对抗网络(GAN)是机器学习中一个相对较新的概念,于2014年首次引入。GAN的目标是合成与真实图像无法区分的人工样本,如图像。GAN的基本组成部分是两个神经网络:一个新样本的生成器(G),一个从训练数据和生成器输出中提取样本并预测它们是“真”还是“假”的鉴别器(D)。生成器的输入是一个随机向量(噪声),因此其初始输出也是噪声。随着训练的进行,当它收到鉴别器的反馈时,会学习合成更“真实”的图像。鉴别器还通过将生成的样本与真实样本进行比较,随着训练的进行不断改进,使得生成器更难欺骗它。

ProGAN是NVIDIA投稿ICLR 2018的一篇文章,ProGAN关键创新在于渐进式训练,它在经典GAN的基础上首先通过学习在低分辨率图像中也可以显示的基本特征,来创建图像的基本部分,并且随着分辨率的提高和时间的推移,学习越来越多的细节。低分辨率图像的训练不仅简单、快速,而且有助于更高级别的训练,因此,整体的训练也就更快。ProGAN被认为是后来大热的StyleGAN的前身。

图1 ProGAN架构

ProGAN的训练部分,从低分辨率的图像开始,通过向网络添加层来逐步提高分辨率,如图2所示。这种递增的性质允许训练首先发现图像分布的大规模结构,然后将注意力转移到越来越精细的细节上,而不是同时学习所有的尺度。使用生成器和鉴别器网络,它们是彼此的镜像,并且总是同步增长。在整个训练过程中,两个网络中的所有现有层都是可训练的。当新的层被添加到网络中时,平稳地将它们淡化,如图3所示。这就避免了对已经训练好的小分辨率层的突然冲击。

图2 训练开始时,生成器(G)和鉴别器(D)的空间分辨率都很低,只有4×4像素。随着训练的进行,逐步增加G和D的层数,从而提高生成图像的空间分辨率

图3  当生成器(G)和鉴别器(D)的分辨率翻倍时,顺利地淡化新层。这个例子说明了从16×16图像(a)到32×32图像(c)的过渡。在过渡期间(b),把在更高的分辨率上操作的层当作一个残差块,其权重α从0到1线性增加

GAN还有一个问题是只捕捉训练数据中发现的变化的一个子集,mini-batch就是为了解决这个问题提出的,它是通过在鉴别器的末尾添加一个minibatch层来实现的,该层学习一个大的张量,将输入激活投射到一个统计数组。mini-batch中的每个样本都会产生一组单独的统计数据,并将其串联到该层的输出中,这样鉴别器就可以在内部使用这些统计数据。

ProGAN的简化方案既没有可学习的参数,也没有新的超参数,而是引入了特征的标准差作为衡量标准。首先计算每个特征在每个空间位置上的标准偏差。然后,在所有特征和空间位置上平均这些估计值,得到一个单一的值。复制这个值并将其连接到所有的空间位置和minibatch上,产生一个额外的(恒定)特征图。这一层可以插入鉴别器的任何地方,将其在最后插入效果最好。这个特征图中包含了不同样本之间的差异性信息,送入鉴别器后,经过训练,生成样本的差异性也会与训练样本的相似。

此外,ProGAN还对生成器和鉴别器进行了归一化处理,归一化主要是用来控制信号幅度,从而减少G与D之间的不正常竞争,沿channel维度对每个像素的特征长度归一化。minibatch statistic layer沿着batch维度求标准差,而它沿着channel维度求norm。


1.2 StyleGAN

转载于机器之心:ProGAN、StyleGAN、Diffusion GAN…你都掌握了吗?一文总结图像生成必备经典模型(一)

有关一文总结图像生成必备经典模型(一)的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  8. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  9. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  10. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

随机推荐