90天學(xué)會GAN--Day5--從MNIST數(shù)據(jù)集開始

另一個賽道的圖片生成:VAE&CVAE?
1. VAE
1.1 Introduction?
VAE做的東西其實(shí)與GAN很像,做的實(shí)際上也是一個從一個分布到另一個分布的映射。?
只是現(xiàn)在的分布不是隨機(jī)生成的高斯分布了,而是能代表原本圖片的高斯分布。?
VAE由兩個部分組成,一個是encoder, 用于生成圖片專屬的高斯分布,另一個是decoder, 用于將高斯分布還原回圖片。
之后就會統(tǒng)計(jì)生成的圖片和還原的圖片之間的差值,并用這個差值來訓(xùn)練這個神經(jīng)網(wǎng)絡(luò)。?
1.2 Encoder?
encoder 的做法是將原圖片投影到 hidden_space 然后再分別投影給 μ 和 σ 來得到一個正態(tài)分布。?
然后我們在這個正態(tài)分布上隨機(jī)選擇一個點(diǎn) (此處用 z_- score 來表示) 然后將這個點(diǎn)輸入到 decoder 中生成圖像。?
因此,我們就可以得出 encoder 的代碼:

1.3 Decoder?
Decoder 的做法其實(shí)和 Encoder 反過來差不多。?
也就是 z_score → hidden_layer → generate_picture?
所以我們也很容易就得出代碼:

1.4 VAE.model?
然后將上面兩個融合一下再加入一些 import 的庫就變成了:

1.5 Train?
這一步其實(shí)與之前的基本相同:

1.6 Save?
這里 save_img的方式是:

save_model的方式是:

2 CVAE
2.1 Introduction
如我們在 GAN 到 CGAN 的想法一致,既然生成了一個圖片那能否通過標(biāo)簽來控制它生成特定的圖片呢??
當(dāng)然可以,而且方法和 GAN → CGAN 幾乎一致:將 labels 插入到圖片后面作為輸入。?
這里我們還可以換一種理解方式:在將 labels 插入圖片后再輸入相當(dāng)于生成了圖片的下半部分來讓 decoder 生成上半部分。
那為了減少差距,decoder 就會生成和加入標(biāo)簽一致的圖片。?
2.2 Change?
改動的地方也不多,除了 Train 中的 model(data)→model(data,labels) 外,只需要在 forward 中稍加改動即可。

當(dāng)然,self.fc1() 和 self.fc3() 中的輸入維度也需要更改,增加一個 label_dim 就好了:
