自编码器整理(AE、VAE、CVAE差异)

在学习的过程中做个整理,可能有错误的地方还望指正。

【变分自编码器VAE】可视化讲明白_哔哩哔哩_bilibili(大致的概念)

VAE和CVAE原理简介以及代码实现_哔哩哔哩_bilibili(详细些)

发展过程:AE——>VAE——>CAVE,以下以图片生成为例(也有在其他方面的应用)。

自编码器(AE,autoencoder

模型架构:

输入层——>中间层——>潜变量——>中间层——>输出层(中间层可能有多层)。

|----------------编码器------------|------------解码器----------------|

即AE将输入图片编码为潜变量(也叫隐变量),再通过解码器还原图片(重构)。目标是尽可能地还原,可通过最小化均方误差(MSE)实现,即比较数据预测值与实际值的差值。

L_{\text{recon}} = \| x - \hat{x} \|^2 = \sum_{i=1}^n (x_i - \hat{x}_i)^2                                        式1

其价值在于生成的潜变量在数据量上往往比原始数据小(潜变量数量人为设定,越小越难以还原,可能出现图像不像或训练时间过长),可用于图像压缩。

如批次为128,尺寸为28*28的图像,其数据结构为[128*28*28],其在网络中的处理可能如下:

[128*28*28]-->[128*784]-->[128*258]-->[128*2]-->[128*258]-->[128*784]-->[128*28*28]

在潜变量空间上看(即把训练好的解码器单独拿出来),输入的样本映射到潜变量空间一系列的点上,在那些点上取值可得到与输入样本最像的重构图像,但对于其他的点,生成的图像未必含有你想要的特征,下方的视频讲得十分清楚。为了让潜变量空间中未映射到的点有含义,提出了VAE。

【生成模型VAE】十分钟带你了解变分自编码器及搭建VQ-VAE模型(Pytorch代码)!简单易懂!—GAN/机器学习/监督学习_哔哩哔哩_bilibili

变分自编码器(VAEvariational autoencoder),变分自编码器,生成一类与输入图像有相同特征,但又不完全相同的图像

自编码器(AE)通过神经网络强化学习实现以极小的数据量(潜变量)重构原始数据,即使潜变量空间中某点能够对原始数据有损重构而不保证相邻位置保留目标特征,VAE作为AE的拓展,在模型优化的过程中对一个范围内的潜变量都做出要求(即将隐变量命名为均值和方差,由此确定一个正态分布,在这个正态分布上的采样点通过解码器生成的数据都需要满足相较于输入数据的最小化损失),实现隐变量空间的在未训练点能够表现出一定目标特征,进而实现生成式重构(即保留一定特征但又有所不同)。为避免采样导致损失函数与模型参数之间失去连续的公式表示使梯度方向不可知,引入重参数技巧。

VAE模型损失函数除了上面提到的重构损失(式1),还有KL散度(式2),KL散度可用于判断两个分布的相似情况,两个分布越接近,KL散度越小,最低为0(完全相同)。这里将KL散度作为损失函数,用于鼓励潜变量分布趋近标准正态分布,避免模型为减小重构函数无限制地减低标准差,计算公式如下,其中q(z|x)表示在输入x的条件下生成的潜变量z,与标准正态分布p(z)。

D_{\mathrm{KL}}(q(z|x))||p(z))) = \sum_{i} q(i|x) \log \frac{q(i|x)}{p(i)}                                    式2

最终用于优化的损失函数为重构函数与DL散度的加权和(式3),β为加权因子,根据模型效果进行修改。

L_{\text{total}} = L_{\text{recon}} + \beta \cdot D_{\text{KL}}(q(z|x) \parallel p(z))                                   式3

通过上示损失函数,一方面,保证解码器生成的预测值尽可能与实际值相似,另一方面,保证对潜变量采样尽可能与标准正态分布相似。以这两个目标进行训练,得到最合适的编码器设计。

条件变分自编码器(CVAEconditional variational autoencoder),生成带有标签的图像。

最后CVAE,C表示有条件的,指在生成的图像时附加了条件,如你输入一组数字的图片(0~9),如果你用AE,你会得到一张确定的和10张图片都沾点边的图像,如果用VAE,你会得到一系列的和10张图片都沾点边的图像,而如果你用CVAE,那你首先需要对10张图片打个标签,然后你会得到10类图片,对应0~9的10个数字,而且每类图片都有指定数字的辨识度(感觉有点像对10个图片独立作VAE)。(这里感觉还不是很清楚,后面有时间再看看其他资料)

具体的代码实战可以参考下方的博客。

Pytorch实现: VAE | DaNing的博客

data_train = MNIST('MNIST_DATA/', train=True, download=False, transform=transform)
data_valid = MNIST('MNIST_DATA/', train=False, download=False, transform=transform)

如果显示找不到MNIST数据集,这里把download改为True。

输出结果,左边是模型训练过程中的损失函数,右边是在潜变量空间内进行均匀采样解码得到的图片集合。

如果觉得效果一般,可以在中间多加一层(如128的全连接)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值