10 分钟解释 StyleGAN

news2025/1/17 15:43:25

一、说明

        G在过去的几年里,生成对抗网络一直是生成内容的首选机器学习技术。看似神奇地将随机输入转换为高度详细的输出,它们已在生成图像、生成音乐甚至生成药物方面找到了应用。

StyleGAN是一种真正推动 GAN 最先进技术向前发展的 GAN 类型。当Karras 等人的论文        介绍 StyleGAN 时,“一种基于样式的生成对抗网络生成器架构”。(2018)出现后,GAN 需要大量的正则化,并且无法产生今天所熟知的令人惊叹的结果。其他人都建立在 StyleGAN1 成功的基础上,我们现在已经达到了 StyleGAN3,并进行了进一步的细化和改进。

        在本文中,我们将深入探讨 StyleGAN 架构。然后,我们将查看每个单独的 StyleGAN 组件并详细讨论它。通过这种方式,您还将了解高级细节之外的内容,并了解每个单独组件的影响。

        你准备好了吗?我们走吧!

二、StyleGAN,高级概述

        下图展示了 StyleGAN 的高级架构,如 Karras 等人所述。(2018)。

涉及两个垂直块:

  • 映射网络(称为 f)在左侧可见。它将一个(归一化的)潜在向量z ε Z 映射到中间潜在空间中的另一个向量w ,称为 W。该映射网络是一组简单的全连接前馈层。
  • 合成网络称为 g(在右侧可见),它使用w生成控制图像合成过程的“样式”。它以一个常量、4 *4 * 512 维向量开始。生成缩放噪声样本 (B) 并将其添加到该常量张量中。随后,通过自适应实例归一化 (AdaIN) 操作添加样式 (A),然后应用卷积运算。接下来是另一个噪声添加和基于 AdaIN 的造型操作。然后我们得到一个 4x4 像素分辨率的图像。在下一个块中,对图像进行上采样,并再次执行相同的操作,达到 8x8 像素分辨率。重复此操作,直到图像达到 1024x1024 像素。

        显然,我们已经可以看到经典 GAN 和 StyleGAN 之间的巨大差异。潜在向量z不再直接用于图像合成过程。有趣的是,甚至让 StyleGAN 论文的作者感到惊讶的是,从恒定张量开始是可能的,甚至产生了良好的结果。

        z现在不再是图像合成过程的基础,而是用于生成控制合成过程的样式。

如果您不理解上面所写的所有内容,请不要担心。这是一个极端的总结,只强调了高层次上发生的事情。如果您想深入了解 StyleGAN,现在让我们花一些时间查看细节。但是,如果您无法理解基本的 GAN 概念(例如潜在空间潜在向量),那么最好先阅读我关于 GAN 的文章。

StyleGAN 架构:来源 Kerras at al.,2018

2.1 StyleGAN 的更多细节

        现在,我们将更详细地研究映射和合成网络及其各个组件。这可以让您详细了解 StyleGAN 的工作原理。

2.1.1 映射网络f

我们从映射网络开始,也称为 f。它采用从原始潜在分布中采样的潜在向量z并执行到中间潜在向量w的学习映射。这种映射是通过神经网络中的一堆全连接层来执行的。

潜在向量 z 采样

        在任何前向传递之前(无论是在训练还是推理期间),潜在向量z都是从原始潜在分布中采样的

标准正态分布用于映射 StyleGAN 中的潜在向量z。这是 GAN 中常见的采样分布。根据论文,其潜在空间是 512 维(Karras et al., 2018)。

潜在向量归一化

当输入没有标准化或者更好的是标准化时,神经网络会因表现不佳而臭名昭著。通过标准化 步骤,向量可以准备好输入。最小-最大归一化是选项之一。标准化也是如此。

如果您在 StyleGAN 实现中使用标准 正态分布,则是否需要此标准化步骤是值得怀疑的 - 因为您的输入已经具有零均值和单位方差。不过,保留它并没有什么坏处。

用于生成中间潜在向量 w 的全连接前馈层堆栈

您的(可能标准化的)采样潜在向量z现在已准备好输入。它被馈送到实际的映射网络,该网络是一个具有 8 个可训练的全连接(或密集)层的神经网络,也称为多层感知器或 MLP。它产生另一个向量,一个中间潜在向量w。这是合成网络将用于生成输出图像的潜在向量。

该映射是非线性的,这意味着每个全连接层都有一个激活函数,通常是 ReLU 或 LeakyReLU 函数。

中间潜在向量 w 也是 512 维(Karras 等人,2018)。

现在,您可能会问的问题是:为什么我们首先需要这样的映射?

为此,我们必须了解一个称为纠缠的概念(与量子力学中的纠缠无关)。当某物纠缠在一起时,它“已被扭曲在一起或被卡住”。

如果潜在空间被解开,它将包含线性子空间(Karras 等人,2018)。在普通英语中,这意味着潜在空间的某些维度控制着图像的某些方面。

例如,如果我们的 512 维潜在空间 Z 完全解开并成为在面部上训练的 GAN 的一部分,则维度 1 将控制眼镜,维度 2 控制头发,维度 3 面部形状等。通过简单地在一个维度上移动,人们就可以完全控制一小部分,并且生成选择的图像将非常容易。

不幸的是,GAN 通常没有解开的空间。我们之前就看到过——经典的 GAN 无法让机器学习工程师对其潜在空间进行控制。这是潜在空间纠缠的一种更简单的写法。

作者提出,让映射网络将最初采样的潜在向量z从学习到的中间潜在分布 W 转换为中间向量w,确保合成过程的采样不是从固定分布完成的——例如标准正态分布它的所有特征和特质。相反,它是根据学习的分布执行的。这种学习到的分布是通过尽可能解开的方式学习的,这源于来自生成器的压力,因为这样做会产生更好的结果(Karras 等人,2018)。

事实上,与真实图像的数据分布相比,拥有这样的网络可以改善描述分布纠缠的所有指标以及根据学习的潜在分布执行的最终合成。由于映射网络中的 8 层产生了最佳结果,因此选择 8 层(Karras 等人,2018)。

所以,换句话说:

  • 潜在向量z是从选定的分布(通常是标准正态分布)中采样的,并且是 512 维的。
  • 它通过 8 层非线性 MLP 馈送,产生 512 维中间潜在向量w,合成网络将使用该向量来控制所生成图像的样式。
  • 非线性学习映射对于减少合成网络(生成器)使用的潜在空间的纠缠是必要的。这使得 StyleGAN 能够显着提高对潜在空间的控制并产生更好的结果。

2.1.2 合成网络g

现在我们了解了映射网络为何产生中间潜在向量以及它是如何做到的,现在是时候看看它如何用于生成输出图像了。换句话说,我们来看看合成网络。该网络也称为 g。

综合网络第一部分的高级概述,高达并包括 8x8 分辨率

2.1.3 合成块

        在上图中,您可以看到 StyleGAN 的合成网络利用合成块,通过将图像分辨率从 4x4 上采样到 8x8、16x16……最终到 1024x1024 像素来逐步构建图像。

每个 StyleGAN 合成模块的核心组件是:

  • 上采样(第一个合成块除外)。前一个合成块的输出变大,以便随后进行处理。
  • 卷积层。
  • 自适应实例标准化(AdaIN)。
  • 风格向量 (A) 和噪声向量 (B)

接下来我们将更详细地了解每个单独的组件。然后您将发现 StyleGAN 中每个组件的作用。让我们首先从第一个合成块的起点开始:Constant构建图像的张量!

第一个综合块中的恒定起点

是的,你没听错——StyleGAN 的合成块的起点是一个常数值

与之前的 GAN 相比,这是一个完全不同的设计,之前的 GAN 都是从潜在空间中抽取样本开始的。

该输入被学习并初始化为 1(Karras 等人,2018)。换句话说,在每个纪元之后,常数都会略有变化 - 但在每个纪元内,它保持不变。

风格和噪音,两个重要的合成元素

常数张量现在由合成块的其余部分处理。尽管我们现在将更详细地讨论该块中的每个组件,但重要的是要知道将返回两个高级概念:

  • 风格。常量就像用于任何类型合成的“主干”。就像具有特定风格的画家一样,生成的图像中的高级组件由所谓的“风格”进行调整。
  • 噪音。如果您将相同的常量张量提供给具有相同样式的合成块,您将一次又一次地获得完全相同的图像。这是不现实的:您会读到风对某人的形象产生影响。换句话说,生成图片存在随机性,这是通过噪声实现的。

2.2 噪声是如何产生和添加的

Constant 值发生的第一件事是向其中添加了噪声。当人们注意到图片中的头发时,就可以最好地解释对噪点的需求。

假设下图是由StyleGAN生成的。事实并非如此,但假设是这样。您可以看到它包含各种具有不同粒度的组件:

  • 较低粒度的组件,例如头部(特别是其位置)、躯干等。对于human类的每个实例,它们都是相对平等的。
  • 相反,更高粒度的组件(例如头发)在人与人之间不同,而且在同一个人的照片之间也不同。头发在图片中的位置取决于相对确定的选择(例如发型),但也取决于看似随机的影响(例如风)。

噪声决定了这些更高粒度的组件。下图中女人的头发在什么位置?如果它是由 StyleGAN 生成的,那么它就不会由您接下来会听到的样式驱动,而是由随机性驱动,从而产生噪声。

噪声张量是从高斯分布中得出的(Karras 等人,2018)。

2.3 w 如何转换为样式

        现在我们知道噪声如何为生成的图片添加随机性,是时候了解样式以及它们如何控制图像合成过程了。

        这从映射网络生成的潜在向量w开始。

        该向量被馈送到下面概述中称为A 的部分——神经网络的学习仿射变换部分。

在欧几里得几何中,仿射变换或亲和力(来自拉丁语,affinis, “连接”)是保留直线和平行度(但不一定是距离和角度)的几何变换。

维基百科

        例如,如果我们有向量2 \\ 3,仿射变换将能够产生向量4 \\ 6(尺度 2 在空间中具有相同的线,但只是更长,因此没有保留距离)。

        从概念上讲,这意味着仿射变换可以在不彻底修改图像的情况下改变图像分量,因为仿射变换的输出必须与输入“连接”,即潜在向量w

        输入向量w转换为样式y,其中y = ( y _s, y _b)。这些分别是样式的比例偏差组件(您将在下面了解它们的使用方式)。它们具有与它们将控制的合成张量相同的形状。

        仿射变换是在训练期间学习的,因此是可用于控制较低粒度组件(例如发型、肤色等)的图像合成过程的组件,而请记住,使用的是随机性例如,控制单根毛发的位置。

        您现在应该能够解释样式随机性如何使我们能够生成独特的图像。现在让我们更精确地了解样式如何控制图像生成。

基于自适应实例标准化的样式添加

与样式加法相关是两个向量的向量加法:

  • 添加噪声的常量张量(在第一个 4x4 像素合成块中)或到目前为止生成的张量(对于其他合成块)。
  • 仿射变换,然后进行自适应实例标准化(AdaIN)标准化。

这是 AdaIN 的样子:

这里,x_i是输入Tensor的第i个特征图(即向量的第i个元素), y是仿射变换生成的样式。

您可以在中间部分看到,特征图首先被归一化(或者更确切地说,标准化)为零均值、单位方差,然后通过样式缩放组件中的第i个元素进行缩放,并添加第i个偏差组件随后。

换句话说,AdaIN 确保生成的样式可以通过改变比例和/或偏差来控制(标准化)合成输入。这就是样式如何控制添加噪声的输入张量上的图像合成过程!

第二个和更高的合成块 - 上采样,然后控制

上面的文本主要关注第一个合成块 - 其输出是 4 x 4 像素图像。正如你可以想象的那样,这还不足以给人留下深刻的印象。

后续合成块(8x8、16x16、最高 1024x1024 像素)的工作方式与第一个合成块略有不同:

  • 首先,应用双线性上采样对图像进行上采样,然后使用具有 3x3 内核的 2d 卷积层进行学习下采样。
  • 随后,添加噪声,之后执行用于风格控制的AdaIn操作。
  • 然后,使用类似的卷积层进行另一个下采样,之后执行另一个噪声和风格控制。

对于第一层,这会生成 8x8 像素的图像,依此类推。

最终结果

StyleGAN 在面部训练时的最终结果非常惊人!

在我的下一篇文章中,我们将了解如何使用 PyTorch 实现 StyleGAN。感谢您的阅读!

资料参考

Karras, T.、Laine, S. 和 Aila, T. (2018)。用于生成对抗网络的基于样式的生成器架构。 arXiv 预印本 arXiv:1812.04948

Goodfellow, IJ、Pouget-Abadie, J.、Mirza, M.、Xu, B.、Warde-Farley, D.、Ozair, S.……和 Bengio, Y. (2014)。生成对抗网络。 arXiv 预印本 arXiv:1406.2661

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1280799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6-13连接两个字符串

#include<stdio.h> int main(){int i0,j0;char s1[222],s2[333];printf("请输入第一个字符串&#xff1a;\n");gets(s1);//scanf("%s",s1);printf("请输入第二个字符串&#xff1a;\n");gets(s2);while(s1[i]!\0)i;while(s2[j]!\0)s1[i]s2…

python--自动化办公(Word)

python自动化办公之—Word python-docx库 1、安装python-docx库 pip install python-docx2、基本语法 1、打开文档 document Document() 2、加入标题 document.add_heading(总标题,0) document.add_heading(⼀级标题,1) document.add_heading(⼆级标题,2) 3、添加文本 para…

IdleStateHandler 心跳机制源码详解

优质博文&#xff1a;IT-BLOG-CN 一、心跳机制 Netty支持心跳机制&#xff0c;可以检测远程服务端是否存活或者活跃。心跳是在TCP长连接中&#xff0c;客户端和服务端定时向对方发送数据包通知对方自己还在线&#xff0c;保证连接的有效性的一种机制。在服务器和客户端之间一…

深度学习记录--梯度下降法

什么是梯度下降法&#xff1f; 梯度下降法是用来求解成本函数cost函数中使得J(w,b)函数值最小的参数(w,b) 梯度下降法的实现 通过对参数w,b的不断更新迭代&#xff0c;使J(w,b)的值趋于局部最小值或者全局最小值 如何进行更新&#xff1f; 以w为例&#xff1a;迭代公式 ww-…

Go连接mysql数据库

package main import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" ) //go连接数据库示例 func main() {// 数据库信息dsn : "root:roottcp(192.168.169.11:3306)/sql_test"//连接数据库 数据库类型mysql,以及数据库信息d…

【数据库】基于封锁的数据库调度器,以及等待锁处理的优先级策略

封锁调度器的体系结构 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会…

LeedCode刷题---子数组问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、最大子数组和 题目链接&#xff1a;最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连…

开发猿的平平淡淡周末---2023/12/3

2023/12/3 天气晴 温度适宜 AM 早安八点多的世界&#xff0c;起来舒展了下腰&#xff0c;阳光依旧明媚&#xff0c;给平淡的生活带来了一丝暖意 日常操作&#xff0c;喂鸡&#xff0c;时政&#xff0c;洗漱&#xff0c;恰饭&#xff0c;肝会儿游戏 看会儿手机 ___看累…

“此应用专为旧版android打造,因此可能无法运行”,问题解决方案

当用户在Android P系统上打开某些应用程序时&#xff0c;可能会弹出一个对话框&#xff0c;提示内容为&#xff1a;“此应用专为旧版Android打造&#xff0c;可能无法正常运行。请尝试检查更新或与开发者联系”。 随着Android平台的发展&#xff0c;每个新版本通常都会引入新的…

[英语学习][6][Word Power Made Easy]的精读与翻译优化

[序言] 针对第18页的阅读, 进行第二次翻译优化以及纠错, 这次译者的翻译出现的严重问题: 没有考虑时态的变化导致整个翻译跟上下文脱节, 然后又有偷懒的嫌疑, 翻译得很随意. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西,…

基于SSM的职业高中智慧作业试题系统设计

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;JSP 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 一、…

基于Java SSM框架实现师生交流答疑作业系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现师生交流答疑作业系统演示 摘要 在新发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;人们对师生交流平台越来越重视&#xff0c;更好的实…

【5G PHY】5G NR 如何计算资源块的数量?

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

分享一个国内可用的免费AI-GPT网站

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 我们也忍不住做了一个基于ChatGPT的网站&#xff0c;可以免登陆&#xff01;&#xff01;国内可直接对话AI&#xff0c;也有各种提供工作效率的工具供大家使用。 可以这…

Python的模块与库,及if __name__ == ‘__main__语句【侯小啾python领航班系列(二十四)】

Python的模块与库,及if name == __main__语句【侯小啾python领航班系列(二十四)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

c# OpenCV 读取、显示和写入图像(二)

读取、显示和写入图像是图像处理和计算机视觉的基础。即使在裁剪、调整大小、旋转或应用不同的滤镜来处理图像时&#xff0c;您也需要先读取图像。因此&#xff0c;掌握这些基本操作非常重要。 imread()读取图像imshow()在窗口中显示图像imwrite()将图像保存到文件目录里 我们…

Python:私人定制密码保险库 - Vault

简介&#xff1a;Vault是一种用于安全访问机密的工具。秘密是您想要严格控制访问权限的任何内容&#xff0c;例如API密钥、密码、证书等等。Vault为任何机密提供了统一的界面&#xff0c;同时提供了严格的访问控制并记录了详细的审核日志。 历史攻略&#xff1a; Python&…

Android 相机库CameraView源码解析 (三) : 滤镜相关类说明

1. 前言 这段时间&#xff0c;在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位&#xff0c;在项目前期&#xff0c;的确为我们节省了不少时间。 但随着项目持续深入&#xff0c;对于CameraView的使用进入深水区&#xff0c;逐…

【springboot】启动失败 Failed to start bean ‘webServerStartStop‘

lsof -i&#xff1a;xxx 发现端口被占用 kill掉该进程

大模型的RPA应用 | 代理流程自动化(APA),开启智能自动化新纪元

随着技术创新的持续推进&#xff0c;自动化技术已经变得至关重要&#xff0c;成为驱动企业和社会向前发展的核心动力。在自动化的里程碑中&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;已经有效地将简单、重复且规则性的任务自动化。可是随着对处理更为复杂、多变且…