Tensorflow學習筆記---2--DCGAN代碼學習


以mnist數據訓練為例,學習DCGAN(deep convolutional generative adversarial networks)的網絡結構。

代碼下載地址https://github.com/carpedm20/DCGAN-tensorflow

注1:發現代碼中以mnist為訓練集的網絡和以無標簽數據集(以下簡稱unlabeled_dataset)為訓練集的網絡不同,結構有別。以下筆記主要針對前者(Generator=3個ReLU+1個Sigmoid,Discriminator=3個LeakyReLU+1個Sigmoid)。

注2:事實上,以unlabeled_dataset為訓練集的網絡也同原網頁中所畫的Generator有一些不同(事實上,區別是每個conv層的filter個數被減半了。原因可能為了減少網絡參數利於測試者訓練?)。除此以外,結構相同。Discriminator的結構與Generator的結構正好對稱。

 

原代碼中對於有label的數據集,Generator和Discriminator的網絡結構均只有兩個卷積層。

預備:batch_size=64, mnist圖片大小28*28*c_dim,其中c_dim=1為顏色維數,類別數10;隨機輸入維數z_dim=100

Generator 部分

step1(獲得輸入z):服從均勻分布的輸入樣本z(shape=64,100)與具有one-hot形式的標簽y (shape=64,10)級聯,整體作為Generator的輸入z (shape=64,110)

step2(獲得第一個非線性層的輸出h0): 通過線性變換將z變換為維數為gfc_dim=1024的數據,對其塊歸一化之后進行非線性ReLU變換,得到h0 (shape=64,1024);將h0與y級聯,整體作為下一層的輸入h0 (shape=64,1034)

step3(獲得第二個非線性層的輸出h1):通過線性變換將h0變換為維數為128*7*7=6272的數據,對其塊歸一化之后進行非線性ReLU變換,得到h1 (shape=64,6272);將h1進行reshape操作得到h1(shape=64,7,7,128);將h1與yb(yb為y的reshape形式,即最后一維為label維,yb的shape=64,1,1,10)級聯,整體作為下一層的輸入h1 (shape=64,7,7,139)

step4(獲得第三個非線性層的輸出h2):通過deconv2d操作,用128個filter,將h1變換為維數為64*14*14*128的數據,對其塊歸一化之后進行非線性ReLU變換,得到h2 (shape=64,14,14,128);將h2與yb級聯,整體作為下一層的輸入h2 (shape=64,14,14,139)

step5(獲得最終的生成圖像generated_image):通過deconv2d操作,用c_dim個filter,將h1變換為維數為64*28*28*1的數據,不做塊歸一化,進行非線性Sigmoid變換,得到generated_image(shape=64,28,28,1)

Discriminator 部分

step1(獲得輸入x):真實/生成圖像image(shape=64,28,28,1)和yb(shape=64,1,1,10)級聯,整體作為Discriminator的輸入x(shape=64,28,28,11)

step2(獲得第一個卷積層的輸出h0):用c_dim+y_dim=1+10=11個大小為5*5*11的filter對輸入x進行二維卷積操作,隨后進行非線性LeakyReLU變換,得到h0 (shape=64,14,14,11);將h0與標簽yb級聯,整體作為下一層的輸入h0(shape=64,14,14,21)

step3(獲得第二個卷積層的輸出h1):用df_dim+y_dim=64+10=74個大小為5*5*21的filter對h0進行二維卷積操作,塊歸一化(這層有)之后進行非線性LeakReLU變換,得到h1(shape=64,7,7,74);對h1進行reshape拉成每個樣本對應一維數據,並與標簽y (shape=64,10)級聯,整體作為下一層的輸入h1(shape=64,7*7*74+10=64,3636)

step4(獲得第三個卷積層的輸出h2):對h1進行線性變換,輸出維數為dfc_dim=1024的數據,塊歸一化(這層有)操作之后進行非線性LeakyReLU變換,得到h2 (shape=64,1024);將h2與y進行級聯,整體作為下一層的輸入h2(shape=64,1034

step5(獲得最終輸出h3):對h2進行線性變換,輸出維數為1(用來判斷真假)的數據,非線性Sigmoid變換之后得到最終輸出h3 (shape=64,1)  (注:實際代碼中將線性變換之后的結果也進行了輸出,用以計算loss)

Loss部分

真實圖像和生成圖像這兩種圖像都需要輸入Discriminator得到對應的loss,整體作為Discriminator的loss;

而Generator的loss只包含有關生成圖像部分;

用Adam訓練,每訓練兩次Generator,才對Discriminator進行一次訓練,防止Discriminator的loss的導數為0(無法更新)。

 

好吧,這樣看着代碼寫出來的步驟簡直太吃藕了,咱來用一下TensorBoard的功能,Generator和Discriminator的結構大概如下:

          Generator                                                                            

              

         Discriminator(其中maximum對應LeakyReLU變換)

 

是不是清晰養眼多了?大公司做出來的東西還是不錯的,考慮周到~好啦,DCGAN暫時就醬~~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM