VAE模型简析和精要(原理和代码)
1. 前言
这篇博客主要用于记录VAE的原理部分。
一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。
如有不对之处,欢迎评论区指出错误,你我共同进步学习!
图均引用自4部分的博客!!!!!!!
2. 正文
这篇博客集各博客之长,比较简洁易懂:因为有的博客交代清楚了原理,但损失函数部分比较迷惑,有的是公式比较清晰,但原理比较迷惑,我从我个人的角度,把我认为比较直观的地方做一个总结。
AE(Auto-Encoder)自编码器
VAE(Variational Auto-Encoder)变分自编码器
变分在哪里?

2.1 整体结构
编码器就是想把一个物体投到隐空间,相当于编码的过程,提取输入的特征,用向量的形式表征出来,便于运算。
普通编码器的结构:

VAE的结构:

2.2 主要目的
假设任何人像图片都可以由表情、肤色、性别、发型等几个特征的取值来唯一确定,那么我们将一张人像图片输入自动编码器后将会得到这张图片在表情、肤色等特征上的取值的向量X’,而后解码器将会根据这些特征的取值重构出原始输入的这张人像图片。

但如果输入蒙娜丽莎的照片,将微笑特征设定为特定的单值(相当于断定蒙娜丽莎笑了或者没笑)显然不如将微笑特征设定为某个取值范围(例如将微笑特征设定为x到y范围内的某个数,这个范围内既有数值可以表示蒙娜丽莎笑了又有数值可以表示蒙娜丽莎没笑)更合适,于是:

就可以把确定的事件描述为概率分布:

然后最后再采样得到所谓的latent变量Z

2.3 损失函数
再来看一下网络结构:

vae的loss函数为两项,重构损失(reconstruct loss)以及kl散度正则项(kl loss),分别对应模型训练过程希望达成的两个目的。

2.3.1
重构损失(reconstruct loss)希望vae生成的结果和输入之间的差异比较小。
2.3.2
kl散度正则项(kl loss)希望编码器生成的隐变量尽可能符合标准正态分布。
为什么呢?详情请查看其他博客的公式推导,因为本文主打一个简洁,公式就不再赘述。

大概也就是下面这个图:

2.4 代码实现
这是pytorch里面的代码实现过程:
class VAE(nn.Module):
def __init__(self):
super(VAE, self).__init__()
self.fc1 = nn.Linear(784, 400)
self.fc21 = nn.Linear(400, 20)
self.fc22 = nn.Linear(400, 20)
self.fc3 = nn.Linear(20, 400)
self.fc4 = nn.Linear(400, 784)
def encode(self, x):
h1 = F.relu(self.fc1(x))
return self.fc21(h1), self.fc22(h1)
def reparameterize(self, mu, logvar):
std = torch.exp(0.5*logvar)
eps = torch.randn_like(std)
return mu + eps*std
def decode(self, z):
h3 = F.relu(self.fc3(z))
return torch.sigmoid(self.fc4(h3))
def forward(self, x):
mu, logvar = self.encode(x.view(-1, 784))
z = self.reparameterize(mu, logvar)
return self.decode(z), mu, logvar
给出简单的计算图:

大家对比代码和计算图一起食用,效果更佳!
注意:reparam的代码部分和图的部分对应于我之前的结构图的这个部分:

3. 后记
这篇博客点到为止,日后我会继续补充,保证你看完后大概明白其原理而不会像其他博客一样一头雾水,因为笔者把很多博客的精华都提炼出来了。
zsy 2025.1.21
4. Acknowledge
本文参考的博客如下:
https://zhuanlan.zhihu.com/p/64485020
https://zhuanlan.zhihu.com/p/578619659
https://zhuanlan.zhihu.com/p/345360992
https://blog.csdn.net/A2321161581/article/details/140632339
下面这篇博客写的非常详细:
https://spaces.ac.cn/archives/5253
VAE模型简析和精要(原理和代码)的更多相关文章
- Https协议简析及中间人攻击原理
1.基础知识 1.1 对称加密算法 对称加密算法的特点是加密密钥和解密密钥是同一把密钥K,且加解密速度快,典型的对称加密算法有DES.AES等 ...
- Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)
Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...
- Java内存模型简析
1.多线程基础 线程通信,是指线程之间以何种机制来交换信息.其中通信的机制有两种:内存共享和消息传递.内存共享是指线程之间通过写-读内存中的公共状态隐式进行通讯(Java):消息传递在线程之间没有公共 ...
- ASP.NET管道模型简析
我相信在第一次听到这个名词时,有的小伙伴会一脸懵,而且还有很多疑问,其实我在第一次接触这个概念时跟很多小伙伴一样一脸懵. 接下来我将以我自己的理解来讲述什么是管道模型. 什么是管道模型 首先有没有小伙 ...
- css盒子模型简析
盒子模型分为标准盒子模型和怪异的盒子模型 1.标准的盒模型 (content-box) 你设置的宽和高(width/height)是内容的部分宽高,所以盒子的实际宽度=内容的宽高+boder+padd ...
- SIFT特征原理简析(HELU版)
SIFT(Scale-Invariant Feature Transform)是一种具有尺度不变性和光照不变性的特征描述子,也同时是一套特征提取的理论,首次由D. G. Lowe于2004年以< ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- PHP的错误报错级别设置原理简析
原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- [转载] Thrift原理简析(JAVA)
转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...
随机推荐
- Python 在PDF中绘制线条、矩形、椭圆形
在PDF中绘制图形可以增强文档的视觉效果.通过添加不同类型的形状,如实线.虚线.矩形.圆形等,可以使文档更加生动有趣,提高读者的阅读兴趣.这对于制作报告.演示文稿或是教材特别有用.本文将通过以下几个示 ...
- golang 正则表达式
package main import "bytes" import "fmt" import "regexp" func main() { ...
- Eclipse JDT--AST入门
最近做program analysis,需要解析Java的源代码,于是就去看了看Abstract Syntax Tree(AST,中文为抽象语法树).有点无奈的是,网上关于这方面的资料比我想象中的少, ...
- 反编译工具之Jadx
jadx 是一款功能强大的反编译工具,使用起来简单方便(拖拽式操作),不光提供了命令行程序,还提供了 GUI 程序.一般情况下,我们直接使用 GUI 程序就可以了. jadx 支持 Windows.L ...
- Graylog之进阶操作
有关系统的索引,权限,pipline 参考文章: https://mp.weixin.qq.com/s/LROHPjZEJPMsS5M_a3pPFw https://blog.csdn.net/wei ...
- 1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!
测试数据汇总 表 1 PCIe总线介绍 PCIe,即PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准.主要用 ...
- 如何给自己的网站添加live2D女仆
<script type="text/javascript" charset="utf-8" src="https://files.cnblo ...
- 推荐7个最强Appium替代工具,移动App自动化测试必备!
在移动应用开发日益火爆的今天,自动化测试成为了确保应用质量和用户体验的关键环节.Appium 作为一款广泛应用的移动应用自动化测试工具,为测试人员所熟知.然而,在不同的测试场景和需求下,还有许多其他优 ...
- 1.猿人学web爬虫攻防第一题 js混淆源码乱码
题目链接:http://match.yuanrenxue.com/match/1 1.首先我们打开F12开发者工具,点击..... 我们可以看到在请求中有m的加密参数! 2.根据题目js混淆,我们寻找 ...
- 【Python】【MySQL】Python将JSON数据以文本形式存放到MySQL的Text类型字段中
1.起因 在做一个自动打卡的玩意.登录会得到那个平台一系列的信息.我又不想专门修改.增加数据库字段来存放,所有打算直接将返回的JSON数据保存到一个MySQL字段中. 内容肯定不能直接放,考虑下比如数 ...