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,同时具有序列化.发序列化机制:当我们开 ...
随机推荐
- 使用WebRTC技术搭建小型的视频聊天页面
目录 目录 参考资料 什么是WebRTC? 能做什么? 架构图 个人理解(类比) 核心知识点 核心知识点类比 ICE框架 STUN(协议) NAT(网络地址转换) TURN SDP(会话描述协议) W ...
- 23、表空间及段区块_1(段区块管理、pctfree、数据块结构、行迁移、高水位)
oracle数据库的物理存储结构 1.spfile:参数文件 2.controlfile:控制文件 3.datafile:数据文件 4.redo log 5.arch:归档日志 oracle数据库的d ...
- SpringMVC-Mybatis-Maven项目整合
上次不知道为什么,把写好的系列文章都搞成一样了.结果,五篇文章,都变成了最后一篇文章. 悲剧,好吧,只好重新写了. 这系列文章写的是SpringMVC-Mybatis-Maven项目整合.说白了,其实 ...
- x-easypdf 初始
一.概述 一个 java 语言简化处理 pdf 的框架 项目主页 https://x-easypdf.cn 项目概述 x-easypdf是一个java语言简化处理pdf的框架,包含fop模块与pdfb ...
- manim边做边学--多面体
在Manim中,对于多面体,有一系列封装好的类可以直接使用. 使用它们,可以方便快速的构建正多面体: Polyhedron:通过顶点和面的参数构建任意多面体 Tetrahedron:四面体 Octah ...
- Astro v5 x DevNow
先介绍下 DevNow DevNow Github 体验网站 DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论.搜索等功能,欢迎大家体验.同时也支持 Follow ...
- Playfair密码
Playfair密码 Playfair cipher (普莱费尔密码)一种古典对称式密码,是首个双字母替换的加密法.尽管以现在的眼光来看这种加密是非常不安全的,但是它加密的过程还是蛮有意思的. 这种加 ...
- word操作类
public class WordUtility { private _Application wordApp = null; private _Document wordDoc = null; pu ...
- vue使用docxtemplater导出word
安装 // 安装 docxtemplater npm install docxtemplater pizzip --save // 安装 jszip-utils npm install jszip-u ...
- 【Amadeus原创】域用户完美执行应用程序
企业环境中,为了安全起见一般都没有赋予域用户或者企业的PC客户端用户管理员权限. 但偶尔会有个别的程序一定需要管理员身份才能执行,如财务某些程序或专业的应用程序.那么如何不赋予用户管理员权限及密码但又 ...