AIGC实战——VQ-GAN(Vector Quantized Generative Adversarial Network)

news2024/11/24 2:14:03

AIGC实战——VQ-GAN

    • 0. 前言
    • 1. VQ-GAN
    • 2. ViT VQ-GAN
    • 小结
    • 系列链接

0. 前言

本节中,我们将介绍 VQ-GAN (Vector Quantized Generative Adversarial Network) 和 ViT VQ-GAN,它们融合了变分自编码器 (Variational Autoencoder, VAE)、Transformer 和生成对抗网络 (Generative Adversarial Network, GAN) 的思想,VQ-GANMuse (Google 提出的文本生成图像生成模型)的关键组成部分。

1. VQ-GAN

VQ-GAN (Vector Quantized GAN) 是于 2020 年提出的生成对抗网络 (Generative Adversarial Network, GAN) 架构,这种模型架构建立在以下基础上:变分自编码器 (Variational Autoencoder, VAE)学习到的表示可以是离散的,而不仅是连续的。这种模型称为 Vector Quantized VAE (VQ-VAE),能够用于生成高质量的图像,同时避免了传统连续潜空间 VAE 经常出现的一些问题,比如后验坍塌(由于过强的解码器导致学到的潜空间不具有信息性)。
离散潜空间指的是一个学习到的向量列表 (codebook),每个向量与相应的索引关联。在 VQ-VAE 中,编码器的任务是将输入图像压缩为一个较小的向量网格,然后将其与 codebook 进行比较。对于每个网格向量,选择最接近该网格方格向量的 codebook 向量(通过欧氏距离),并将其传递给解码器,如下图所示。codebook 是一个长度为 d d d (嵌入大小)的学习向量列表,与编码器输出和解码器输入中的通道数相匹配。例如, e 1 e_1 e1 是一个可以解释为背景的向量。

VQ-VAE

codebook 可以看作是编码器和解码器共享的一组可学习的离散概念,以便描述给定图像的内容。VQ-VAE 需要找到使这组离散概念尽可能具有信息性的方法,以便编码器可以用对解码器有意义的特定码向量准确地标记每个网格正方形。因此,VQ-VAE 的损失函数需要在重构损失加上以下两项:对齐损失 (alignment loss) 和承诺损失 (commitment loss),以确保编码器的输出向量尽可能接近 codebook 中的向量。使用这些项替代了经典 VAE 中编码分布与标准高斯先验之间的 KL 散度项。
承诺损失 (Commitment loss) 是一种在生成对抗网络 (Generative Adversarial Network, GAN) 中使用的损失函数,旨在促使编码器网络将输入图像的特征信息有效地编码到潜在空间中。
在一般的 GAN 架构中,编码器网络负责将输入图像编码为潜在空间的向量表示,而生成器网络则将该向量映射回原始图像域。为了确保编码过程不丢失重要的图像细节和特征,我们需要鼓励编码器将不同图像之间的相似特征映射到相似的潜在向量附近。
Commitment loss 的目标是最小化潜在向量之间的平均方差,从而迫使编码器将相似图像的潜在表示映射到相近的位置,即使在生成器的输出图像上也能保持这种相似性。通过这种方式,编码器被迫"承诺"将输入图像的特征有效地编码到潜在空间中,以减小潜在向量间的差异。
通过最小化 Commitment loss,可以使编码器网络更好地捕捉图像的特征和结构,并将相似的图像编码为接近的潜在向量。这有助于提高生成图像的质量和一致性,并保持输入图像与生成图像之间的相似性。
然而,VQ-VAE 如何采样新的 codebook 以传递给解码器生成新的图像?显然,使用均匀先验(为每个网格方格均等概率选择每个编码)并不可行。例如,在 MNIST 数据集中,左上角的网格方格很有可能被编码为背景,而靠近图像中心的网格方格则不太可能被编码为背景。为了解决这个问题,VQ-VAE 使用了另一个模型,即自回归模型 PixelCNN,根据先前的编码向量预测网格中下一个编码向量。换句话说,先验由模型学习,而不像传统 VAE 中的先验是静态的。
VQ-VAE 架构的关键变化如下图所示。

VQ=VEA

首先,VQ-GAN 模型中包含了一个 GAN 判别器,它试图区分 VAE 解码器的输出和真实图像,并带有相应的对抗损失函数。与 VAE 相比,GAN 能够生成更清晰的图像,因此添加判别器改善了整体图像质量。需要注意的是,尽管名字中包含 “GAN”,但 VQ-GAN 模型仍然包含 VAEGAN 判别器只是作为一个额外的组件而并未替代 VAE
其次,GAN 判别器并不是一次性预测整个图像的真假,而是预测图像中的小块区域 (patch) 是真实的还是伪造的。PatchGAN 判别器会输出一个预测向量(每个区域一个预测),而不是直接预测整个图像(单个预测值)。使用 PatchGAN 判别器的好处是损失函数可以度量判别器在样式上(而非内容上)区分图像的能力。由于判别器预测的每个元素都是基于图像的一个小区域,必须使用方块的样式而不是内容来做出决策。我们知道 VAE 生成的图像在风格上比真实图像更模糊,因此 PatchGAN 判别器可以促使 VAE 解码器生成比其自然产生的图像更清晰的图像。
第三,VQ-GAN 不再使用单一的均方差重构损失来比较输入图像像素和 VAE 解码器输出的像素,而是使用感知损失项,在编码器和对应的解码器的中间层计算特征图之间的差异,这种损失函数会产生更逼真的图像生成结果。
最后,VQ-GAN 使用 Transformer (而不是 PixelCNN )作为模型的自回归部分,用于生成编码序列。TransformerVQ-GAN 完全训练完毕后进行单独的训练阶段。与其以完全自回归方式使用先前的符号不同,VQ-GAN 选择仅使用滑动窗口范围内的符号来预测符号。这确保模型能够适应更大的图像,这需要更大的潜变量网格大小,因此 Transformer 需要生成更多的符号。

2. ViT VQ-GAN

Yu 等人对 VQ-GAN 进行了扩展,用 Transformer 替换 VQ-GAN 中的卷积编码器和解码器,如下图所示。

ViT VQ-GAN

在编码器中,使用了 Vision Transformer (ViT),ViT 是一种神经网络架构,将最初设计用于自然语言处理的 Transformer 模型应用于图像数据。ViT 不使用卷积层从图像中提取特征,而是将图像分为一系列小区域,对其进行分词,然后作为输入传递给编码器 Transformer
具体而言,在 ViT VQ-GAN 中,非重叠的输入小区域(每个大小为 8 × 8 )首先被展平,然后投影到一个低维嵌入空间中,其中添加了位置嵌入。然后,这个序列被传递给一个标准的编码器 Transformer,并根据学到的 codebook 对结果进行量化。这些整数编码随后由解码器 Transformer 模型处理,最终的输出是一个区域序列,可以重新拼接成原始图像。整个编码器-解码器模型作为自编码器进行端到端训练。
与原始 VQ-GAN 模型一样,第二阶段的训练使用自回归解码器 Transformer 生成编码序列。因此,除了 GAN 判别器和学习的 codebook 外,ViT VQ-GAN 总共还包含三个 Transformer。下图展示了 ViT VQ-GAN 生成的示例图像。

小结

VQ-GAN 模型中,将几种不同类型的生成模型进行有效地组合,VQ-GAN 通过额外的对抗损失项鼓励 VAE 生成更清晰的图像。使用自回归T ransformer 构建了一系列能够由 VAE 解码器解码的编码符号。ViT VQ-GAN 进一步扩展了这一思想,将 VQ-GAN 的卷积编码器和解码器替换为 Transformers

系列链接

AIGC实战——生成模型简介
AIGC实战——深度学习 (Deep Learning, DL)
AIGC实战——卷积神经网络(Convolutional Neural Network, CNN)
AIGC实战——自编码器(Autoencoder)
AIGC实战——变分自编码器(Variational Autoencoder, VAE)
AIGC实战——使用变分自编码器生成面部图像
AIGC实战——生成对抗网络(Generative Adversarial Network, GAN)
AIGC实战——WGAN(Wasserstein GAN)
AIGC实战——条件生成对抗网络(Conditional Generative Adversarial Net, CGAN)
AIGC实战——自回归模型(Autoregressive Model)
AIGC实战——改进循环神经网络
AIGC实战——像素卷积神经网络(PixelCNN)
AIGC实战——归一化流模型(Normalizing Flow Model)
AIGC实战——能量模型(Energy-Based Model)
AIGC实战——扩散模型(Diffusion Model)
AIGC实战——GPT(Generative Pre-trained Transformer)
AIGC实战——Transformer模型
AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)
AIGC实战——StyleGAN(Style-Based Generative Adversarial Network)

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

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

相关文章

科技驱动未来,提升AI算力,GPU扩展正当时

要说这两年最火的科技是什么?我想“AI人工智能”肯定是最有资格上榜的,尤其ChatGPT推出后迅速在社交媒体上走红,短短5天,注册用户数就超过100万,2023年一月末,ChatGPT的月活用户更是突破1亿,成为…

内网kift私有网盘如何实现在外网公网访问?快解析映射方案

KIFT是一款面向个人、团队、小型组织的网盘服务器系统,安装运行比较简单,开箱即用,下载解压,双击jar文件即可启动。因为是开源的,不少人选择使用KIFT做开源私有网盘,有能力的大佬还可以对它进行定制开发。 …

python 列表对象函数

对象函数必须通过一个对象调用。 列表名.函数名() append() 将某一个元素对象添加在列表的表尾 如果添加的是其他的序列,该序列也会被看成是一个数据对象 count() 统计列表当中 某一个元素出现的次数 extend() 在当前列表中 将传入的其他序列的元素添加在表尾…

养猫必看!毛发护理秘籍,猫粮选择大揭秘!

亲爱的猫友们,我们都知道,猫咪的毛发是它们健康与美丽的象征。选择一款合适的猫粮,对于猫咪的毛发健康至关重要。那么,如何根据猫咪的毛发情况来选择合适的猫粮呢?接下来,就让我来为你详细解答吧&#xff0…

5.前后端分离

目录 一、前后端分离上传文件 1.在yml中设置port和localhost 2.如何使用postman测试上传文件的接口 二、如何导出excel文件 ​编辑1.在pom.xml中导包 2.在实体类中给每个字段添加注解,导出表格时,列名将会改为对应的中文 3.controller中方法的具体…

Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

原文首发链接:Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好,我是码农先森。 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的,它是一种点对点的通信技术,通过浏览器之间建立对等连接,实现音频…

4.Labview簇、变体与类(上)

在Labview中,何为簇与变体,何为类?应该如何理解?具体有什么应用场景? 本文基于Labview软件,独到的讲解了簇与变体与类函数的使用方法和场景,从理论上讲解其数据流的底层概念,从实践上…

CSS基础之伪元素选择器(如果想知道CSS的伪元素选择器知识点,那么只看这一篇就足够了!)

前言:我们已经知道了在CSS中,选择器有基本选择器、复合选择器、伪类选择器、那么选择器学习完了吗?显然是没有的,这篇文章讲解最后一种选择器——伪元素选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

如何把npm切换成yarn管理项目

1.删掉项目中package-lock.json和依赖包 这一步手动删掉就好 2.全局安装yarn npm install -g yarn 3.可以开始执行yarn install安装依赖 1)执行yarn init 这一步是修改npm生成的package.json文件,可能会遇到这个问题: 这个查了一下是有…

cesium primitive 移动 缩放 旋转 矩阵

旋转参考:cesium 指定点旋转rectangle Primitive方式 矩阵篇-CSDN博客 平移参考:cesium 调整3dtiles的位置 世界坐标下 相对坐标下 平移矩阵-CSDN博客 一、primitive方式添加polygon let polygonInstance new Cesium.GeometryInstance({geometry: Ce…

智能商品计划系统如何提升鞋服零售品牌的竞争力

国内鞋服零售企业经过多年的发展,已经形成了众多知名品牌,然而近年来一些企业频频受到库存问题的困扰,这一问题不仅影响了品牌商自身,也给长期合作的经销商带来了困扰。订货会制度在初期曾经有效地解决了盲目生产的问题&#xff0…

【python】flask结合SQLAlchemy,在视图函数中实现对数据库的增删改查

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

C++11(下篇)

文章目录 C111. 模版的可变参数1.1 模版参数包的使用 2. lambda表达式2.1 Lambda表达式语法捕获列表说明 2.2 lambda的底层 3. 包装器3.1 function包装器3.2 bind 4. 线程库4.1 thread类4.2 mutex类4.3 atomic类4.4 condition_variable类 C11 1. 模版的可变参数 C11支持模版的…

初学若依笔记

初学若依 下载ruoyi(以前后端分离板为例) https://ruoyi.vip/ 部署 安装mysql安装redis将数据库和redis配置到若依 配置文件为 ruoyi-admin\src\main\resource\application-druid.yml 运行 略 开发自己的功能 创建模块 为了不影响原有功能,创建一个模块写自…

[AI]-(第0期):认知深度学习

深度学习是一种人工智能(AI)方法,用于教计算机以受人脑启发的方式处理数据。 深度学习模型可以识别图片、文本、声音和其他数据中的复杂模式,从而生成准确的见解和预测。 您可以使用深度学习方法自动执行通常需要人工智能完成的…

深入理解大语言模型微调技术

一、概念解析 1、什么是微调(Fine-tuning)? 大模型微调,也称为Fine-tuning,是指在已经预训练好的大型语言模型基础上(一般称为“基座模型”),使用特定的数据集进行进一步的训练&am…

pandas基本用法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas的数据结构1、一维数组pd.Series1.1 pd.Series(data,index,dtype)示例1:不定义index示例2:自定义inde…

【C++学习】C++IO流

这里写目录标题 🚀C语言的输入与输出🚀什么是流🚀CIO流🚀C标准IO流🚀C文件IO流 🚀C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取…

14.C++常用的算法_排序算法

文章目录 遍历算法1. sort()代码工程运行结果 2. random_shuffle()代码工程运行结果第一次运行结果第二次运行结果第三次运行结果 3. merge()代码工程运行结果 4. reverse()代码工程运行结果 遍历算法 1. sort() 代码工程 sort()函数默认是升序排列,如果想要降序…

Jenkins配置windows/linux从节点

背景: 环境:jenkins环境(Ubuntu) 节点机器:Linux、Windows 前置条件: 节点机器:安装java、allure、python 1 Linux节点管理机器添加 1.1 系统管理->节点列表->New Node 1.2 节点配置…