卷積神經網絡如何實現提取特征
圖像在計算機中的存儲
圖像其實就是一個像素值組成的矩陣。
1、黑白或灰度圖像如何存儲在計算機中
在這裡,我們已經采取瞭黑白圖像,也被稱為一個灰度圖像。
這是數字8的圖像。現在,如果我們進一步放大並且仔細觀察,你會發現圖像變得失真,並且你會在該圖像上看到一些小方框。
這些小方框叫做 Pixels。我們經常使用的圖像維度是X x Y。這實際上是什麼意思?
這意味著圖像的尺寸就是圖像的高度(x)和寬度(y)上的像素數。
在這種情況下,高度為24像素,寬度為16像素。因此,此圖像的尺寸將為24 x 16。盡管我們看到的是這種格式的圖像,但計算機以數字的形式存儲圖像。
這些像素中的每一個都表示為數值,而這些數字稱為像素值,這些像素值表示像素的強度。
對於灰度或黑白圖像,我們的像素值范圍是 0 到 255 :接近零的較小數字表示較深的陰影,而接近255的較大數字表示較淺或白色的陰影。
因此,計算機中的每個圖像都以這種形式保存,其中你具有一個數字矩陣,該矩陣也稱為Channel。
總結:
- 圖像以數字矩陣的形式存儲在計算機中,其中這些數字稱為像素值。
- 這些像素值代表每個像素的強度:0代表黑色,255代表白色。
- 數字矩陣稱為通道,對於灰度圖像,我們隻有一個通道。
2、彩色圖像如何存儲在計算機中
現在我們有瞭關於如何將灰度圖像存儲在計算機中的想法,讓我們看一個彩色圖像的示例。讓我們以彩色圖像為例,這是一條美女的圖像:
該圖像由許多顏色組成,幾乎所有顏色都可以從三種原色(紅色,綠色和藍色)生成。
我們可以說每個彩色圖像都是由這三種顏色或3個通道(紅色,綠色和藍色)生成。
這意味著在彩色圖像中,矩陣的數量或通道的數量將會更多。
在此特定示例中,我們有3個矩陣:1個用於紅色的矩陣,稱為紅色通道。
另一個綠色的稱為綠色通道。
最後是藍色的矩陣,也稱為藍色通道。
這些像素都具有從0到255的值,其中每個數字代表像素的強度,或者你可以說紅色,綠色和藍色的陰影。最後,所有這些通道或所有這些矩陣都將疊加在一起,這樣,當圖像的形狀加載到計算機中時,它會是
N * H * W
其中 N 表示通道數(彩色圖像 N 為 3),H 是整個高度上的像素數,W 是整個寬度上的像素數。在這種情況下,我們有3個通道R、G和B。在我們的示例中,彩色圖像的形狀將是 6 x 5 x 3,因為我們在高度上有6個像素,在寬度上有5個像素,並且存在3個通道。
矩陣的特征值與特征向量
這個式子要怎麼理解呢?
首先得先弄清矩陣的概念:一個矩陣代表的是一個線性變換規則,而一個矩陣的乘法運行代表的是一個變換。
也就是說,我們有一個方陣(n x n),總能找到一些向量,這個矩陣跟這些向量的作用效果,隻是對這個向量造成瞭拉伸的作用,換句話說,矩陣的作用跟一個系數的作用是等價的。
也就是如下這個式子:
在圖像處理中,有一種方法就是特征值分解。
我們都知道圖像其實就是一個像素值組成的矩陣,假設有一個100×100的圖像,對這個圖像矩陣做特征值分解,其實是在提取這個圖像中的特征,這些提取出來的特征是一個個的向量,即對應著特征向量。
而這些特征在圖像中到底有多重要,這個重要性則通過特征值來表示。
比如 100×100 的圖像矩陣A分解之後,會得到一個100×100的特征向量組成的矩陣Q,以及一個100×100的隻有對角線上的元素不為0的矩陣E,這個矩陣E對角線上的元素就是特征值,而且還是按照從大到小排列的(取模,對於單個數來說,其實就是取絕對值),也就是說這個圖像A提取出來瞭100個特征,這100個特征的重要性由100個數字來表示,這100個數字存放在對角矩陣E中。在實際中我們發現,提取出來的這100個特征從他們的特征值大小來看,大部分隻有前20(這個20不一定,有的是10,有的是30或者更多)個特征對應的特征值很大,後面的就都是接近0瞭,也就是說後面的那些特征對圖像的貢獻幾乎可以忽略不計。我們知道,圖像矩陣A特征值分解後可以得到矩陣Q和矩陣E:
那麼反推出去,把右邊的三個矩陣相乘肯定也能得到矩陣A。既然已經知道瞭矩陣E中隻有前20個特征值比較重要,那麼我們不妨試試把E中除瞭前20個後面的都置為0,即隻取圖像的前20個主要特征來恢復圖像,剩下的全部舍棄,看看此時會發生什麼:
原圖:【註意:特征值分解要求必須是nxn的方陣,如果不是行列相等的方陣,請使用奇異值分解】
隻取前10個特征值:
隻取前20個特征值:
隻取前50個特征值:
隻取前100個特征值:
我們可以看到,在隻取前20個特征值和特征向量對圖像進行恢復的時候,基本上已經可以看到圖像的大體輪廓瞭,而取到前50的時候,幾乎已經和原圖像無異瞭。明白瞭吧,這就是所謂的矩陣的特征向量和特征值的作用。
所以歸根結底,特征向量其實反應的是矩陣A本身固有的一些特征,本來一個矩陣就是一個線性變換,當把這個矩陣作用於一個向量的時候,通常情況絕大部分向量都會被這個矩陣A變換得“面目全非”,但是偏偏剛好存在這麼一些向量,被矩陣A變換之後居然還能保持原來的樣子,於是這些向量就可以作為矩陣的核心代表瞭。於是我們可以說:一個變換(即一個矩陣)可以由其特征值和特征向量完全表述,這是因為從數學上看,這個矩陣所有的特征向量組成瞭這個向量空間的一組基底。而矩陣作為變換的本質其實不就把一個基底下的東西變換到另一個基底表示的空間中麼?
圖像特征與特征向量
假設我們要判斷一個人是男的還是女的,第一反應可能是“頭發”,其次是“聲音”,或者“衣著”之類的,一般通過以上3個特征就能非常直觀地判斷出來是男的還是女的。
但是呢,出題人A特別壞,出題人A說:這個人,他有一雙明亮的大眼睛,有一頭烏黑的頭發,喜歡出入酒吧,一般十點鐘上班,聲音比較細膩,走路比較急,還有,喜歡吃零食,喜歡穿淺色衣服。
出題人B比較好,出題人B說:他頭發比較長,說話比較溫柔,穿的比較陽光,聲線比較細。
我們一聽B的說法,就很直觀地覺得這個人八九不離十是位女生,而從A的判斷中,我們還是模棱兩個。這個就涉及到信息量的問題。A給的特征非常多,信息量很大,但是。。。似乎沒什麼用,而B給的特征少,但是基本足夠瞭。就像圖1,他的數據分佈特別散漫,而圖3的分佈相對集中,是一個道理的。相對於信息量大的特征,我們去挑選特征、做出判斷是非常困難的。
所以!!!我們就需要想辦法對特征做特征提取。也就是說,提取主要的、關鍵的特征就夠瞭!!!而這個提取的方法就是:特征向量!!!
以橢圓舉例:
以上幾個圖,全都可以分類為橢圓,但是因為形狀各異,導致數據也是不對稱的,尤其體現在rgb值上(當然在對圖像的數據處理,還有很多,比如subtraction,BN),其次體現在在各個軸的投影。但是,如果如果我們可以對它做旋轉,縮放,平移等操作,變成如下的圖:
那,是不是就非常好辨認瞭,而且數據也非常集中,至少在某一維度上。於是乎,我們就需要去找這麼一個特征向量。卷積的過程,就是通過反向傳播,無限去擬合這麼一個非常非常非常逼近的特征向量集(這個特征向量集其實就是咱們的卷積核)!!!!為什麼是特征向量集呢(其實單個特征向量(一個列向量或者行向量)也行)?因為一個列向量,我們隻能在一種維度做變換,多個列向量,就意味著多個維度聯合進行特征提取或者曰之為特征映射。
總結一下:卷積核 ≈ 特征向量集,反向傳播 ≈ 求解特征向量集,我們的圖片 ≈ 矩陣A,註意,這些概念不是等價的,隻是用易懂的方式去解釋這些原理。
卷積神經網絡中,第一步一般用卷積核去提取特征,這些初始化的卷積核會在反向傳播的過程中,在迭代中被一次又一次的更新,無限地逼近我們的真實解。其實本質沒有對圖像矩陣求解,而是初始化瞭一個符合某種分佈的特征向量集,然後在反向傳播中無限更新這個特征集,讓它能無限逼近數學中的那個概念上的特征向量,以致於我們能用特征向量的數學方法對矩陣進行特征提取。
卷積提取特征
卷積核(濾波器,convolution kernel)是可以用來提取特征的。圖像和卷積核卷積,就可以得到特征值,就是 destination value。
卷積核放在神經網絡裡,就代表對應的權重(weight)。
卷積核和圖像進行點乘(dot product),就代表卷積核裡的權重單獨對相應位置的Pixel進行作用。
至於為什麼要把點乘完所有結果加起來,實際上就是把所有作用效果疊加起來。就好比前面提到的RGB圖片,紅綠藍分量疊加起來產生瞭一張真正意義的美女圖。
假設我們已經知道 RGB 的三個對應分量以及卷積核(裡面的數字即相當於權重):
於是發生以下過程:
我們卷積輸出的特征圖(feature map),除瞭特征值本身外,還包含相對位置信息,比如人臉檢測,眼睛,鼻子,嘴巴都是從上到下排列的,那麼提取出的相應的特征值也是按照這個順序排列的。
因此我們實現卷積運算的方式就是:從左到右,每隔 stride(步幅)列 Pixel,向右移動一次卷積核進行卷積;從上到下,每隔 stride(步幅)行 pixel,向下移動一次卷積核,移動完成。
就這樣,我們先從左到右,再從上到下,直到所有 pixels 都被卷積核過瞭一遍,完成輸入圖片的第一層卷積層的特征提取。
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Caffe卷積神經網絡視覺層Vision Layers及參數詳解
- pytorch查看網絡參數顯存占用量等操作
- 通過底層源碼理解YOLOv5的Backbone
- Python人工智能深度學習CNN
- 關於keras中卷積層Conv2D的學習記錄