小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

你看到的最直白清晰的CNN講解

 南風(fēng)清雨 2018-01-16

這篇博客介紹的是深度神經(jīng)網(wǎng)絡(luò)中常用在圖像處理的模型——卷積神經(jīng)網(wǎng)絡(luò)(CNN),CNN在圖像分類中(如kaggle的貓狗大戰(zhàn))大顯身手。這篇博客將帶你了解圖像在計算機(jī)中是如何存儲的,什么是卷積,卷積神經(jīng)網(wǎng)絡(luò)的四個重要環(huán)節(jié)(局部感知、參數(shù)共享、多卷積核、池化),不會涉及復(fù)雜的公式。

計算機(jī)是怎么存儲圖片的

為了更好的理解計算機(jī)對圖片的存儲,我找了一個非常簡單的圖片,是一個385*385(像素)的jpg格式的圖片,如圖1所示,這個圖片就是一個白色為底色,數(shù)字為黑色的數(shù)字“2”,也就是說,圖片中只涉及兩種顏色——黑與白(實(shí)際上并不是,因?yàn)閳D片在顯示器中顯示是一個像素一個像素的,黑白相間的地方其實(shí)并不是純黑或者純白的,將圖片經(jīng)過稍后描述的處理后也可以看出來,不過簡單起見,我們就當(dāng)它是黑白兩色的)。

你看到的最直白清晰的CNN講解

圖1

可以使用scipy包中的imread函數(shù)將圖片轉(zhuǎn)換為數(shù)值型矩陣

from scipy.misc import imreadimport pandas as pdimg = imread('2.jpg')print(img.shape)img_df=pd.DataFrame(img)img_df.to_csv('2.csv')

上面的代碼不用太過研究,能實(shí)現(xiàn)這個過程的方法很多。其實(shí)圖片在計算機(jī)中就是數(shù)字,385*385=148225,圖片中有148225個數(shù)字,每個數(shù)字其實(shí)就是該像素的顏色對應(yīng)的數(shù)值(如白色是255),那么我們來看一下圖片轉(zhuǎn)換成為的矩陣是什么樣子,如圖2所示(我把csv按比例縮放了一下,看的比較清楚)。

你看到的最直白清晰的CNN講解

圖2

是不是驚艷到了!?。≡瓉磉@個2在計算機(jī)中是這么存儲的,好,我把局部放大一下,如圖3所示,圖3這個區(qū)域放大了,所以你可能看不太出來這是個啥,其實(shí)就是圖4中紅色圓圈的部分。

你看到的最直白清晰的CNN講解

圖3

你看到的最直白清晰的CNN講解

圖4

現(xiàn)在你可能明白了,其實(shí)每個圖片都由若干像素點(diǎn)構(gòu)成,每個像素點(diǎn)存儲了該位置的顏色,其實(shí)還隱藏存儲了另一個信息,就是位置。每一個像素點(diǎn)都有一對索引元組,例如(1,1)就是第一行第一列的像素點(diǎn),如果寫作(1,1,255),就是說第一行第一列的像素點(diǎn)是黑色,以此類推,也就是這樣一個矩陣就完整的記錄著圖片的所有信息。

好,到了這里,聰明的你應(yīng)該已經(jīng)知道圖片在計算機(jī)中的存儲方式了。那么正式開始講解CNN。

卷及神經(jīng)網(wǎng)絡(luò)

卷積

在開篇的部分,先簡單給大家介紹一下什么叫做卷積,學(xué)過概率論的同學(xué)一定不陌生,那么白話解釋一下啥叫卷積,很形象,就是“卷”,你假象一下,你把擦臉毛巾卷起來,成為一個圓柱體的卷,就是這個意思,抽象的說,就是將原來的對象變小一些,但又能保證原來圖像中的信息盡量多的保留下來,可以看看下面這個卷積過程圖。后面會有針對CNN卷積過程的詳細(xì)解釋,看看這個圖,大概理解卷積是一個什么樣子的過程就可以了,用映射兩個字我認(rèn)為是比較恰當(dāng)?shù)摹?/p>

你看到的最直白清晰的CNN講解

卷積過程圖

圖像到神經(jīng)網(wǎng)絡(luò)

這里的全部講解基于大家了解了最簡單的感知機(jī),單層神經(jīng)網(wǎng)絡(luò),多隱藏層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和參數(shù)估計方法(反向傳播算法,具體可參見我博客中轉(zhuǎn)載的文章《一文弄懂神經(jīng)網(wǎng)絡(luò)中的反向傳播法——BackPropagation》)

為了更簡單的理解CNN,我們先關(guān)注多隱藏層的輸入層和第一個隱藏層(其實(shí)后面層數(shù)有多少都無所謂,一模一樣的模式,大家假裝CNN就是個單隱藏層的神經(jīng)網(wǎng)絡(luò)就好,不然多隱藏層畫起來也麻煩,講起來也麻煩)。網(wǎng)絡(luò)結(jié)構(gòu)如圖6所示。

你看到的最直白清晰的CNN講解

圖5

這里,選取了兩張比較直觀和經(jīng)典的圖來展示個大家,如圖6所示。

你看到的最直白清晰的CNN講解

圖6

現(xiàn)實(shí)中的圖片可沒有我例子這么簡單,將它存成矩陣恐怕各位也看不出來他是個什么鬼,除非你能把每個位置的數(shù)字在腦海中腦部成顏色,然后將數(shù)萬甚至數(shù)百萬的像素粒按照矩陣在腦海中拼湊在一起。

好,我們關(guān)注圖6的左圖。假設(shè)我們輸入的圖片是1000*1000維的圖像,在圖像處理中,通常不使用這樣的二維形式存儲,而是將后一行拼接到前一行的最后,構(gòu)成一個向量,對于這個1000*1000的圖像,就構(gòu)成了一個1×1000000,即長度一百萬的一個數(shù)組,換句話說,神經(jīng)網(wǎng)絡(luò)的輸入層(圖5最左側(cè))有1000000個元素,假設(shè)(第一個)隱藏層,即圖5中間的層的神經(jīng)元個數(shù)與輸入層相同,也是1000000,且輸入層與第一隱藏層是全連接的,如圖6中左圖所示,那么我們就需要訓(xùn)練一個1000000?1000000=1012 個參數(shù),及圖5的輸入層和隱藏層之間有1萬億個連接線,這樣去進(jìn)行訓(xùn)練,哪怕對計算機(jī)而言,都無疑是個災(zāi)難。

第一法寶:局部感知

現(xiàn)在我們優(yōu)化一下,假設(shè)圖5的隱藏層中的每個神經(jīng)元只與輸入層的10*10個輸入(即10*10個像素點(diǎn))相連,(也就意味著每個隱藏層神經(jīng)元不是和圖片的全部像素都連接,而只是和圖片的某一個區(qū)域的全部像素連接),那么兩層之間連接線的個數(shù),即參數(shù)的個數(shù)就變成了1000000?(10?10)=108 個,比起原來的1012個參數(shù),已經(jīng)縮小了10000倍,但參數(shù)還是太多了,需要進(jìn)一步的優(yōu)化。

第二法寶:參數(shù)共享(以及卷積過程講解)

既然參數(shù)太多了,每個神經(jīng)元對應(yīng)了100個參數(shù),每個神經(jīng)元對應(yīng)的100個參數(shù)我們姑且叫它Pi 參數(shù)組,我們就會有P1,P2,……,P100000 這些參數(shù)組,假設(shè)P1=P2=……=P100000,也就是說每個神經(jīng)元對應(yīng)的參數(shù)組是相同的,那么我們其實(shí)就只有一個含有100個未知參數(shù)的參數(shù)組,瞬間,參數(shù)數(shù)量就成為了100,是一個可以輕易進(jìn)行訓(xùn)練的數(shù)量級。

你可能要問,這樣的假設(shè)合理么,答案是:從理論和思想上來說,是合理的,從實(shí)踐結(jié)果的證明來看,是非常好的。這個假設(shè)意味著什么呢?這100個參數(shù)(就是卷積操作)是一種特征提取,該方式與位置無關(guān)。這其中隱含的原理則是:圖像的一部分的統(tǒng)計特性與其他部分是一樣的。這也意味著我們在這一部分學(xué)習(xí)的特征也能用在另一部分上,所以對于這個圖像上的所有位置,我們都能使用同樣的學(xué)習(xí)特征。再說白一點(diǎn)兒,一張圖片,左半邊和右半邊的特點(diǎn),風(fēng)格一般情況下是一樣的,哪怕畢加索這種抽象派大師,喜歡畫左右臉不一樣的抽象人物,其左右臉的風(fēng)格也是相同的,找一個畢加索的畫作,讓你看,你可能一眼就看出來作者十有八九是畢加索,遮住圖片的左側(cè),你可能也比較確認(rèn)是畢加索的畫作,遮住右邊也是一樣的,這個說法不太嚴(yán)謹(jǐn),這個“風(fēng)格”其實(shí)就是圖像中的各種統(tǒng)計特征(圖像編程了數(shù)值,那么任何位置都會有一些統(tǒng)計指標(biāo),比如極值,均值等)。

這個10*10的參數(shù)矩陣,就是所謂的卷積核?。?!

卷積的過程可以參考圖7所示(動圖來源于http://www.cnblogs.com/nsnow/p/4562308.html ,不要怪我懶,我是真的不太擅長搞一些特別清楚明白的動圖,所以只能看到好的就拿過來借鑒一下)。

你看到的最直白清晰的CNN講解

圖7

我來詳細(xì)解釋一下,圖7的左圖是一個5*5的圖片,轉(zhuǎn)換為了其對應(yīng)的像素矩陣。圖7右側(cè)是一個使用3*3的卷積核進(jìn)行卷積后得到的結(jié)果,卷積核心作用在圖像上的過程是這樣的:用一個3*3的窗口去挨個遍歷左圖的5*5的矩陣,可以得到9個3*3的矩陣(這個理解吧,小學(xué)生應(yīng)該也能算出來),用這9個矩陣分別與圖7右側(cè)的卷積核做對應(yīng)相乘再求和,就是卷積。打個比方,左圖第一個3*3矩陣應(yīng)當(dāng)為

100110111(1)

假設(shè)我們的卷積核就是圖7左圖中給出的卷積核(圖7每個小方塊右下角的元素構(gòu)成的軍鎮(zhèn)就是卷積核),即:

101010101(2)

矩陣(1)與卷積核進(jìn)行對應(yīng)元素相乘再求和,即:1?1+1?0+1?1+0?0+1?1+1?0+0?1+0?1+1?1=4,因此圖7右側(cè)左上角的元素即為4,依次類推,得到了一個3*3的映射結(jié)果。也就是說,假設(shè)我的圖像是M*M維的,而卷積核是N維的,那么卷積操作后會得到一個(M-N+1)*(M-N+1)的矩陣。

有人又要問了,這個卷積核怎么定呢?

CNN的目的就是通過反向傳播算法,訓(xùn)練出最好的卷積核,這個卷積核就是我們的參數(shù)。

初始的卷積核可以使用平均矩陣,對于一個3*3的卷積核而言,大可使用(3)中的矩陣:

191919191919191919(2)

好了,參數(shù)已經(jīng)優(yōu)化到了很成功的量級,接下來,還有什么可以優(yōu)化的么?

第三法寶:多核卷積

上面所述只有一個10*10的卷積核,有100個參數(shù),顯然,特征提取是不充分的,我們可以添加多個卷積核,比如32個卷積核,可以學(xué)習(xí)32種特征。在有多個卷積核時,如圖8右側(cè)所示:

你看到的最直白清晰的CNN講解

圖8

每一個局部感知野不止像圖8左側(cè)那樣,只由一個卷積核進(jìn)行卷積操作,而是對應(yīng)多個。這個過對應(yīng)到網(wǎng)絡(luò)可能比較難想想,我也想了很久怎么能把這個過程展示清楚,所以想引用LeCun的LeNet-5網(wǎng)絡(luò)結(jié)構(gòu),即圖9所示的網(wǎng)絡(luò)結(jié)構(gòu)來給大家看看??磮D9左起第二個層,里面有很多個正方形(即矩陣,每個矩陣都是通過不同卷積核進(jìn)行卷積后得到的結(jié)果),也就是說這個隱藏層是有“厚度”的,一個卷積核就可以得到一個正方形,6個卷積和就得到6個正方形,構(gòu)成了一個有厚度的層,這里的結(jié)構(gòu)大家把它想成3D立體的,有厚度這個概念,就可能好理解一些了。

這樣,通過多個卷積核的操作,對圖像的特征提取就更加充分了。

你看到的最直白清晰的CNN講解

圖9

第四法寶:池化-Down-pooling(下采樣)

有時圖像太大,即使我們參數(shù)不太多,但圖像的像素實(shí)在太多,導(dǎo)致卷積操作后,我們得到的結(jié)果(圖9中左起第二個層中的每一個正方形中的元素數(shù)量太多)仍然過大。我們需要減少訓(xùn)練參數(shù)的數(shù)量,它被要求在隨后的卷積層之間周期性地引進(jìn)池化層。池化的一個目的是減少圖像的空間大小。池化在每一個縱深維度上獨(dú)自完成,因此圖像的縱深保持不變。池化層的最常見形式是最大池化。

還有一個目的是保持平移不變性。 卷積對輸入有平移不變性,池化對特征有平移不變性。平移不變性是什么呢?因?yàn)榫矸e核是在輸入圖或者feature maps上滑動,或者說平移,每次平移時,因此假設(shè)使用max pooling,會過濾掉那些不明顯、未被激活的特征。

深度學(xué)習(xí),自然有多個隱藏層,對應(yīng)到CNN中,就是有多個卷積層,且有多個卷積核,那么原始圖像的過大會導(dǎo)致卷積后的結(jié)果過大。其實(shí)我們可以對卷積后的結(jié)果進(jìn)行一個縮小的過程,使下一次卷積更加輕松。這個縮小過程就是池化。

為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因?yàn)閳D像具有一種“靜態(tài)性”的屬性,這也就意味著在一個圖像區(qū)域有用的特征極有可能在另一個區(qū)域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進(jìn)行聚合統(tǒng)計,例如,人們可以計算圖像一個區(qū)域上的某個特定特征的平均值 (或最大值)。這些概要統(tǒng)計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結(jié)果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決于計算池化的方法)。

池化的過程如圖10所示。

你看到的最直白清晰的CNN講解

圖10

在這里,我們把步幅定為 2,池化尺寸也為 2。也就是對圖10左側(cè)4*4的矩陣,用一個2*2的窗口去以2為步長去遍歷,再直觀的說,我們按照橫向和縱向兩條中軸線將他切成4個2*2的矩陣,然后取每個矩陣的最大值,作為池化后的結(jié)果,就得到了圖10右側(cè)的池化結(jié)果。最大化執(zhí)行也應(yīng)用在每個卷機(jī)輸出的深度尺寸中。正如你所看到的,最大池化操作后,4*4 卷積的輸出變成了 2*2。

除去最大池化,有平均池化,L2池化等等。

輸出

其實(shí)深層的CNN和上述過程一樣,首先有輸入層A,初始化一個卷積核,然后進(jìn)行卷積,得到了第一個卷積層B(如果有i個卷積核,就會在同一層中得到B1,B2,……,Bi),然后進(jìn)行池化,得到一個池化層C(C1,C2,……,Ci),然后進(jìn)行下一次卷積。。。一個卷積層,一個池化層,重復(fù)下去,假如是做分類任務(wù),那么當(dāng)層數(shù)到達(dá)了我們指定的層數(shù),然后到達(dá)了輸出層,CNN 中的輸出層是全連接層,其中來自其他層的輸入在這里被平化和發(fā)送,以便將輸出轉(zhuǎn)換為網(wǎng)絡(luò)所需的參數(shù)。通過前向傳播過程到達(dá)label,然后進(jìn)行反向傳播,進(jìn)行參數(shù)的計算。

再多說一些

之前說的多個卷積核,必然得到多個輸出,這些輸出就是一個個的矩陣,而這個矩陣本身其實(shí)也是圖片(就像原始圖像一樣),這些圖片叫做feature maps,由于feature maps 是由不同卷積和得到的,卷積和是一種特征提取,與輸入的圖像進(jìn)行卷積后,相當(dāng)于再做“激活”動作,激活后得到的feature maps 就是具有對應(yīng)卷積核特征的圖片,卷積核其實(shí)就是濾波器,符合我特征的,激活,不符合的,死著呆著,換做另一個卷積核,可能之前被激活的這次就沒有,而之前死的這次被激活了,所以feature maps 是被卷積核過濾出來的具有不同特征的圖片,最后的輸出層就是匯總了這些特征的圖片,也就是說,到達(dá)輸出層這里的圖片,具有前面每個卷積核的特征,或者可以理解為,到達(dá)輸出層的圖片是輸入圖片的最明顯的特征的集合體,就像人類對一個圖片做判斷,一個小狗在草地上,另一個圖片是一個小貓在水里,那么你判斷圖中的動物是貓還是狗,幾乎不會受到草坪或者水面的影響,而是基于圖片主體本身,或者說基于貓和狗的不同特征,這就是CNN在模仿人類的判斷方式。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多