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的表達式:
四種激活函數(shù)(ELU抛蚤,LReLU,ReLU寻狂,SReLU)比較圖:
激活函數(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ù)增加而導致的梯度彌散問題與退化問題经宏。
將最后一層以外的所有層都與最后一層進行了級聯(lián),將級聯(lián)后的新圖進行了解卷積
input = tf.concat([layers[-1], layers[skip_layer]], axis=3
P400 Discriminator
Conditional GAN流程:
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的判別準確率币喧。
在訓練過程中,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為像素三個通道佑力,
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
上述公式中,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])