Ⅰ 利用pytorch CNN手寫字母識別神經網路模型識別多手寫字母(A-Z)
往期的文章,我們分享了手寫字母的訓練與識別
使用EMNIST數據集訓練第一個pytorch CNN手寫字母識別神經網路
利用pytorch CNN手寫字母識別神經網路模型識別手寫字母
哪裡的文章,我們只是分享了單個字母的識別,如何進行多個字母的識別,其思路與多數字識別類似,首先對圖片進行識別,並進行每個字母悶梁歷的輪廓識別,然後進行字母的識別,識別完成後,直接在圖片上進行多個字母識別結果的備注
Pytorch利用CNN卷積神經網路進行多數字(0-9)識別
根據上期文章的分享,我們搭建一個手寫字母識別的神經網路
第一層,我們輸入Eminist的數據集,Eminist的數據圖片是一維 28*28的圖片,所以第一層的輸入(1,28,28),高度為1,設置輸出16通道,使用5*5的卷積核對圖片進行卷積運算,每步移動一格,為了避免圖片尺寸變化,設置pading為2,則經過第一層卷積就輸出(16,28,28)數據格式
再經過relu與maxpooling (使用2*2卷積核)數據輸出(16,14,14)
第二層卷積層是簡化寫法nn.Conv2d(16, 32, 5, 1, 2)的第一個參數為輸入通道數in_channels=16,其第二個參數是輸出通道數out_channels=32, # n_filters(輸出通道數),第三個參數為卷積核大小,第四個參數為卷積步數,最後一個為pading,此參數為保證輸入輸出圖片的尺寸大小一致
全連接層,最後使用nn.linear()全連接層進行數據的全連接數據結構(32*7*7,37)以上便是整個卷積神經網路的結構,
大致為:input-卷積-Relu-pooling-卷積
-Relu-pooling-linear-output
卷積神經網路建完後,使用forward()前向傳播神經網路進行輸入圖片的識別
這里我們使用腐蝕,膨脹操作對圖片進行一下預處理操作,方便神經網路的識別,當然,我們往期的字母數字渣稿識別也可以添加此預處理操作,方便神經網路進行預測,提高精度
getContours函數主要是進行圖片中數字區域的區分,把每個數字的坐標檢測出來,這樣就可以 把每個字母進行CNN卷積神經網路的識別,進而實現多個字母識別的目的
首先,螞搜輸入一張需要檢測的圖片,通過preProccessing圖片預處理與getContours函數獲取圖片中的每個字母的輪廓位置
transforms.Compose此函數可以 把輸入圖片進行pytorch相關的圖片操作,包括轉換到torch,灰度空間轉換,resize,縮放等等操作
然後載入我們前期訓練好的模型
由於神經網路識別完成後,反饋給程序的是字母的 UTF-8編碼,我們通過查表來找到對應的字母
字元編碼表(UTF-8)
通過上面的操作,我們已經識別出了圖片中包括的字母輪廓,我們遍歷每個字母輪廓,獲取單個字母圖片數據,這里需要特殊提醒一下 :我們知道EMNIST資料庫左右翻轉圖片後,又進行了圖片的逆時針旋轉90度
這里我們使用cv2.flip(imgRes,1)函數,進行圖片的鏡像,並使用getRotationMatrix2D函數與warpAffine函數配合來進行圖片的旋轉操作,這里就沒有PIL來的方便些
然後,我們對圖片數據進行torch轉換train_transform(imgRes),並傳遞給神經網路進行識別
待識別完成後,就可以把結果備注在原始圖片上
Ⅱ 一文看懂四種基本的神經網路架構
原文鏈接:
http://blackblog.tech/2018/02/23/Eight-Neural-Network/
更多干貨就在我的個人博客 http://blackblog.tech 歡迎關注
剛剛入門神經網路,往往會對眾多的神經網路架構感到困惑,神經網路看起來復雜多樣,但是這么多架構無非也就是三類,前饋神經網路,循環網路,對稱連接網路,本文將介紹四種常見的神經網路,分別是CNN,RNN,DBN,GAN。通過這四種基本的神經網路架構,我們來對神經網路進行一定的了解。
神經網路是機器學習中的一種模型,是一種模仿動物神經網路行為特徵,進行分布式並行信息處理的演算法數學模型。這種網路依靠系統的復雜程度,通過調整內部大量節點之間相互連接的關系,從而達到處理信息的目的。
一般來說,神經網路的架構可以分為三類:
前饋神經網路:
這是實際應用中最常見的神經網路類型。第一層是輸入,最後一層是輸出。如果有多個隱藏層,我們稱之為「深度」神經網路。他們計算出一系列改變樣本相似性的變換。各層神經元的活動是前一層活動的非線性函數。
循環網路:
循環網路在他們的連接圖中定向了循環,這意味著你可以按照箭頭回到你開始的地方。他們可以有復雜的動態,使其很難訓練。他們更具有生物真實性。
循環網路的目的使用來處理序列數據。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。
循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。
對稱連接網路:
對稱連接網路有點像循環網路,但是單元之間的連接是對稱的(它們在兩個方向上權重相同)。比起循環網路,對稱連接網路更容易分析。這個網路中有更多的限制,因為它們遵守能量函數定律。沒有隱藏單元的對稱連接網路被稱為「Hopfield 網路」。有隱藏單元的對稱連接的網路被稱為玻爾茲曼機。
其實之前的帖子講過一些關於感知機的內容,這里再復述一下。
首先還是這張圖
這是一個M-P神經元
一個神經元有n個輸入,每一個輸入對應一個權值w,神經元內會對輸入與權重做乘法後求和,求和的結果與偏置做差,最終將結果放入激活函數中,由激活函數給出最後的輸出,輸出往往是二進制的,0 狀態代表抑制,1 狀態代表激活。
可以把感知機看作是 n 維實例空間中的超平面決策面,對於超平面一側的樣本,感知器輸出 1,對於另一側的實例輸出 0,這個決策超平面方程是 w⋅x=0。 那些可以被某一個超平面分割的正反樣例集合稱為線性可分(linearly separable)樣例集合,它們就可以使用圖中的感知機表示。
與、或、非問題都是線性可分的問題,使用一個有兩輸入的感知機能容易地表示,而異或並不是一個線性可分的問題,所以使用單層感知機是不行的,這時候就要使用多層感知機來解決疑惑問題了。
如果我們要訓練一個感知機,應該怎麼辦呢?
我們會從隨機的權值開始,反復地應用這個感知機到每個訓練樣例,只要它誤分類樣例就修改感知機的權值。重復這個過程,直到感知機正確分類所有的樣例。每一步根據感知機訓練法則來修改權值,也就是修改與輸入 xi 對應的權 wi,法則如下:
這里 t 是當前訓練樣例的目標輸出,o 是感知機的輸出,η 是一個正的常數稱為學習速率。學習速率的作用是緩和每一步調整權的程度,它通常被設為一個小的數值(例如 0.1),而且有時會使其隨著權調整次數的增加而衰減。
多層感知機,或者說是多層神經網路無非就是在輸入層與輸出層之間加了多個隱藏層而已,後續的CNN,DBN等神經網路只不過是將重新設計了每一層的類型。感知機可以說是神經網路的基礎,後續更為復雜的神經網路都離不開最簡單的感知機的模型,
談到機器學習,我們往往還會跟上一個詞語,叫做模式識別,但是真實環境中的模式識別往往會出現各種問題。比如:
圖像分割:真實場景中總是摻雜著其它物體。很難判斷哪些部分屬於同一個對象。對象的某些部分可以隱藏在其他對象的後面。
物體光照:像素的強度被光照強烈影響。
圖像變形:物體可以以各種非仿射方式變形。例如,手寫也可以有一個大的圓圈或只是一個尖頭。
情景支持:物體所屬類別通常由它們的使用方式來定義。例如,椅子是為了讓人們坐在上面而設計的,因此它們具有各種各樣的物理形狀。
卷積神經網路與普通神經網路的區別在於,卷積神經網路包含了一個由卷積層和子采樣層構成的特徵抽取器。在卷積神經網路的卷積層中,一個神經元只與部分鄰層神經元連接。在CNN的一個卷積層中,通常包含若干個特徵平面(featureMap),每個特徵平面由一些矩形排列的的神經元組成,同一特徵平面的神經元共享權值,這里共享的權值就是卷積核。卷積核一般以隨機小數矩陣的形式初始化,在網路的訓練過程中卷積核將學習得到合理的權值。共享權值(卷積核)帶來的直接好處是減少網路各層之間的連接,同時又降低了過擬合的風險。子采樣也叫做池化(pooling),通常有均值子采樣(mean pooling)和最大值子采樣(max pooling)兩種形式。子采樣可以看作一種特殊的卷積過程。卷積和子采樣大大簡化了模型復雜度,減少了模型的參數。
卷積神經網路由三部分構成。第一部分是輸入層。第二部分由n個卷積層和池化層的組合組成。第三部分由一個全連結的多層感知機分類器構成。
這里舉AlexNet為例:
·輸入:224×224大小的圖片,3通道
·第一層卷積:11×11大小的卷積核96個,每個GPU上48個。
·第一層max-pooling:2×2的核。
·第二層卷積:5×5卷積核256個,每個GPU上128個。
·第二層max-pooling:2×2的核。
·第三層卷積:與上一層是全連接,3*3的卷積核384個。分到兩個GPU上個192個。
·第四層卷積:3×3的卷積核384個,兩個GPU各192個。該層與上一層連接沒有經過pooling層。
·第五層卷積:3×3的卷積核256個,兩個GPU上個128個。
·第五層max-pooling:2×2的核。
·第一層全連接:4096維,將第五層max-pooling的輸出連接成為一個一維向量,作為該層的輸入。
·第二層全連接:4096維
·Softmax層:輸出為1000,輸出的每一維都是圖片屬於該類別的概率。
卷積神經網路在模式識別領域有著重要應用,當然這里只是對卷積神經網路做了最簡單的講解,卷積神經網路中仍然有很多知識,比如局部感受野,權值共享,多卷積核等內容,後續有機會再進行講解。
傳統的神經網路對於很多問題難以處理,比如你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNN之所以稱為循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNN能夠對任何長度的序列數據進行處理。
這是一個簡單的RNN的結構,可以看到隱藏層自己是可以跟自己進行連接的。
那麼RNN為什麼隱藏層能夠看到上一刻的隱藏層的輸出呢,其實我們把這個網路展開來開就很清晰了。
從上面的公式我們可以看出,循環層和全連接層的區別就是循環層多了一個權重矩陣 W。
如果反復把式2帶入到式1,我們將得到:
在講DBN之前,我們需要對DBN的基本組成單位有一定的了解,那就是RBM,受限玻爾茲曼機。
首先什麼是玻爾茲曼機?
[圖片上傳失敗...(image-d36b31-1519636788074)]
如圖所示為一個玻爾茲曼機,其藍色節點為隱層,白色節點為輸入層。
玻爾茲曼機和遞歸神經網路相比,區別體現在以下幾點:
1、遞歸神經網路本質是學習一個函數,因此有輸入和輸出層的概念,而玻爾茲曼機的用處在於學習一組數據的「內在表示」,因此其沒有輸出層的概念。
2、遞歸神經網路各節點鏈接為有向環,而玻爾茲曼機各節點連接成無向完全圖。
而受限玻爾茲曼機是什麼呢?
最簡單的來說就是加入了限制,這個限制就是將完全圖變成了二分圖。即由一個顯層和一個隱層構成,顯層與隱層的神經元之間為雙向全連接。
h表示隱藏層,v表示顯層
在RBM中,任意兩個相連的神經元之間有一個權值w表示其連接強度,每個神經元自身有一個偏置系數b(對顯層神經元)和c(對隱層神經元)來表示其自身權重。
具體的公式推導在這里就不展示了
DBN是一個概率生成模型,與傳統的判別模型的神經網路相對,生成模型是建立一個觀察數據和標簽之間的聯合分布,對P(Observation|Label)和 P(Label|Observation)都做了評估,而判別模型僅僅而已評估了後者,也就是P(Label|Observation)。
DBN由多個限制玻爾茲曼機(Restricted Boltzmann Machines)層組成,一個典型的神經網路類型如圖所示。這些網路被「限制」為一個可視層和一個隱層,層間存在連接,但層內的單元間不存在連接。隱層單元被訓練去捕捉在可視層表現出來的高階數據的相關性。
生成對抗網路其實在之前的帖子中做過講解,這里在說明一下。
生成對抗網路的目標在於生成,我們傳統的網路結構往往都是判別模型,即判斷一個樣本的真實性。而生成模型能夠根據所提供的樣本生成類似的新樣本,注意這些樣本是由計算機學習而來的。
GAN一般由兩個網路組成,生成模型網路,判別模型網路。
生成模型 G 捕捉樣本數據的分布,用服從某一分布(均勻分布,高斯分布等)的雜訊 z 生成一個類似真實訓練數據的樣本,追求效果是越像真實樣本越好;判別模型 D 是一個二分類器,估計一個樣本來自於訓練數據(而非生成數據)的概率,如果樣本來自於真實的訓練數據,D 輸出大概率,否則,D 輸出小概率。
舉個例子:生成網路 G 好比假幣製造團伙,專門製造假幣,判別網路 D 好比警察,專門檢測使用的貨幣是真幣還是假幣,G 的目標是想方設法生成和真幣一樣的貨幣,使得 D 判別不出來,D 的目標是想方設法檢測出來 G 生成的假幣。
傳統的判別網路:
生成對抗網路:
下面展示一個cDCGAN的例子(前面帖子中寫過的)
生成網路
判別網路
最終結果,使用MNIST作為初始樣本,通過學習後生成的數字,可以看到學習的效果還是不錯的。
本文非常簡單的介紹了四種神經網路的架構,CNN,RNN,DBN,GAN。當然也僅僅是簡單的介紹,並沒有深層次講解其內涵。這四種神經網路的架構十分常見,應用也十分廣泛。當然關於神經網路的知識,不可能幾篇帖子就講解完,這里知識講解一些基礎知識,幫助大家快速入(zhuang)門(bi)。後面的帖子將對深度自動編碼器,Hopfield 網路長短期記憶網路(LSTM)進行講解。
Ⅲ cnn鏈夊摢鍑犵
CNN鏈夊摢鍑犵
CNN鏄鎸囧嵎縐紲炵粡緗戠粶(Convolutional Neural Network)錛屾槸浜哄伐鏅鴻兘棰嗗煙涓涓涓閲嶈佺殑綆楁硶銆傚畠宸茬粡琚搴旂敤浜庡悇縐嶉嗗煙錛屼緥濡傝$畻鏈鴻嗚夈佽闊寵瘑鍒鍜岃嚜鐒惰璦澶勭悊絳夈傞偅涔堬紝CNN鏈夊摢鍑犵嶅憿錛熸湰鏂囧皢涓烘偍璇︾粏浠嬬粛銆
1. 甯歌勭殑鍗風Н紲炵粡緗戠粶
甯歌勭殑鍗風Н紲炵粡緗戠粶鏄鎸囩敱鑻ュ共涓鍗風Н灞傘佹睜鍖栧眰鍜屽叏榪炴帴灞傜粍鎴愮殑緗戠粶銆傚嵎縐灞備富瑕佹槸鐢ㄦ潵鎻愬彇鍥懼儚鐨勭壒寰侊紝奼犲寲灞傜敤鏉ラ檷浣庣壒寰佸浘鐨勫ぇ灝忥紝鑰屽叏榪炴帴灞傚垯鐢ㄦ潵瀵圭壒寰佽繘琛屽垎綾匯傚父瑙勭殑鍗風Н紲炵粡緗戠粶鍙浠ュ簲鐢ㄤ簬鍚勭嶉嗗煙錛屼緥濡傚浘鍍忓垎綾匯佺洰鏍囨嫻嬪拰鍥懼儚鍒嗗壊絳夈
2. 孌嬪樊緗戠粶
孌嬪樊緗戠粶(Resial Neural Network)鏄鐢卞井杞鐮旂┒闄㈢殑Kaiming He絳変漢鎻愬嚭鐨勩傚畠鐨勪富瑕佹濇兂鏄寮曞叆鈥滄畫宸鍧椻濓紝閫氳繃璁╃綉緇滅殑杈撳嚭涓庤緭鍏ヤ箣闂村緩絝嬬洿鎺ョ殑鏄犲皠鍏崇郴錛岃В鍐充簡鍦ㄤ竴浜涙繁灞傜綉緇滀腑鍑虹幇鐨勬搴︽秷澶遍棶棰樸傛畫宸緗戠粶鍙浠ユ瀬澶у湴鎻愬崌娣卞害紲炵粡緗戠粶鐨勫噯紜搴︼紝騫朵笖宸茬粡鍦ㄥ悇縐嶅簲鐢ㄤ腑琚騫挎硾浣跨敤銆
3. 鍗風Н紲炵粡緗戠粶鐨勫彲瑙i噴鎬ф柟娉
鍗風Н紲炵粡緗戠粶鐨勫彲瑙i噴鎬т竴鐩存槸鐮旂┒鐨勭儹鐐逛箣涓銆傚湪寰堝氬疄闄呭簲鐢ㄤ腑錛屼漢浠闇瑕佺煡閬撶綉緇滄槸濡備綍鍋氬嚭鍐崇瓥鐨勶紝浠ヤ究鏇村ソ鍦扮悊瑙e拰瑙i噴緇撴灉銆傜洰鍓嶄富瑕佹湁涓ょ嶅彲瑙i噴鎬ф柟娉曪細涓縐嶆槸鍩轟簬姊搴︾殑鏂規硶錛屼緥濡侴rad-CAM錛涘彟涓縐嶆槸鍩轟簬緗戠粶鍐呴儴鐗瑰緛鐨勬柟娉曪紝渚嬪侫ctivation Atlas銆傝繖浜涙柟娉曞凡緇忚騫挎硾搴旂敤浜庤$畻鏈鴻嗚夈佸尰瀛﹀浘鍍忓勭悊絳夐嗗煙銆
4. 鍗風Н紲炵粡緗戠粶鍦ㄧ洰鏍囨嫻嬩腑鐨勫簲鐢
鍗風Н紲炵粡緗戠粶鍦ㄧ洰鏍囨嫻嬩腑鐨勫簲鐢ㄦ槸鍏朵竴涓閲嶈佺殑鐮旂┒棰嗗煙銆傜洰鏍囨嫻嬫槸璁$畻鏈鴻嗚変腑鐨勪竴涓閲嶈侀棶棰橈紝鍏朵富瑕佷換鍔℃槸鍦ㄥ浘鍍忎腑瀹氫綅鍜岃瘑鍒鐗╀綋銆傜洰鍓嶏紝甯哥敤鐨勭洰鏍囨嫻嬫柟娉曚富瑕佹湁涓ょ嶏細鍩轟簬鍖哄煙鐨勬柟娉曞拰鍩轟簬妗嗘灦鐨勬柟娉曘傝繎騫存潵錛屾繁搴﹀︿範鎶鏈鐨勫彂灞曚嬌寰楀熀浜庢嗘灦鐨勬柟娉曞湪鐩鏍囨嫻嬩腑寰楀埌浜嗗箍娉涚殑搴旂敤錛屼緥濡傚熀浜庡嵎縐紲炵粡緗戠粶鐨勭洰鏍囨嫻嬫柟娉昚OLO鍜孎aster R-CNN絳夈
5. 鍗風Н紲炵粡緗戠粶鍦ㄨ嚜鐒惰璦澶勭悊涓鐨勫簲鐢
闄や簡鍦ㄨ$畻鏈鴻嗚夐嗗煙錛屽嵎縐紲炵粡緗戠粶榪樿騫挎硾搴旂敤浜庤嚜鐒惰璦澶勭悊銆傚嵎縐紲炵粡緗戠粶鍙浠ラ氳繃瀵規枃鏈榪涜屽嵎縐鎿嶄綔鏉ユ彁鍙栨枃鏈鐨勫矓閮ㄧ壒寰侊紝騫朵笖鍙浠ラ氳繃奼犲寲灞傛潵闄嶇淮銆傚嵎縐紲炵粡緗戠粶鍦ㄦ儏鎰熷垎綾匯佹枃鏈鍒嗙被鍜屾満鍣ㄧ炕璇戠瓑浠誨姟涓宸茬粡寰楀埌浜嗗箍娉涚殑搴旂敤銆
6. 鎬葷粨
緇間笂鎵榪幫紝鍗風Н紲炵粡緗戠粶鏄浜哄伐鏅鴻兘棰嗗煙涓涓涓閲嶈佺殑綆楁硶錛屽畠宸茬粡琚騫挎硾搴旂敤浜庡悇縐嶉嗗煙銆傞櫎浜嗗父瑙勭殑鍗風Н紲炵粡緗戠粶涔嬪栵紝榪樻湁孌嬪樊緗戠粶銆佸嵎縐紲炵粡緗戠粶鐨勫彲瑙i噴鎬ф柟娉曠瓑銆傚湪璁$畻鏈鴻嗚夐嗗煙錛屽嵎縐紲炵粡緗戠粶琚騫挎硾搴旂敤浜庣洰鏍囨嫻嬶紱鑰屽湪鑷鐒惰璦澶勭悊涓錛屽嵎縐紲炵粡緗戠粶鐨勫簲鐢ㄤ篃瓚婃潵瓚婂彈鍒板叧娉ㄣ