生成网络 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计算。 这其中最复杂的就是第一项,q(z|X)的loss计算。由于caffe在实际计算过程中主要采用向量的计算方式,所以前面的公式需要进行一定的变换: 在完成了前面的向量计算后,最后一步是做Reduction,也就是完成加和的过程。这样就使得计算可以顺利完成。 看懂了这些部分,再加上前面我们对VAE的了解,相信我们对VAE模型有了更加清晰的认识。 MNIST生成模型可视化 下面这张图是一次实验过程中产生的,看上去有点像所有数字在一个平面的分布,数字与数字之间还存在着一定的过渡区域。那么这张图是如何产生的呢? 一个比较简单的方法,就是把z的维度设为2。以下就是这幅图生成的过程: 经过这样几步我们就可以得到最终的图像了。实际上我们前面提过的GAN模型也可以用类似的方法生成这样的图像。
|
|