[翻譯5.3] Common Layers (上)





2017年8月19日星期六整理第五章部分

此處給出本節的代碼:https://github.com/Leechen2014/TensorFlow-for-Machine-Intelligence

相關的文件描述在github中給出。

PS:翻譯來源:

http://shop.oreilly.com/product/9781939902351.do




PS: 我發現:? 最近發現,短文比較好一些。 如果按照章節來上傳文章,會導致文章太長。 我也沒有寫摘要。而且在翻譯的時候我會有一些自己的想發。

于是決定:從5.3 以后的每個章節會給出自己的寫的摘要,同時會以PS的方式給出自己對作者這句話的理解。文中有翻譯不恰當的地方,請大家多多批評指教。另外給出我的郵箱。如果有想要一起翻譯并研讀機器學習的同學請發郵件給我: zhen_2016@qq.com;?? 多謝了


摘要:

5.3Common Layers 會 以上下兩部分發布。

上部分主要涉及? tf的卷積以及 激活函數 的操作與實現

下部分 主要涉及 池化層的實現以及 Normalization 和High Level Layers



對于要被認為是CNN的神經網絡架構而言,它需要至少一個卷積層(tf.nn.conv2d)。才能稱為CNN。單層的CNN有著實際應用(邊緣檢測),而對于圖像的識別和分類,通常使用的是不同類型的layer來支持卷積層的。這些layers會有助于減少過擬合、加速訓練、降低對內存使用。

本章中涵蓋的層次集中在CNN架構中常用的layer上。這些layer不限于僅應用于CNN,他們還可以為其他的網絡架構設計的層混合使用。

Convolution Layers(tf.nn.conv2d)

tf.nn.conv2d是卷積層的一種類型,它在前面的章節中已被詳細描述。但是對于高水平的用戶還是有一些有用的notes。Tensorflow中的卷積層并不會做完全的卷積,詳細的內容可以到Tensorflow

API 說明文檔中找到。在實踐中,性能是tensorflow的操作和卷積的差異。TensorFlow使用一種技術來加速所有不同類型的卷積層的卷積運算。

每種類型的卷積層都有用例,但是tf.nn.conv2d是一個很好的起點。其他類型的卷積在構建能夠進行對象識別和分類的網絡中是有用的但不是必需的。包括每個的簡要摘要。


tf.nn.depthwise_conv2d

當需要一個卷積的輸出作為另一個卷積的輸入的時候,可以使用這種卷積。這里有一個使用該卷積按照inception 結構來創建網絡結構的高級用例。


tf.nn.separable_conv2d

這個卷積類的作用和tf.nn.conv2d相似,但是并不可以替代tf.nn.conv2d。對于較大的模型,我們可以用它來替代tf.nn.conv2d卻不犧牲精度。對于小型模型,它將會以差的精度快速收斂。


tf.nn.conv2d_transpose

這將內核應用于新功能圖(特征圖,feature map),其中每個部分都填充與內核相同的值。隨著內核跨越新的圖像,任何重疊的部分都被合并在一起。Stanford’s

CS231n Winter 2016: Lecture 13中有關于如何tf.nn.conv2d_transpose對可學習的上采樣(upsampling)有何作用的例子。




Activation Functions


這些函數(function)與其他層的輸出結合使用可以生成特征圖(feature map)。它們可用于平滑或可微(smooth or differentiate:PS這里涉及一點點高數的知識:函數如果可導的充要條件是函數的圖像是光滑的)某些操作的結果。其目的是為了將非線性引入神經網絡中。非線性意味著輸入的是曲線而不再是直線。(PS:如果是直線的話,我們可以近似的看做離散值或者直接映射成輸入即可)。曲線能夠表示更復雜的輸入變化。例如,非線性輸入能夠描述在大多數時間內保持較小的輸入,但是周期性地具有極端的單個點。在神經網絡中引用非線性可以使得網絡通過訓練在數據中發現復雜的模式(patterns)。

TensorFlow具有多種激活函數(TensorFlowhasmultiple activation functionsavailable)。在CNN中主要使用的是tf.nn.relu,這是因為它可以通過丟失必要的信息來提升性能。當開始學的時候(When starting out),建議使用tf.nn.relu,但高級用戶可能會創建自己的激活函數。這個時候需要考慮激活功能是否可用(),有幾個主要的考慮因素。


這些函數(function)與其他層的輸出結合使用可以生成特征圖(feature map)。它們可用于平滑或可微(smooth or differentiate:PS這里涉及一點點高數的知識:函數如果可導的充要條件是函數的圖像是光滑的)某些操作的結果。其目的是為了將非線性引入神經網絡中。非線性意味著輸入的是曲線而不再是直線。(PS:如果是直線的話,我們可以近似的看做離散值或者直接映射成輸入即可)。曲線能夠表示更復雜的輸入變化。例如,非線性輸入能夠描述在大多數時間內保持較小的輸入,但是周期性地具有極端的單個點。在神經網絡中引用非線性可以使得網絡通過訓練在數據中發現復雜的模式(patterns)。

TensorFlow具有多種激活函數(TensorFlowhasmultiple activation functionsavailable)。在CNN中主要使用的是tf.nn.relu,這是因為它可以通過丟失必要的信息來提升性能。當開始學的時候(When starting out),建議使用tf.nn.relu,但高級用戶可能會創建自己的激活函數。這個時候需要考慮激活功能是否可用(),有幾個主要的考慮因素。

1.該函數應該是單調(monotonic)的,因此其輸出應隨著輸入的增加而逐漸增加。這個性質可以使得梯度下降優化來搜索局部最小值。

2.該函數應該是可導(differentiable)的,所以在函數域中的任何一點必須有一個導數。這使得梯度下降優化使用此類型的激活函數的時候可以正常輸出。

能滿足以上條件的函數都可以考慮成為激活函數。在TensorFlow中不值得一提,畢竟是CNN架構中常見的內容。每個的簡要摘要都包含在一個小示例代碼中,說明其用法。


tf.nn.relu

rectifier (rectified linear unit ),在一些文檔中被叫做斜坡函數(a ramp

function),當繪制時看起來像一個滑板坡道。ReLu保持輸入的任何正數都是有線性的輸出而設置的所有負面的數字是0。他的優點不會受到梯度消失(gradientvanishing),并且就有[ 0,正無窮]的輸出范圍。ReLu的缺點是當使用較大的學習率時,它可能遭受神經元飽和。


在這個示例中,代碼執行的輸出結果是:


在這個例子中,輸入中的整數值[-2,3]之間的一個張量(向量)。tf.nn.relu函數運行的時候,輸出高亮顯示任何小于0的值被設置為0的值。其他輸入值保持不變。


tf.sigmoid

sigmoid函數的返回值的范圍在[0.0, 1.0]。傳遞給sigmoid函數的值越大,輸出的值越靠近1.0;當輸入的值越小,輸出的值越靠近0.0。sigmoid可以把任何值保持在[0.0, 1.0]范圍內。這種能力對于訓練在[0,1]范圍內的概率的網絡中是有用的。然而,輸出值的減小范圍可能會導致輸入飽和和輸入變化過大的麻煩。



執行以上程序后的輸出結果是:



在這個例子中,整數的范圍被轉換為浮點值(1變為1.0),Sigmoid函數在輸入要素上運行。結果表明,當0.0的值通過S形,結果為0.5,這是類似物的域的中點。需要注意的是,0.5是S形的中點,負值可以用作S形的輸入。


tf.tanh


雙曲正切函數(tanh)與tf.sigmoid是比較接近,具有一些相同的優點和缺點。tf.sigmoid和tf.tanh之間的主要區別在于:tf.tanh的范圍是[-1.0, 1.0]。在某些網絡架構中輸出負值的能力可能是有用的。




以上程序的輸出結果是:



在本示例中,所有設置參數與tf.sigmoid示例相同,但輸出顯示了重要的區別。在tf.tanh的輸出中,中點為0.0,為負值。如果網絡中的下一層沒有對負數或者是0.0的輸入做出異常判斷,則會導致程序出現故障。


tf.nn.dropout

基于可配置的概率將輸出設置為0.0。這個層在有些隨機性有助于訓練的情況下表現良好。下面會給出一個示例性的情況:當被學習的模式與其相鄰功能太緊時。這個層會對正在學習的輸出增加一點噪音。

注意:該層只能在訓練中使用,因為它添加的隨機噪聲在測試時會產生誤導性的結果。



以上示例的輸出結果是:



在這個例子中,輸出的概率保持50%。這個層的每個執行將具有不同的輸出(很有可能,它有點隨機)。當輸出丟棄時,其值設置為0.0。

PS:這個在實際情況中會常常用到。你還記得dropOut是什么嘛。不知道的話看看知乎:

Krizhevsky等人是怎么想到在CNN里用Dropout和ReLu的?

DropOut解決過擬合問題

PS:為了更加直觀的對比這幾個激活函數,我在知乎上找到了這個圖片,詳情請見:

請問人工神經網絡中的activation

function的作用具體是什么?為什么ReLu要好過于tanh和sigmoid function?

以及http://www.cnblogs.com/neopenx/p/4453161.html




PS: 給出以上涉及的函數 曲線? :)


PS: 稍后會給以下話題:

Imagesand TensorFlow

CNNImplementation

Conclusion

有點累了, 上傳太費時間了。 為什么jianshu 只有android ios 的客戶端呢?? 我要去打球 :)

by 2017年 8月19日 晚上8點2o......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容