VAE(4)——实现

 

终于到了实现的地方。前面干燥乏味的公式推导和理论阐述已经让很多人昏昏欲睡了,下面我们要提起精神,来看看这个模型的一个比较不错的实现——GitHub - cdoersch/vae_tutorial: Caffe code to accompany my Tutorial on Variational Autoencoders,当然,这个实现也是一个配套tutorial文章的实现。感兴趣的童鞋也可以看看这篇tutorial,相信会对这个模型有更多的启发。

这个实现的目标数据集是MNIST,这和我们之前的DCGAN是一样的。当然,在他的tutorial中,他一共展现了3个模型。下面我们就从prototxt文件出发,先来看看我们最熟悉的经典VAE。

VAE

说实话一看他在github给出的那张图,即使是有一定的VAE模型基础的童鞋也一定会感觉有些发懵。我们将模型中的一些细节隐去,只留下核心的数据流动和loss计算部分,那么这个模型就变成了下面的样子:

 

图中的黑色的框表示数据的流动,红色的框表示求loss的地方。双红线表示两个不同部分的数据共享。可以看出图的上边是encoder的部分,也就是从X到z的过程,下面是从z到X的过程。前面的文章中我们给出了求解的公式,现在我们给出了这个网络模型,我们可以把这两部分对照起来。

另外其中的encoder和decoder部分被省略了,在实际网络中,我们可以用一个深度神经网络模型代替。除此之外,图中还有三个主要部分:

  • 首先是q(z|X)的loss计算。
  • 其次是z的随机生成。
  • 最后是p(X|z)的loss计算。

https://zhuanlan.zhihu.com/p/22684931

这其中最复杂的就是第一项,q(z|X)的loss计算。由于caffe在实际计算过程中主要采用向量的计算方式,所以前面的公式需要进行一定的变换:

KL(p1(\mu_1,\sigma_1)||N(0,I))=\frac{1}{2}[-\sum_i{log [(\sigma_{1i})}] - d + \sum_i(\sigma_{1i})+\mu_1^T \mu_1]

=\sum_{i=0}^{d}{-\frac{1}{2}log[std_{1i}^2]}+\sum_{i=0}^{d}(-\frac{1}{2})+\sum_{i=0}^d\frac{1}{2}(std_{1i}^2)+\sum_{i=0}^d\frac{1}{2}[\mu_{1i}^2]

=\sum_{i=0}^{d}[{-\frac{1}{2}log[std_{1i}^2]}+\frac{1}{2}(std_{1i}^2)+\frac{1}{2}[\mu_{1i}^2]+(-\frac{1}{2})]

在完成了前面的向量计算后,最后一步是做Reduction,也就是完成加和的过程。这样就使得计算可以顺利完成。

看懂了这些部分,再加上前面我们对VAE的了解,相信我们对VAE模型有了更加清晰的认识。

MNIST生成模型可视化

下面这张图是一次实验过程中产生的,看上去有点像所有数字在一个平面的分布,数字与数字之间还存在着一定的过渡区域。那么这张图是如何产生的呢?

一个比较简单的方法,就是把z的维度设为2。以下就是这幅图生成的过程:

  1. 利用VAE模型进行训练,得到了模型中的\mu\sigma
  2. 完成z的采样过程,我们在二维空间内按照N(0,I)有规律地进行采样noise,把noise、\mu\sigma结合起来
  3. 把得到采样后的z,最后利用decoder把z转换成X,显示出来

 

经过这样几步我们就可以得到最终的图像了。实际上我们前面提过的GAN模型也可以用类似的方法生成这样的图像。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值