簡單的驗證碼識別(二)-----------tensorflow (CNN+RNN+LSTM)介紹

一、什麼是tensorflow?

    TensorFlow™ 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟件庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU),服務器,移動設備等等。TensorFlow 最初由Google大腦小組(隸屬於Google機器智能研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網絡方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。

 1. 數據流圖是什麼?

    數據流圖用“結點”(nodes)和“線”(edges)的有向圖來描述數學計算。“節點” 一般用來表示施加的數學操作,但也可以表示數據輸入(feed in)的起點/輸出(push out)的終點,或者是讀取/寫入持久變量(persistent variable)的終點。“線”表示“節點”之間的輸入/輸出關係。這些數據“線”可以輸運“size可動態調整”的多維數據數組,即“張量”(tensor)。張量從圖中流過的直觀圖像是這個工具取名爲“Tensorflow”的原因。一旦輸入端的所有張量準備好,節點將被分配到各種計算設備完成異步並行地執行運算。

  總結:數據流圖,就是一個帶權的有向圖(自己的理解)

  2. tensorflow的特性    

   高度的靈活性

   TensorFlow 不是一個嚴格的“神經網絡”庫。只要你可以將你的計算表示爲一個數據流圖,你就可以使用Tensorflow。你來構建圖,描寫驅動計算的內部循環。我們提供了有用的工具來幫助你組裝“子圖”(常用於神經網絡),當然用戶也可以自己在Tensorflow基礎上寫自己的“上層庫”。定義順手好用的新複合操作和寫一個python函數一樣容易,而且也不用擔心性能損耗。當然萬一你發現找不到想要的底層數據操作,你也可以自己寫一點c++代碼來豐富底層的操作。

   真正的可移植性(Portability)

Tensorflow 在CPU和GPU上運行,比如說可以運行在臺式機、服務器、手機移動設備等等。想要在沒有特殊硬件的前提下,在你的筆記本上跑一下機器學習的新想法?Tensorflow可以辦到這點。準備將你的訓練模型在多個CPU上規模化運算,又不想修改代碼?Tensorflow可以辦到這點。想要將你的訓練好的模型作爲產品的一部分用到手機app裏?Tensorflow可以辦到這點。你改變主意了,想要將你的模型作爲雲端服務運行在自己的服務器上,或者運行在Docker容器裏?Tensorfow也能辦到。Tensorflow就是這麼拽 :)

    將科研和產品聯繫在一起

過去如果要將科研中的機器學習想法用到產品中,需要大量的代碼重寫工作。那樣的日子一去不復返了!在Google,科學家用Tensorflow嘗試新的算法,產品團隊則用Tensorflow來訓練和使用計算模型,並直接提供給在線用戶。使用Tensorflow可以讓應用型研究者將想法迅速運用到產品中,也可以讓學術性研究者更直接地彼此分享代碼,從而提高科研產出率。

   自動求微分

基於梯度的機器學習算法會受益於Tensorflow自動求微分的能力。作爲Tensorflow用戶,你只需要定義預測模型的結構,將這個結構和目標函數(objective function)結合在一起,並添加數據,Tensorflow將自動爲你計算相關的微分導數。計算某個變量相對於其他變量的導數僅僅是通過擴展你的圖來完成的,所以你能一直清楚看到究竟在發生什麼。

  多語言支持

Tensorflow 有一個合理的c++使用界面,也有一個易用的python使用界面來構建和執行你的graphs。你可以直接寫python/c++程序,也可以用交互式的ipython界面來用Tensorflow嘗試些想法,它可以幫你將筆記、代碼、可視化等有條理地歸置好。當然這僅僅是個起點——我們希望能鼓勵你創造自己最喜歡的語言界面,比如Go,Java,Lua,Javascript,或者是R。

性能最優化

比如說你又一個32個CPU內核、4個GPU顯卡的工作站,想要將你工作站的計算潛能全發揮出來?由於Tensorflow 給予了線程、隊列、異步操作等以最佳的支持,Tensorflow 讓你可以將你手邊硬件的計算潛能全部發揮出來。你可以自由地將Tensorflow圖中的計算元素分配到不同設備上,Tensorflow可以幫你管理好這些不同副本。

二、CNN,RNN,LSTM之間的關係

卷積神經網絡(Convolutional Neural Network CNN):

     卷積神經網絡(CNN),是一種前饋神經網絡,解決了DNN(深度網絡),NN(神經網絡)中出現的過度擬合以及局部最有解問題。CNN是利用圖像的局部信息,將圖像中的固有局部模式(比如人身體的各個部位)來利用,CNN中的所以上下層神經元並不是直接相互連接,而是通過“卷積核”做爲中介。同一個卷積核中的圖是共享的,同時圖像通過卷積操作後任然保留原來的位置關係。

       CNN的基本結構包括兩層,其一爲特徵提取層,每個神經元的輸入與前一層的局部接受域相連,並提取該局部的特徵。一旦該局部特徵被提取後,它與其它特徵間的位置關係也隨之確定下來;其二是特徵映射層,網絡的每個計算層由多個特徵映射組成,每個特徵映射是一個平面,平面上所有神經元的權值相等。特徵映射結構採用影響函數核小的sigmoid函數作爲卷積網絡的激活函數,使得特徵映射具有位移不變性。此外,由於一個映射面上的神經元共享權值,因而減少了網絡自由參數的個數。卷積神經網絡中的每一個卷積層都緊跟着一個用來求局部平均與二次提取的計算層,這種特有的兩次特徵提取結構減小了特徵分辨率。

      CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形,該部分功能主要由池化層實現。由於CNN的特徵檢測層通過訓練數據進行學習,所以在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練數據中進行學習;再者由於同一特徵映射面上的神經元權值相同,所以網絡可以並行學習,這也是卷積網絡相對於神經元彼此相連網絡的一大優勢。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有着獨特的優越性,其佈局更接近於實際的生物神經網絡,權值共享降低了網絡的複雜性,特別是多維輸入向量的圖像可以直接輸入網絡這一特點避免了特徵提取和分類過程中數據重建的複雜度。

RNN循環神經網絡(Recurrent Neural Network RNN):

         循環神經網絡RNN神經網絡是一種節點定向連接成環的人工神經網絡。這種網絡的內部狀態可以展示動態時序行爲。不同於前饋神經網絡(CNN)的是,RNN可以利用它內部的記憶來處理任意時序的輸入序列,這讓它可以更容易處理如不分段的手寫識別、語音識別等。在RNN中神經元的輸出可以在下一個時間戳直接作用到自身,即第i層神經元在m時刻的輸入,除了(i-1)層神經元在該時刻的輸出外,還包括其自身在(m-1)時刻的輸出。如下圖:

循環神經網絡的這種結構非常適合處理前後有依賴關係的數據樣本。由於這種鏈式的結構,循環神經網絡與序列和列表緊密相連。因此,RNN適合處理基於時間的序列,例如:一段連續的語音,一段連續的手寫文字。以語言模型爲例,根據給定句子中的前t個字符,然後預測第t+1個字符。假設我們的句子是“你好世界”,使用前饋神經網絡來預測:在時間1輸入“你”,預測“好”,時間2向同一個網絡輸入“好”預測“世”。整個過程如下圖所示:

可以根據前n個字符預測第t+1個字符。在這裏,n=1。同時可以增大n來使得輸入含有更多信息。但是我們不能任意增大n,因爲這樣通常會增在模型的複雜度,從而導致需要大量數據和計算來訓練模型。

LSTM

   LSTM(Long Short-Term Memory)是長短期記憶網絡,是一種時間遞歸神經網絡,適合於處理和預測時間序列中間隔和延遲相對較長的重要事件它是一種特殊的RNN類型,可以學習長期依賴信息。解決了RNN中出現的序列過長導致優化時出現的圖消散問題。將RNN看成在一個時間上傳遞的神經網絡,在隱藏層節點之間加入了互聯。

   LSTM在算法中加入了一個判斷信息有用與否的“處理器”,這個處理器作用的結構被稱爲cell。

   一個cell當中被放置了三扇門,分別叫做輸入門、遺忘門和輸出門。一個信息進入LSTM的網絡當中,可以根據規則來判斷是否有用。只有符合算法認證的信息纔會留下,不符的信息則通過遺忘門被遺忘。

在標準RNN中,重複模塊具有簡單的結構,例如單tanh層,如下圖所示:

h(t)一方面用於當前層的模型損失計算,一方面用於下一層h(t+1)計算。

LSTM的結構比RNN的複雜得多,如下圖所示:

LSTM的關鍵是細胞狀態,即貫穿圖表頂部的水平線:

LSTM爲細胞狀態移除或者增加信息,這種精心設計的結構叫做門。LSTM有三種門結構。

1、遺忘門


顧名思義,遺忘門決定丟掉細胞狀態的哪些信息。根據h(t-1)和x(t),遺忘門爲狀態C(t-1)輸出一個介於0到1之間的數字,0表示“完全丟棄”,1表示”完全接受“。數學表達式爲:

2、輸入門


輸入門由兩個部分構成:第一部分爲sigmoid激活函數,輸出爲i(t),決定更新哪些值;第二部分爲tanh激活函數,輸出爲~C(t)。i(t)與~C(t)相乘後的結果用於更新細胞狀態,數學表達式爲:

3、輸出門
經過遺忘門和輸入門,細胞狀態更新爲:

最後,我們應該決定輸出是什麼。輸出基於上述細胞狀態,但是需要過濾。輸出門如下圖所示:

首先,使用sigmoid層決定輸出細胞狀態的哪些部分。然後,我們令細胞狀態通過tanh層,輸出結果與sigmoid層的輸出結果相乘。數學公式爲:

LSTM的前向傳播算法
(1)更新遺忘門輸出:

       
(2)更新輸入門輸出:

     
(3)更新細胞狀態:

    
(4)更新輸出門輸出: 

   

參考:http://www.tensorfly.cn/

https://blog.csdn.net/qq_33415086/article/details/79966463

大家可以關注我和我小夥伴的公衆號~~~這裏有我和我的小夥伴不定時的更新一些python技術資料哦!!大家也可以留言,討論一下技術問題,希望大家多多支持,關注一下啦,謝謝大家啦~~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章