stylegan是在progan的基礎上改進而來,所以要分析漸近生成的訓練過程看progan的代碼更加明白,其實progan和stylegan的代碼也差不多
一.生成器的結構是networks_progan.py中的G_paper(.............)函數
1.latents_in.set_shape(),初始化輸入變量
2.labels_in其實用不着
3.lod_in,控制網絡結構的關鍵變量,在training_loop.py中賦值爲sched.lod
4.函數block(x,res)功能:將輸入特徵圖的尺寸翻倍
res=2時,接一個全連接然後reshape成4*4的特徵圖,再卷積
res>2時,upscale-conv 後再接一個conv
5.函數torgb(x,res)功能:將特徵圖通道數變成3
6.然後就是網絡主結構了,分爲兩個實現方式,linear和recursive,linear實現方式更易懂一點
原論文中說,以4*4爲例,訓練完畢4*4的尺寸之後,加入8*8的block繼續訓練,這裏有一個關鍵點,當前訓練尺寸爲size,那麼大於size的網絡模塊都用上採樣來搭建,整個網絡的大致圖如下:
理解lerp_clip(img,images_out,lod_in-lod)函數最爲重要,
以目標圖像512,訓練4*4爲例,lod=[6,0],
訓練開始lod_in=7,那麼lod_in-lod一直大於等於1,則lerp_clip()函數輸出一直是images_out,也就是不斷的上採樣;
當lod_in等於6.x了,說明4*4已經訓練完畢,當lod=6,lerp_clip()函數輸出img+(images_out-img)*(6.x-6)說明8*8的模塊已經加入了,並且隨着訓練的進行,lod_in逐漸降低,img的權重越來越高,也就是論文中中所著的fade in new layers smoothly.
recursive有點坑,img被初始化爲一個對4*4的特徵圖torgb之後一直上採樣到目標尺寸圖像大小,lod_in<lod爲True時,grow下一個分辨率的網絡模塊
二.D.paper(..................)很簡單啊,G的鏡像
除了這個訓練結構困擾了我這麼久,其他看起來都很簡單啊哈哈哈哈哈哈哈哈哈