2017年8月19日星期六整理第五章部分
此處給出本節(jié)的代碼:https://github.com/Leechen2014/TensorFlow-for-Machine-Intelligence
相關(guān)的文件描述在github中給出洒忧。
PS:翻譯來源:
http://shop.oreilly.com/product/9781939902351.do
PS: 我發(fā)現(xiàn):? 最近發(fā)現(xiàn)蝴韭,短文比較好一些。 如果按照章節(jié)來上傳文章熙侍,會導致文章太長榄鉴。 我也沒有寫摘要履磨。而且在翻譯的時候我會有一些自己的想發(fā)。
于是決定:從5.3 以后的每個章節(jié)會給出自己的寫的摘要庆尘,同時會以PS的方式給出自己對作者這句話的理解蹬耘。文中有翻譯不恰當?shù)牡胤剑埓蠹叶喽嗯u指教减余。另外給出我的郵箱综苔。如果有想要一起翻譯并研讀機器學習的同學請發(fā)郵件給我: zhen_2016@qq.com;?? 多謝了
摘要:
5.3Common Layers 會 以上下兩部分發(fā)布。
上部分主要涉及? tf的卷積以及 激活函數(shù) 的操作與實現(xiàn)
下部分 主要涉及 池化層的實現(xiàn)以及 Normalization 和High Level Layers
對于要被認為是CNN的神經(jīng)網(wǎng)絡(luò)架構(gòu)而言位岔,它需要至少一個卷積層(tf.nn.conv2d)如筛。才能稱為CNN。單層的CNN有著實際應(yīng)用(邊緣檢測)抒抬,而對于圖像的識別和分類杨刨,通常使用的是不同類型的layer來支持卷積層的。這些layers會有助于減少過擬合擦剑、加速訓練妖胀、降低對內(nèi)存使用。
本章中涵蓋的層次集中在CNN架構(gòu)中常用的layer上惠勒。這些layer不限于僅應(yīng)用于CNN赚抡,他們還可以為其他的網(wǎng)絡(luò)架構(gòu)設(shè)計的層混合使用。
Convolution Layers(tf.nn.conv2d)
tf.nn.conv2d是卷積層的一種類型纠屋,它在前面的章節(jié)中已被詳細描述涂臣。但是對于高水平的用戶還是有一些有用的notes。Tensorflow中的卷積層并不會做完全的卷積售担,詳細的內(nèi)容可以到Tensorflow
API 說明文檔中找到赁遗。在實踐中,性能是tensorflow的操作和卷積的差異族铆。TensorFlow使用一種技術(shù)來加速所有不同類型的卷積層的卷積運算岩四。
每種類型的卷積層都有用例,但是tf.nn.conv2d是一個很好的起點哥攘。其他類型的卷積在構(gòu)建能夠進行對象識別和分類的網(wǎng)絡(luò)中是有用的但不是必需的剖煌。包括每個的簡要摘要。
tf.nn.depthwise_conv2d
當需要一個卷積的輸出作為另一個卷積的輸入的時候献丑,可以使用這種卷積末捣。這里有一個使用該卷積按照inception 結(jié)構(gòu)來創(chuàng)建網(wǎng)絡(luò)結(jié)構(gòu)的高級用例。
tf.nn.separable_conv2d
這個卷積類的作用和tf.nn.conv2d相似创橄,但是并不可以替代tf.nn.conv2d。對于較大的模型莽红,我們可以用它來替代tf.nn.conv2d卻不犧牲精度妥畏。對于小型模型邦邦,它將會以差的精度快速收斂。
tf.nn.conv2d_transpose
這將內(nèi)核應(yīng)用于新功能圖(特征圖醉蚁,feature map)燃辖,其中每個部分都填充與內(nèi)核相同的值。隨著內(nèi)核跨越新的圖像网棍,任何重疊的部分都被合并在一起黔龟。Stanford’s
CS231n Winter 2016: Lecture 13中有關(guān)于如何tf.nn.conv2d_transpose對可學習的上采樣(upsampling)有何作用的例子。
Activation Functions
這些函數(shù)(function)與其他層的輸出結(jié)合使用可以生成特征圖(feature map)滥玷。它們可用于平滑或可微(smooth or differentiate:PS這里涉及一點點高數(shù)的知識:函數(shù)如果可導的充要條件是函數(shù)的圖像是光滑的)某些操作的結(jié)果氏身。其目的是為了將非線性引入神經(jīng)網(wǎng)絡(luò)中。非線性意味著輸入的是曲線而不再是直線惑畴。(PS:如果是直線的話蛋欣,我們可以近似的看做離散值或者直接映射成輸入即可)。曲線能夠表示更復雜的輸入變化如贷。例如陷虎,非線性輸入能夠描述在大多數(shù)時間內(nèi)保持較小的輸入,但是周期性地具有極端的單個點杠袱。在神經(jīng)網(wǎng)絡(luò)中引用非線性可以使得網(wǎng)絡(luò)通過訓練在數(shù)據(jù)中發(fā)現(xiàn)復雜的模式(patterns)尚猿。
TensorFlow具有多種激活函數(shù)(TensorFlowhasmultiple activation functionsavailable)。在CNN中主要使用的是tf.nn.relu楣富,這是因為它可以通過丟失必要的信息來提升性能谊路。當開始學的時候(When starting out),建議使用tf.nn.relu菩彬,但高級用戶可能會創(chuàng)建自己的激活函數(shù)缠劝。這個時候需要考慮激活功能是否可用(),有幾個主要的考慮因素骗灶。
這些函數(shù)(function)與其他層的輸出結(jié)合使用可以生成特征圖(feature map)惨恭。它們可用于平滑或可微(smooth or differentiate:PS這里涉及一點點高數(shù)的知識:函數(shù)如果可導的充要條件是函數(shù)的圖像是光滑的)某些操作的結(jié)果。其目的是為了將非線性引入神經(jīng)網(wǎng)絡(luò)中耙旦。非線性意味著輸入的是曲線而不再是直線脱羡。(PS:如果是直線的話,我們可以近似的看做離散值或者直接映射成輸入即可)免都。曲線能夠表示更復雜的輸入變化锉罐。例如,非線性輸入能夠描述在大多數(shù)時間內(nèi)保持較小的輸入绕娘,但是周期性地具有極端的單個點脓规。在神經(jīng)網(wǎng)絡(luò)中引用非線性可以使得網(wǎng)絡(luò)通過訓練在數(shù)據(jù)中發(fā)現(xiàn)復雜的模式(patterns)。
TensorFlow具有多種激活函數(shù)(TensorFlowhasmultiple activation functionsavailable)险领。在CNN中主要使用的是tf.nn.relu侨舆,這是因為它可以通過丟失必要的信息來提升性能秒紧。當開始學的時候(When starting out),建議使用tf.nn.relu挨下,但高級用戶可能會創(chuàng)建自己的激活函數(shù)熔恢。這個時候需要考慮激活功能是否可用(),有幾個主要的考慮因素臭笆。
1.該函數(shù)應(yīng)該是單調(diào)(monotonic)的叙淌,因此其輸出應(yīng)隨著輸入的增加而逐漸增加。這個性質(zhì)可以使得梯度下降優(yōu)化來搜索局部最小值愁铺。
2.該函數(shù)應(yīng)該是可導(differentiable)的鹰霍,所以在函數(shù)域中的任何一點必須有一個導數(shù)。這使得梯度下降優(yōu)化使用此類型的激活函數(shù)的時候可以正常輸出帜讲。
能滿足以上條件的函數(shù)都可以考慮成為激活函數(shù)衅谷。在TensorFlow中不值得一提,畢竟是CNN架構(gòu)中常見的內(nèi)容似将。每個的簡要摘要都包含在一個小示例代碼中获黔,說明其用法。
tf.nn.relu
rectifier (rectified linear unit ),在一些文檔中被叫做斜坡函數(shù)(a ramp
function)在验,當繪制時看起來像一個滑板坡道玷氏。ReLu保持輸入的任何正數(shù)都是有線性的輸出而設(shè)置的所有負面的數(shù)字是0。他的優(yōu)點不會受到梯度消失(gradientvanishing)腋舌,并且就有[ 0盏触,正無窮]的輸出范圍。ReLu的缺點是當使用較大的學習率時块饺,它可能遭受神經(jīng)元飽和赞辩。
在這個示例中,代碼執(zhí)行的輸出結(jié)果是:
在這個例子中授艰,輸入中的整數(shù)值[-2,3]之間的一個張量(向量)辨嗽。tf.nn.relu函數(shù)運行的時候,輸出高亮顯示任何小于0的值被設(shè)置為0的值淮腾。其他輸入值保持不變糟需。
tf.sigmoid
sigmoid函數(shù)的返回值的范圍在[0.0, 1.0]。傳遞給sigmoid函數(shù)的值越大谷朝,輸出的值越靠近1.0洲押;當輸入的值越小,輸出的值越靠近0.0圆凰。sigmoid可以把任何值保持在[0.0, 1.0]范圍內(nèi)杈帐。這種能力對于訓練在[0,1]范圍內(nèi)的概率的網(wǎng)絡(luò)中是有用的。然而送朱,輸出值的減小范圍可能會導致輸入飽和和輸入變化過大的麻煩娘荡。
執(zhí)行以上程序后的輸出結(jié)果是:
在這個例子中干旁,整數(shù)的范圍被轉(zhuǎn)換為浮點值(1變?yōu)?.0)驶沼,Sigmoid函數(shù)在輸入要素上運行炮沐。結(jié)果表明,當0.0的值通過S形回怜,結(jié)果為0.5大年,這是類似物的域的中點。需要注意的是玉雾,0.5是S形的中點翔试,負值可以用作S形的輸入。
tf.tanh
雙曲正切函數(shù)(tanh)與tf.sigmoid是比較接近复旬,具有一些相同的優(yōu)點和缺點垦缅。tf.sigmoid和tf.tanh之間的主要區(qū)別在于:tf.tanh的范圍是[-1.0, 1.0]。在某些網(wǎng)絡(luò)架構(gòu)中輸出負值的能力可能是有用的驹碍。
以上程序的輸出結(jié)果是:
在本示例中壁涎,所有設(shè)置參數(shù)與tf.sigmoid示例相同,但輸出顯示了重要的區(qū)別志秃。在tf.tanh的輸出中怔球,中點為0.0,為負值浮还。如果網(wǎng)絡(luò)中的下一層沒有對負數(shù)或者是0.0的輸入做出異常判斷竟坛,則會導致程序出現(xiàn)故障。
tf.nn.dropout
基于可配置的概率將輸出設(shè)置為0.0钧舌。這個層在有些隨機性有助于訓練的情況下表現(xiàn)良好担汤。下面會給出一個示例性的情況:當被學習的模式與其相鄰功能太緊時。這個層會對正在學習的輸出增加一點噪音洼冻。
注意:該層只能在訓練中使用崭歧,因為它添加的隨機噪聲在測試時會產(chǎn)生誤導性的結(jié)果。
以上示例的輸出結(jié)果是:
在這個例子中碘赖,輸出的概率保持50%驾荣。這個層的每個執(zhí)行將具有不同的輸出(很有可能,它有點隨機)普泡。當輸出丟棄時播掷,其值設(shè)置為0.0。
PS:這個在實際情況中會常常用到撼班。你還記得dropOut是什么嘛歧匈。不知道的話看看知乎:
Krizhevsky等人是怎么想到在CNN里用Dropout和ReLu的?
PS:為了更加直觀的對比這幾個激活函數(shù),我在知乎上找到了這個圖片砰嘁,詳情請見:
請問人工神經(jīng)網(wǎng)絡(luò)中的activation
function的作用具體是什么件炉?為什么ReLu要好過于tanh和sigmoid function?
以及http://www.cnblogs.com/neopenx/p/4453161.html
PS: 稍后會給以下話題:
Imagesand TensorFlow
CNNImplementation
Conclusion
有點累了勘究, 上傳太費時間了。 為什么jianshu 只有android ios 的客戶端呢斟冕?? 我要去打球 :)
by 2017年 8月19日 晚上8點2o......