首页 > 头条 > > 内容页

90天学会GAN--Day5--从MNIST数据集开始

2023-06-04 05:49:45 来源:哔哩哔哩 分享到 :

另一个赛道的图片生成: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 就好了:

推荐阅读