Python與人工神經(jīng)網(wǎng)絡(luò):使用神經(jīng)網(wǎng)絡(luò)識(shí)別手寫圖像介紹
人體的視覺系統(tǒng)是一個(gè)相當(dāng)神奇的存在,對于下面的一串手寫圖像,可以毫不費(fèi)力的識(shí)別出他們是504192,輕松到讓人都忘記了其實(shí)這是一個(gè)復(fù)雜的工作。
實(shí)際上在我們的大腦的左腦和右腦的皮層都有一個(gè)第一視覺區(qū)域,叫做V1,里面有14億視覺神經(jīng)元。而且,在我們識(shí)別上面的圖像的時(shí)候,工作的不止有V1,還有V2、V3、V4、V5,所以這么一看,我們確實(shí)威武。
但是讓計(jì)算機(jī)進(jìn)行模式識(shí)別,就比較復(fù)雜了,主要困難在于我們?nèi)绾谓o計(jì)算機(jī)描述一個(gè)數(shù)字9在圖像上應(yīng)該是怎樣的,比如我們跟計(jì)算機(jī)說,9的上面是一個(gè)圈,下右邊是1豎。然而有的人寫9會(huì)帶勾,有的人還會(huì)在圈周圍多出點(diǎn)什么,總的來說,這種描述法太容易出現(xiàn)其他狀況。況且,我們這里討論的還只是數(shù)字,涉及到字母、漢字、符號(hào)就回更復(fù)雜。
于是人們就有了另外一種途徑,那就是我們不用告訴計(jì)算機(jī)什么是9,我們可以把他當(dāng)作一個(gè)小孩子,讓他見很多9的圖片,對他說,這是9,記得哈。慢慢的他就形成了自己的評判標(biāo)準(zhǔn),等他長大了,自然就知道以后遇到的圖片是不是9了。讓我們?nèi)藢W(xué)習(xí)的方式是見聞,讓計(jì)算機(jī)學(xué)習(xí)的就是給他數(shù)據(jù),這個(gè)數(shù)據(jù)通常被叫做訓(xùn)練樣本(如圖),而這套學(xué)習(xí)的方法,就是神經(jīng)網(wǎng)絡(luò)了。
感知機(jī)(Perceptrons)
在說人工神經(jīng)網(wǎng)絡(luò)之前,我們先說另外一個(gè)人工神經(jīng)元系統(tǒng),叫感知機(jī)(Perceptrons)。感知機(jī)模型是這樣的:
其中x1,x2,x3是二進(jìn)制的輸入值,output是二進(jìn)制的輸出值。在每個(gè)輸入端,還會(huì)有一個(gè)權(quán)重,w1,w2,w3。output取決于x1*w1+x2*w2+x3*w3,如果他小于等于一個(gè)臨界值的時(shí)候,output就輸出0,大于等于那個(gè)臨界值的時(shí)候,output就輸出1。當(dāng)然輸入值可以是任意多個(gè),用公式表示就是:
output={01if ∑jwjxj≤ thresholdif ∑jwjxj> threshold
感知機(jī)模型就這么簡單,他是一個(gè)相當(dāng)好的決策系統(tǒng),用來解決是或者不是,去或者不去,熟悉我的朋友可能知道我從古代儒家修身的功過格受啟發(fā),自己制定的一套決策系統(tǒng),也是用因素*權(quán)重然后匯總,看得到的正面因素占優(yōu)還是負(fù)面的因素占優(yōu),最后做決策,真是相當(dāng)好用,只不過那時(shí)候還不知道感知機(jī)模型。
我們把Σwjxj用w·x表示,把臨界值提到等號(hào)右邊,用-b表示,那么上面的等式就如下所示:
b一般稱作偏差。
既然有一層的感知機(jī)模型,多層的就很好理解了,如圖:
這個(gè)多層(從左到右)的感知機(jī)里面,第一層的感知機(jī)比較簡單,只根據(jù)輸入的值和權(quán)重就可以得出結(jié)果,第二層的結(jié)果就得根據(jù)第一層的結(jié)果和相應(yīng)的的權(quán)重了,與復(fù)雜度相對應(yīng),他也就可以用來做更加復(fù)雜和抽象的決定,第三層就更復(fù)雜了。
這種上世紀(jì)五十年代就出來的神經(jīng)元系統(tǒng)功能強(qiáng)大,但是對于機(jī)器學(xué)習(xí)有一個(gè)重大的缺陷。我們教小孩子的時(shí)候,小孩子進(jìn)步一點(diǎn)點(diǎn),我們就鼓勵(lì)他一下,小孩子退步一點(diǎn)點(diǎn),我們就批評一下,他從我們的批評和鼓勵(lì)中自動(dòng)的去調(diào)整自己的認(rèn)知,慢慢的成長。但是這個(gè)感知機(jī)就不同了,他的輸入值只有0和1,他的成長沒有一點(diǎn)點(diǎn)的說法,所以壓根就不知道怎么調(diào)整,可能內(nèi)部參數(shù)調(diào)整的亂七八糟,輸出的結(jié)果還是不變的。要實(shí)現(xiàn)學(xué)習(xí)和進(jìn)步,就得有這么一點(diǎn)點(diǎn)一點(diǎn)點(diǎn)進(jìn)步的概念,也就是說,w或者b變了一點(diǎn)點(diǎn),那么輸出值就得變一點(diǎn)點(diǎn),總的來說,就是要實(shí)現(xiàn)下圖所示的效果:
于是新一代的神經(jīng)元系統(tǒng)就出世了,他叫S曲線神經(jīng)元系統(tǒng)(Sigmoid neurons)。
S曲線神經(jīng)元系統(tǒng)(Sigmoid neurons)
簡單來說,S曲線神經(jīng)元系統(tǒng)和感知機(jī)系統(tǒng)的區(qū)別在于我們的輸入值x1,x2,x3和輸出值output都不是0和1了,改為從0到1之間的任何實(shí)數(shù)。而且規(guī)定,對我輸出值output,由于是與w·x和b相關(guān)的,我們可以用σ(w·x,b)表示,他滿足函數(shù):
把w·x和b帶進(jìn)去,就是:
試著看下,如果當(dāng)w·x + b→+∞的時(shí)候,e^-(w·x+b)→0,σ(w·x,b)→1。相反,當(dāng)w·x + b→-∞的時(shí)候,σ(w·x,b)→0,所以,感知機(jī)系統(tǒng)也是一個(gè)特殊的S曲線神經(jīng)元系統(tǒng)。
至于為什么σ(w·x,b)必須滿足上述的函數(shù)呢。請看σ(z)的圖形:
他的定義域是(-∞,+∞),值域是(0,1),也就是說,不管w·x和b怎么折騰,總能保證輸出值在0到1之間。特別的,當(dāng)我們對一個(gè)事情做決定時(shí),比如我們讓計(jì)算機(jī)決定看到的一個(gè)圖形是不是9,0到1之間的一個(gè)數(shù),可以在物理意義上對應(yīng)他是9的概率。(我后來才意識(shí)道,這個(gè)說法是錯(cuò)誤的)
我們說,我們拋棄感知器,采用S曲線神經(jīng)元系統(tǒng),是為了讓輸出結(jié)果的變動(dòng)和我們采取權(quán)重w和偏離b的變動(dòng)對應(yīng)起來。那么對于方程output = σ(w·x,b),由于輸入值x是已知的常數(shù),根據(jù)全微分的定義,有:
輸出值的變動(dòng)和我們選用的參數(shù)變動(dòng)就對應(yīng)起來了。
構(gòu)造我們的神經(jīng)網(wǎng)絡(luò)
在我們構(gòu)建神經(jīng)網(wǎng)絡(luò)的過程中,一般也會(huì)把輸入的數(shù)據(jù)當(dāng)作神經(jīng)元,輸入的那層叫做輸入層,中間可能有多層,通常被叫做隱藏層,輸出的那一層就叫做輸出層。如圖:
在設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)時(shí),一般會(huì)采取簡單粗暴的方式,比如我們要讓計(jì)算機(jī)識(shí)別手寫稿的掃描件圖像,其中的一個(gè)字的圖像像素個(gè)數(shù)是64*64=4096個(gè),那么我們設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)的時(shí)候,輸入層神經(jīng)元個(gè)數(shù)就是4096個(gè),其中每個(gè)神經(jīng)元的輸入數(shù)據(jù)就是該像素的灰度值(參照文章的第一幅圖)歸一化成0到1之間的數(shù)值。而我們要識(shí)別出的結(jié)果,可能包括數(shù)字0-9加26個(gè)大大小寫字母再加六千常用漢字,那我們設(shè)計(jì)的輸出層神經(jīng)元個(gè)數(shù)就用過是10+26*2+6000=6062個(gè),其中每個(gè)神經(jīng)元對應(yīng)一個(gè)我們要識(shí)別的結(jié)果。
具體到本實(shí)例中,訓(xùn)練樣本和識(shí)別測試數(shù)據(jù)是28*28像素的,輸出結(jié)果只有10個(gè)數(shù)字,那么輸入層就應(yīng)該是786個(gè)神經(jīng)元,輸出層是10個(gè)神經(jīng)元。至于中間隱藏層的神經(jīng)元,作者選了15個(gè),說是經(jīng)過了多次實(shí)驗(yàn),15個(gè)的效果比較好。就我的理解,應(yīng)該是越多約好的(不一定正確),不過越多也意味著運(yùn)算量越大,所以作者最后選了15個(gè)。最終設(shè)計(jì)的結(jié)果如圖:
最后還有一個(gè)問題,如果是連續(xù)的書寫手稿,怎么把他分割成一個(gè)個(gè)的。作者說實(shí)際上這個(gè)問題可以在我們完成通過神經(jīng)網(wǎng)絡(luò)進(jìn)行識(shí)別之后再說,因?yàn)樽R(shí)別出來誰都不像的,就說明應(yīng)該要分割了,那我們也就跟著作者的思路,暫時(shí)先不管。
總結(jié)
以上就是本文關(guān)于Python與人工神經(jīng)網(wǎng)絡(luò):使用神經(jīng)網(wǎng)絡(luò)識(shí)別手寫圖像介紹的全部內(nèi)容嗎,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)詳解
神經(jīng)網(wǎng)絡(luò)python源碼分享
70行Java代碼實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)算法分享
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
- 神經(jīng)網(wǎng)絡(luò)(BP)算法Python實(shí)現(xiàn)及應(yīng)用
- Python實(shí)現(xiàn)的三層BP神經(jīng)網(wǎng)絡(luò)算法示例
- Python編程實(shí)現(xiàn)的簡單神經(jīng)網(wǎng)絡(luò)算法示例
- python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)回歸預(yù)測模型
- TensorFlow平臺(tái)下Python實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)
- Python實(shí)現(xiàn)的NN神經(jīng)網(wǎng)絡(luò)算法完整示例
- python使用RNN實(shí)現(xiàn)文本分類
- python編寫樸素貝葉斯用于文本分類
- Python使用循環(huán)神經(jīng)網(wǎng)絡(luò)解決文本分類問題的方法詳解
相關(guān)文章
PyTorch中的squeeze()和unsqueeze()解析與應(yīng)用案例
這篇文章主要介紹了PyTorch中的squeeze()和unsqueeze()解析與應(yīng)用案例,文章內(nèi)容介紹詳細(xì),需要的小伙伴可以參考一下,希望對你有所幫助2022-03-03Python中Parsel的兩種數(shù)據(jù)提取方式詳解
在網(wǎng)絡(luò)爬蟲的世界中,數(shù)據(jù)提取是至關(guān)重要的一環(huán),Python 提供了許多強(qiáng)大的工具,其中之一就是 parsel 庫,下面我們就來深入學(xué)習(xí)一下Parsel的兩種數(shù)據(jù)提取方式吧2023-12-12Pyqt5實(shí)戰(zhàn)小案例之界面與邏輯分離的小計(jì)算器程序
網(wǎng)上很多PyQt5信號(hào)槽與界面分離的例子,但是真正開發(fā)起來很不方便,下面這篇文章主要給大家介紹了關(guān)于Pyqt5實(shí)戰(zhàn)小案例之界面與邏輯分離的小計(jì)算器程序,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02利用python將xml文件解析成html文件的實(shí)現(xiàn)方法
下面小編就為大家分享一篇利用python將xml文件解析成html文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12