先回憶第一講的內容
我們通過把圖片數字化,變成一個個的小點,再把小點點給拉成一行,變成自變量。然後我們把圖片中的數字作爲標籤,也就是因變量,我們設定一張圖片有10個因變量,這十個變量值是0或1的數字,如果是某位置x是1,那麼這個圖片中的數字就是x-1。
如果有6W張圖,我們會得到6W組這樣的變量,這樣的變量就是我們輸入到卷積神經網絡中的輸入變量。最後我們會得到一個自變量、標籤的表格:
表1
自變量1 | X_1,1 | X_1,2 | ... | X_1,784 |
自變量2 | X_2,1 | X_2,2 | ... | X_2,784 |
... | ... | ... | ... | ... |
自變量6W | X_6W,1 | X_6W,2 | ... | X_6W,784 |
表中,X_a,b指的是第a張圖中的第b個自變量。
表2
標籤1 | Y_1,1 | Y_1,2 | ... | Y_1,10 |
標籤2 | Y_2,1 | Y_2,2 | ... | Y_2,10 |
... | ... | ... | ... | ... |
標籤6W | Y_6W,1 | Y_6W,2 | ... | Y_6W,10 |
表中,Y_a,b指的是第a張圖中的第b個標籤。
我們把這些數據帶入到CNN中,就可以開始正向傳播了。正向傳播分爲三個步驟,第一個步驟是卷積、第二步驟是池化、第三步驟是BP網絡全連接。前兩部也可以分爲多步來解決問題,如:“輸入數據->卷積1-->池化1->卷積2-->池化2->...->卷積n->池化n->BP網絡->輸出數據”的形式。
那麼我先說一下怎麼卷積,我們導入了表1和表2兩組數據。首先我們來搞表1:
(1)我們選取表1中的一行,然後把這行的數據還原成28*28的一個矩陣:
有人會說,剛纔給拉成一行了,這回又還原了是不是傻啊,脫褲子放屁多此一舉嘛!你說的對,確實多此一舉。但是你既然能夠想到這一點,就說明你第一講的內容掌握的不錯,也就是說我寫得文章你看懂了,說明我的講解奏效了。其實它還有一個作用,我們圖片輸入進去是一個個的變量,6W組圖片就6W組變量,東西太亂了,如果給拉成一行,然後所有數據合併成一組變量,也就是表1,那麼看起來是不是也很簡潔呢?
(2)還原之後呢,我們隨機生成6組濾波器矩陣,每一個矩陣是一個5*5的矩形表格,每一個表格裏面都有一個數據,這些數據是隨機生成的的值wij。每個濾波器我們在設定一個偏置量值bk,6組就一共有6個偏置量。
(3)然後我們用剛剛從表1拿出來的第一組自變量與第一個濾波器做卷積運算。這個與我們第一節講的卷積有些不同,我們不再最前面添加0,而是直接從第一個小點開始,我們把5*5的濾波器與自變量矩陣最前面的五行五列對齊,也就是把濾波器放到紅色的位置:
(4)之後我們把自變量小格和濾波器對應的位置相乘,如第一個小格與濾波器的第一個值就乘積是X1*W11,第二個乘積就是X2*W12,以此類推,最後一個乘積就是X117*H55。我們得到了25個乘積值,然後我們把乘積給加和,並加上偏置量b1求出D1,1=X1*W11+X2*W12+...+X117*H55+b1。
(5)接下來我們把濾波器往右平移一個格子:
(6)再用濾波器與紅色的格子一一對應乘積並求和,並加上偏置量b1得到D1,2=X2*W11+X3*W12+...+X118*H55+b1。
(7)以此類推,一個個地求解,直到到達最後一行:
(8)然後我們求出與濾波器的乘積並求和,並加上偏置量b1,我們可以得到:D1,24==X24*W11+X25*W12+...+X140*H55+b1。到此爲止我們求得了24個D。
(9)接下來我們幹啥呢返回到我們最開始的對其狀況,然後再往下移動一格,如圖:
回到原來
接着往下移動一格
(10)然後我們按照上面的(1)~(9)的方法計算D2,1~D2,24,計算完成之後返回:
(11)之後向下移動一格繼續計算,直到所有的D都計算完成爲止,最後一個D是D24,24。然後我們得到了一格新的24*24的D矩陣:
(12)得到了D矩陣後,我們令這個矩陣編號爲d1,然後按照(1)~(11)的方法,用其餘的5個濾波器進行計算,其餘的5個濾波器後面加的偏置量分別爲b2~b5,分別得到了d2~d6。至此我們的卷積過程就完畢了,我們得到了6個卷積矩陣。
(13)我們得到這些所有卷積矩陣之後,我們把得到的所有的值sigmoid一下,給它搞到0~1之間的一個數。這個函數這麼寫:
其中x指的是矩陣中的每一個值。
如果大家還是沒看懂的話,請看下面的圖圖,圖中上面的是得到的新矩陣d,下面是原始的自變量矩陣,自變量矩陣變成深顏色就是與濾波器貼合到了一塊:
這一步驟用圖像流程圖表示是這樣的,我們的長度寬度變小了,但是高度變大了(從1變到了6):
看完這張圖想必大家對卷積運算的過程就十分地清晰了吧?如果可以我們進行下一步,池化計算。
池化計算和我們第一節講的一樣,設定一個採樣器a,比如我們的大小設置爲2*2=4,那麼我們怎麼採樣呢,首先我們選取d矩陣的其中之一,比如d1:
(1)我們從左側頭部開始,用採樣器框選上前兩行兩列,如紅色框框所示:
(2)然後我們選取這裏面的自變量【x1,x2,x25,x26】這四個變量中最大值的一個,比如說最大值是x2,那麼我們捨棄其它的變量並令p1,1=x2。
(3)接下來我們把採樣器向右移動一次,這次和剛纔卷積可不是一樣的了,我們這一次的移動一次是按照採樣器a的大小來移動的,因爲採樣器的列數爲2,所以向右移動2個小格:
(4)接下來我們選取這四個變量【x3,x4,x27,x28】的最大值,比如說最大值是x27,那麼我們捨棄其他的變量並令p1,2=x27。
(5)就這樣移動,一直移動到末尾,我們會求得12個p變量,最後一個變量是p1,12。求完之後,我們返回最初的狀態:
並向下移動一次,因爲a的行數是2,那麼我們向下移動2個小格子:
(6)我們再求一下這次的四個變量【x29,x30,x53,x54】的最大值,假設x53是最大值,那麼令p2,1=x53。
(7)我們按照(1)~(6)的方法一直遍歷,直到我們的紅色小框圈到最後四個自變量爲止,這樣我們就得到了144個p值,最後一個p是p12,12。
(8)我們令這個矩陣爲P1,按照同樣的方法,我們求出其餘6個矩陣的池化結果P2~P6。於是我們得到了6個12*12的矩陣。
這個過程我們可以用圖文來進行描述,就是把剛纔的矩陣縮小一倍:
我們池化之後,正向傳播就完成一半了,接下來就是把這6個12*12的矩陣再進行卷積、池化一次。
怎麼再進行呢?問的好!我們把這6個新矩陣的看成一個整體P1拿出來,後隨機生成12個5*5*5*5*5*5的新濾波器,然後我們用這個P1矩陣與這12個濾波器做卷積,我們會得到12個8*8的矩陣,我們起名爲DD。如圖所示:
接着,我們設定一個採樣器aa,大小爲2*2=4,然後我們對12個矩陣每一個進行採樣,就會得到新的12個矩陣PP1~PP12,大小爲4*4,如圖所示:
我們這兩次計算完成之後,我們已經把矩陣的長寬壓縮的很小很小了,我們下一步不需要再進行卷積池化了。我們直接用BP神經網絡進行全連接就好了。至於怎麼全連接呢,請聽下回分解。
下一節講正向傳播中:全連接、標籤及目標函數的計算。
————————————————
如果對我的課程感興趣的話,歡迎關注小木希望學園-微信公衆號:
mutianwei521
也可以掃描二維碼哦!