GAN學習筆記

P331 Generator

def create_generator(generator_inputs,generator_outputs_channels):

(1). 編碼器

with tf.variable_scope("encoder_1"): 

因為 變量共享 的需求
在訓練深度網(wǎng)絡時夏跷,為了減少需要訓練參數(shù)的個數(shù)(比如具有simase結(jié)構(gòu)的LSTM模型)矢沿、或是多機多卡并行化訓練大數(shù)據(jù)大模型(比如數(shù)據(jù)并行化)等情況時嗅剖,往往需要并享變量。另外一方面是當一個深度學習模型變得非常復雜的時候,往往存在大量的變量和操作衬鱼,如何避免這些變量名和操作名的唯一不重復,同時維護一個條例清晰的graph非常重要憔杨。因此鸟赫,tensorflow中用tf.Variable(),tf.get_variable,tf.Variable_scope(),tf.name_scope()幾個函數(shù)來實現(xiàn)。例:

import tensorflow as tf

with tf.name_scope('name_scope_x'):
    var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
    var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
    var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(var1.name, sess.run(var1))
    print(var3.name, sess.run(var3))
    print(var4.name, sess.run(var4))
# 輸出結(jié)果:
# var1:0 [-0.30036557]   可以看到前面不含有指定的'name_scope_x'
# name_scope_x/var2:0 [ 2.]
# name_scope_x/var2_1:0 [ 2.]  可以看到變量名自行變成了'var2_1'消别,避免了和'var2'沖突

第一層:

encoder_1: [batch, 256, 256, in_channels] => [batch, 128, 128, ngf]

之后幾層:

encoder_2: [batch, 128, 128, ngf] => [batch, 64, 64, ngf * 2]
encoder_3: [batch, 64, 64, ngf * 2] => [batch, 32, 32, ngf * 4]
encoder_4: [batch, 32, 32, ngf * 4] => [batch, 16, 16, ngf * 8]
encoder_5: [batch, 16, 16, ngf * 8] => [batch, 8, 8, ngf * 8]
encoder_6: [batch, 8, 8, ngf * 8] => [batch, 4, 4, ngf * 8]
encoder_7: [batch, 4, 4, ngf * 8] => [batch, 2, 2, ngf * 8]
encoder_8: [batch, 2, 2, ngf * 8] => [batch, 1, 1, ngf * 8]

P351 LRelu(激活函數(shù))

rectified = lrelu(layers[-1], 0.2)

ELU的表達式:

image

四種激活函數(shù)(ELU抛蚤,LReLU,ReLU寻狂,SReLU)比較圖:


image.png

激活函數(shù)def lrelu(x, a):使用了近幾年在DL中非乘昃火的LReLU,但效果是否較好不得而知蛇券,可嘗試使用Sigmoid缀壤、tanh樊拓,另過去的一些實驗中LReLU對準確率并沒有太大的影響,也可嘗試經(jīng)改進后可自適應地從數(shù)據(jù)中學習參數(shù)的PReLU(Parametric Rectified Linear Unit塘慕,帶參數(shù)的ReLU)和在一定程度上能起到正則效果的RReLU(隨機糾正線性單元)筋夏。
這一方面可做大量實驗進行驗證。

P345 Batch Normalization(批量標準化)

 output = batchnorm(convolved)

因為深層神經(jīng)網(wǎng)絡在做非線性變換前的激活輸入值(就是那個x=WU+B苍糠,U是輸入)隨著網(wǎng)絡深度加深或者在訓練過程中叁丧,其分布逐漸發(fā)生偏移或者變動,之所以訓練收斂慢岳瞭,一般是整體分布逐漸往非線性函數(shù)的取值區(qū)間的上下限兩端靠近(對于Sigmoid函數(shù)來說拥娄,意味著激活輸入值WU+B是大的負值或正值),所以這導致后向傳播時低層神經(jīng)網(wǎng)絡的梯度消失瞳筏,這是訓練深層神經(jīng)網(wǎng)絡收斂越來越慢的本質(zhì)原因稚瘾,而BN就是通過一定的規(guī)范化手段,把每層神經(jīng)網(wǎng)絡任意神經(jīng)元這個輸入值的分布強行拉回到均值為0方差為1的標準正態(tài)分布姚炕。這樣使得激活輸入值落在非線性函數(shù)對輸入比較敏感的區(qū)域摊欠,這樣輸入的小變化就會導致?lián)p失函數(shù)較大的變化,意思是這樣讓梯度變大柱宦,避免梯度消失問題產(chǎn)生些椒,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度掸刊。

(2). 解碼器

decoder_8: [batch, 1, 1, ngf * 8] => [batch, 2, 2, ngf * 8 * 2]
decoder_7: [batch, 2, 2, ngf * 8 * 2] => [batch, 4, 4, ngf * 8 * 2]
decoder_6: [batch, 4, 4, ngf * 8 * 2] => [batch, 8, 8, ngf * 8 * 2]
decoder_5: [batch, 8, 8, ngf * 8 * 2] => [batch, 16, 16, ngf * 8 * 2]
decoder_4: [batch, 16, 16, ngf * 8 * 2] => [batch, 32, 32, ngf * 4 * 2]
decoder_3: [batch, 32, 32, ngf * 4 * 2] => [batch, 64, 64, ngf * 2 * 2]
decoder_2: [batch, 64, 64, ngf * 2 * 2] => [batch, 128, 128, ngf * 2]
decoder_1: [batch, 128, 128, ngf * 2] => [batch, 256, 256, generator_outputs_channels]

P369 skip_layer
ResNet(Residual Networks免糕,殘差網(wǎng)絡)
網(wǎng)絡越深,梯度消失的現(xiàn)象就越來越明顯忧侧,網(wǎng)絡的訓練效果也不會很好石窑。
所以在ResNet中引入了一種叫residual network殘差網(wǎng)絡結(jié)構(gòu),其和普通的CNN的區(qū)別在于從輸入源直接向輸出源多連接了一條傳遞線蚓炬,也就是所謂的恒等映射松逊,用來進行殘差計算。這叫是shortcut connection,也叫skip connection肯夏。其效果是為了防止網(wǎng)絡層數(shù)增加而導致的梯度彌散問題與退化問題经宏。


Image 034.png

將最后一層以外的所有層都與最后一層進行了級聯(lián),將級聯(lián)后的新圖進行了解卷積

input = tf.concat([layers[-1], layers[skip_layer]], axis=3
Image 035.png

image.png

P400 Discriminator
Conditional GAN流程:


image.png

P437

# create two copies of discriminator, one for real pairs and one for fake pairs
# they share the same underlying variables

輸入:

2x [batch, height, width, in_channels] => [batch, height, width, in_channels * 2]
layer_1: [batch, 256, 256, in_channels * 2] => [batch, 128, 128, ndf]
layer_2: [batch, 128, 128, ndf] => [batch, 64, 64, ndf * 2]
layer_3: [batch, 64, 64, ndf * 2] => [batch, 32, 32, ndf * 4]
layer_4: [batch, 32, 32, ndf * 4] => [batch, 31, 31, ndf * 8]
layer_5: [batch, 31, 31, ndf * 8] => [batch, 30, 30, 1]

最終:

2x [batch, height, width, channels] => [batch, 30, 30, 1]

GAN原理:
判別模型D的訓練目的就是要盡量最大化自己的判別準確率驯击。當這個數(shù)據(jù)被判別為來自于真實數(shù)據(jù)時烁兰,標注 1,自于生成數(shù)據(jù)時余耽,標注 0缚柏。
而與這個目的相反的是苹熏,生成模型G的訓練目標碟贾,就是要最小化判別模型D的判別準確率币喧。


image.png

在訓練過程中,GAN采用交替優(yōu)化方式袱耽,分為兩個階段杀餐。
第一個階段是固定判別模型D,然后優(yōu)化生成模型G朱巨,使得判別模型的準確率盡量降低史翘。
第二個階段是固定生成模型G,來提高判別模型的準確率冀续。
(P449) discriminator_loss

with tf.name_scope("discriminator_loss"):
        # predict_real => 1
        # predict_fake => 0
        discrim_loss = tf.reduce_mean(-(tf.log(predict_real + EPS) + tf.log(1 - predict_fake + EPS)))

(P455) generator_loss

with tf.name_scope("generator_loss"):
       # predict_fake => 1

可以用import string來引入系統(tǒng)的標準string.py, 而用from pkg import string來引入當前目錄下的string.py了
from__future__importabsolute_import
精確除法
from __future__ import division

P27
以真實地顯示程序代碼區(qū)段之間的時序關系以及正在執(zhí)行程序代碼的個別線程與處理內(nèi)核琼讽。
將追蹤的部份傳送到主機或儲存至檔案
列印追蹤的部份以便文件化及檢閱程式碼
parser.add_argument("--trace_freq", type=int, default=0, help="trace execution every trace_freq steps")

P69 Lab -> P 155
def preprocess_lab(lab):
RGB顏色空間 基于顏色的加法混色原理,從黑色不斷疊加Red洪唐,Green钻蹬,Blue的顏色,最終可以得到白色光凭需。
Lab顏色空間是由CIE(國際照明委員會)制定的一種色彩模式问欠。自然界中任何一點色都可以在Lab空間中表達出來,它的色彩空間比RGB空間還要大粒蜈。最主要的是這種模式是以數(shù)字化方式來描述人的視覺感應顺献,由于Lab的色彩空間要 比RGB模式色彩空間大,意味著RGB以及CMYK所能描述的色彩信息在Lab空間中都能得以影射枯怖。Lab顏色空間取坐標Lab注整,其中L亮度;a的正數(shù)代表紅色嫁怀,負端代表綠色设捐;b的正數(shù)代表黃色,負端代表藍色塘淑。Lab顏色被設計來接近人類視覺萝招。它致力于感知均勻性,它的L分量密切匹配人類亮度感知存捺。因此可以被用來通過修改a和b分量的輸出色階來做精確的顏色平衡槐沼,或使用L分量來調(diào)整亮度對比。
顏色模型 (Lab) 基于人對顏色的感覺捌治。Lab 中的數(shù)值描述正常視力的人能夠看到的所有顏色岗钩。

P72 白化(待定,暫不講)
如果在圖像處理中對輸入圖像進行白化(Whiten)操作的話——所謂白化肖油,就是對輸入數(shù)據(jù)分布變換到0均值兼吓,單位方差的正態(tài)分布——那么神經(jīng)網(wǎng)絡會較快收斂。
但在模型訓練過程中進行白化操作會帶來過高的計算代價和運算時間森枪。
# L_chan: black and white with input range [0, 100]

P96
返回一個生成具有正態(tài)分布的張量的初始化器视搏。
initializer=tf.random_normal_initializer(0, 0.02)

P100

padding="VALID"

P126 批標準化
tf.nn.batch_normalization

P134 反卷積

 # [batch, in_height, in_width, in_channels], [filter_width, filter_height, out_channels, in_channels]
 #     => [batch, out_height, out_width, out_channels]

反卷積的矩陣操作 : C.T * A = B

P136

padding="SAME"

P155
def rgb_to_lab(srgb):
RGB無法直接轉(zhuǎn)換成LAB审孽,需要先轉(zhuǎn)換成XYZ再轉(zhuǎn)換成LAB,即:RGB——XYZ——LAB浑娜。
Function [R, G, B] = Lab2RGB(L, a, b)
(1)P164 RGB轉(zhuǎn)XYZ
設r,g,b為像素三個通道佑力,

RGB(1).png

RGB(2).png

M=

0.4124,0.3576,0.1805

0.2126,0.7152,0.0722

0.0193,0.1192,0.9505

RGB(2)等同于如下公式:

X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505

本例中:

 rgb_to_xyz = tf.constant([
        #    X        Y          Z
        [0.412453, 0.212671, 0.019334], # R
        [0.357580, 0.715160, 0.119193], # G
        [0.180423, 0.072169, 0.950227], # B
 ])
xyz_pixels = tf.matmul(rgb_pixels, rgb_to_xyz)

(2)XYZ轉(zhuǎn)LAB

LAB(1).png

上述公式中,L筋遭,a打颤,b*是最終的LAB色彩空間三個通道的值。X漓滔,Y编饺,Z是RGB轉(zhuǎn)XYZ后計算出來的值
# convert to fx = f(X/Xn), fy = f(Y/Yn), fz = f(Z/Zn) (P174)

fxfyfz_to_lab = tf.constant([
     #  l       a       b
     [  0.0,  500.0,    0.0], # fx
     [116.0, -500.0,  200.0], # fy
     [  0.0,    0.0, -200.0], # fz
])
lab_pixels = tf.matmul(fxfyfz_pixels, fxfyfz_to_lab) +tf.constant([-16.0, 0.0, 0.0])

P464

tf.train.AdamOptimizer

Adam優(yōu)化算法:是一個尋找全局最優(yōu)點的優(yōu)化算法,引入了二次方梯度校正响驴。

P475

ema = tf.train.ExponentialMovingAverage(decay=0.99)
update_losses = ema.apply([discrim_loss, gen_loss_GAN, gen_loss_L1])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末反肋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子踏施,更是在濱河造成了極大的恐慌石蔗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畅形,死亡現(xiàn)場離奇詭異养距,居然都是意外死亡,警方通過查閱死者的電腦和手機日熬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門棍厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竖席,你說我怎么就攤上這事耘纱。” “怎么了毕荐?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵束析,是天一觀的道長。 經(jīng)常有香客問我憎亚,道長员寇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任第美,我火速辦了婚禮蝶锋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘什往。我一直安慰自己扳缕,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躯舔,像睡著了一般贡必。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庸毫,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音衫樊,去河邊找鬼飒赃。 笑死,一個胖子當著我的面吹牛科侈,可吹牛的內(nèi)容都是我干的载佳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼臀栈,長吁一口氣:“原來是場噩夢啊……” “哼蔫慧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起权薯,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姑躲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盟蚣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黍析,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年屎开,在試婚紗的時候發(fā)現(xiàn)自己被綠了阐枣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡奄抽,死狀恐怖蔼两,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逞度,我是刑警寧澤额划,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站档泽,受9級特大地震影響锁孟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茁瘦,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一品抽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甜熔,春花似錦圆恤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羽历。三九已至,卻和暖如春淡喜,著一層夾襖步出監(jiān)牢的瞬間秕磷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工炼团, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澎嚣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓瘟芝,卻偏偏與公主長得像易桃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锌俱,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容