另一个赛道的图片生成:VAE&CVAE
1. VAE
1.1 Introduction
(资料图片)
VAE做的东西其实与GAN很像,做的实际上也是一个从一个分布到另一个分布的映射。
只是现在的分布不是随机生成的高斯分布了,而是能代表原本图片的高斯分布。
VAE由两个部分组成,一个是encoder, 用于生成图片专属的高斯分布,另一个是decoder, 用于将高斯分布还原回图片。
之后就会统计生成的图片和还原的图片之间的差值,并用这个差值来训练这个神经网络。
1.2 Encoder
encoder 的做法是将原图片投影到 hidden_space 然后再分别投影给 μ 和 σ 来得到一个正态分布。
然后我们在这个正态分布上随机选择一个点 (此处用 z_- score 来表示) 然后将这个点输入到 decoder 中生成图像。
因此,我们就可以得出 encoder 的代码:
1.3 Decoder
Decoder 的做法其实和 Encoder 反过来差不多。
也就是 z_score → hidden_layer → generate_picture
所以我们也很容易就得出代码:
1.4 VAE.model
然后将上面两个融合一下再加入一些 import 的库就变成了:
1.5 Train
这一步其实与之前的基本相同:
1.6 Save
这里 save_img的方式是:
save_model的方式是:
2 CVAE
2.1 Introduction
如我们在 GAN 到 CGAN 的想法一致,既然生成了一个图片那能否通过标签来控制它生成特定的图片呢?
当然可以,而且方法和 GAN → CGAN 几乎一致:将 labels 插入到图片后面作为输入。
这里我们还可以换一种理解方式:在将 labels 插入图片后再输入相当于生成了图片的下半部分来让 decoder 生成上半部分。
那为了减少差距,decoder 就会生成和加入标签一致的图片。
2.2 Change
改动的地方也不多,除了 Train 中的 model(data)→model(data,labels) 外,只需要在 forward 中稍加改动即可。
当然,self.fc1() 和 self.fc3() 中的输入维度也需要更改,增加一个 label_dim 就好了: