AlexNet architecture
本篇文章,將介紹 AlexNet 架構。
AlexNet 模型架構 (6,000 萬個參數,650,000 個神經元)
AlexNet 原本使用兩個 GPU 進行訓練,改成底下的網路架構
將 Input 224x224x3 改成 227x227x3
- AlexNet 的特點和創新之處
多個 GPU、ReLU:縮短訓練時間
Overlapping Max Pooling:減少參數數量、縮短訓練時間、避免過度擬合
LRN:增加泛化能力,提高精度
Data augmentation、Dropout:減少 Overfitting
數據集
AlexNet 輸入是大小為 256×256 的 RGB 圖像,訓練集中的所有圖像和所有測試圖像的尺寸需為 256×256
需將輸入圖像轉換為 256×256
輸入圖像如是灰度圖像,需複製單個通道將其轉換為 RGB 圖像以獲得 3 通道 RGB 圖像。從 256×256 圖像生成 227×227 輸入 AlexNet
CONV1 Layer
CONV1
參數:96x11x11x3=34848=35k
輸入:227x227x3
卷積核 11x11x3,步長 stride=4,96 個卷積核(kernel)
卷積後尺寸是 55x55x1,(227+2*0-11)/4+1=55
輸出:55x55x48x2new_feture_size = floor((img_size - filter_size)/stride)+1
new_feture_size(卷積後特徵圖大小),floor(向下取整),img_size(圖像尺寸),filter_size(卷積核尺寸),stride(步長)
公式表示,圖像尺寸減去卷積核尺寸除以步長,再加上被減去的核大小像素對應生成的一個像素,結果就是卷積後特徵圖大小ReLU
激活函數:ReLU
輸出:55x55x48x2Max Pooling
最大池化層,f=3、stride=2
輸出:27x27x48x2,(55-3)/2+1=27LRN
標準化處理:LRN 5x5
輸出:27x27x48x2
CONV2 Layer
CONV2
連接同一個 GPU 上的上一層的 kernel map(和卷積核相乘後得到的矩陣)
參數:256x5x5x48=307200=307k
輸入:27x27x48x2
卷積核 5x5x48,padding=2,stride=1,256 個卷積核(kernel),group=2
卷積後尺寸是 27x27x1,(27+2*2-5)/1+1=27
第 1 個卷積共有 96 個卷積核,
第 2 個卷積核的尺寸應該為 5x5x96,
但是第一層分布在兩個GPU上,
且第二個卷積層只連接同一個 GPU 上的上一個網絡,
所以卷積核的尺寸為 5x5x48
輸出:27x27x128x2new_feture_size = floor((img_size - filter_size)/stride)+1
new_feture_size(卷積後特徵圖大小),floor(向下取整),img_size(圖像尺寸),filter_size(卷積核尺寸),stride(步長)
公式表示,圖像尺寸減去卷積核尺寸除以步長,再加上被減去的核大小像素對應生成的一個像素,結果就是卷積後特徵圖大小ReLU
激活函數:ReLU
輸出:27x27x128x2Max Pooling
最大池化層,f=3、stride=2
輸出:13x13x128x2,(27-3)/2+1=13LRN
標準化處理:LRN 5x5
輸出:13x13x128x2
CONV3 Layer
CONV3
連接上一層的所有的 kernel map
參數:384x3x3x256=884736=884k
輸入:13x13x128x2
卷積核 3x3x256,padding=1,stride=1,384 個卷積核(kernel)
卷積後的尺寸是 13x13x1,(13+2*1-3)/1+1=13
輸出:13x13x192x2new_feture_size = floor((img_size - filter_size)/stride)+1
new_feture_size(卷積後特徵圖大小),floor(向下取整),img_size(圖像尺寸),filter_size(卷積核尺寸),stride(步長)
公式表示,圖像尺寸減去卷積核尺寸除以步長,再加上被減去的核大小像素對應生成的一個像素,結果就是卷積後特徵圖大小ReLU
激活函數:ReLU
輸出:13x13x192x2
CONV4 Layer
CONV4
連接同一個 GPU 上的上一層的 kernel map(和卷積核相乘後得到的矩陣)
參數:384x3x3x192=663552=663k
輸入:13x13x192x2
卷積核 3x3x192,padding=1,stride=1,384 個卷積核(kernel)
卷積後的尺寸是 13x13x1,(13+2*1-3)/1+1=13
輸出:13x13x192x2new_feture_size = floor((img_size - filter_size)/stride)+1
new_feture_size(卷積後特徵圖大小),floor(向下取整),img_size(圖像尺寸),filter_size(卷積核尺寸),stride(步長)
公式表示,圖像尺寸減去卷積核尺寸除以步長,再加上被減去的核大小像素對應生成的一個像素,結果就是卷積後特徵圖大小ReLU
激活函數:ReLU
輸出:13x13x192x2
CONV5 Layer
CONV5
連接同一個 GPU 上的上一層的 kernel map(和卷積核相乘後得到的矩陣)
參數:256x3x3x192=442368=442k
輸入:13x13x192x2
卷積核 3x3x192,padding=1,stride=1,256 個卷積核(kernel)
卷積後的尺寸是13x13x1,(13+2*1-3)/1+1=13
輸出:13x13x128x2new_feture_size = floor((img_size - filter_size)/stride)+1
new_feture_size(卷積後特徵圖大小),floor(向下取整),img_size(圖像尺寸),filter_size(卷積核尺寸),stride(步長)
公式表示,圖像尺寸減去卷積核尺寸除以步長,再加上被減去的核大小像素對應生成的一個像素,結果就是卷積後特徵圖大小ReLU
激活函數:ReLU
輸出:13x13x128x2Max Pooling
最大池化層,f=3,stride=2
輸出:6x6x256,(13-3)/2+1=6
FC (Fully Connected Layer)
FC
連接到上一層的所有神經元
輸入:6x6x256=9216,展開為 9216 單元
卷積核 6x6x256,4096 個卷積核(kernel)
輸出:4096
使用 4096 個神經元,對 256 個大小為 6X6 特徵圖,進行一個全鏈接
由於卷積核的尺寸與待處理特徵圖(輸入)的尺寸相同,即卷積核中的每個系數只與特徵圖(輸入)尺寸的一個像素值相乘,一一對應,因此,該層被稱為全連接層。由於卷積核與特徵圖的尺寸相同,卷積運算後只有一個值,因此,卷積後的像素層尺寸為 4096×1×1,即有 4096 個神經ReLU
激活函數:ReLU
輸出:4096Drop
Dropout 隨機從 4096 個節點中丟掉一些節點信息
輸出:4096
FC (Fully Connected Layer)
FC
連接到上一層的所有神經元
輸入:4096
輸出:4096
4096 個神經元,與上一層輸出的 4096 個數據進行全連接ReLU
激活函數:ReLU
輸出:4096Drop
Dropout 隨機從 4096 個節點中丟掉一些節點信息
輸出:4096
Softmax Layer
FC
Softmax
輸入:4096
輸出:1000
採用 1000 個神經元,對上一層中 4096 個數據進行全鏈接,
通過高斯過濾器,得到 1000 個 float 型的值,也就是預測的可能性
訓練模型的話,會通過 label 進行對比誤差,然後求解出殘差,再通過鏈式求導法則,將殘差通過求解偏導數逐步向上傳遞,並將 weight 進行推倒更改,然後會逐層調整 weight 以及 bias
卷積神經網路 (Convolutional Neural Networks, CNN)
感知器接收多個輸入 (x1,x2,x3…),產生一個輸出。
多個感知器組成多層網絡,如下圖所示,這也是經典的神經網絡模型,由輸入層、隱藏層、輸出層構成。
假設給定一張圖(可能是字母 X 或者字母 O),通過 CNN 即可識別出是 X 還是 O,如下圖所示
- 圖像輸入
如果採用經典的神經網絡模型,則需讀取整幅圖像作為神經網絡模型的輸入(即全連接的方式),當圖像的尺寸越大時,其連接的參數將變得很多,從而導致計算量非常大。
在圖像中的空間聯繫,局部範圍內的像素之間聯繫較為緊密,而距離較遠的像素則相關性較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然後在更高層將局部的信息綜合起來就得到了全局的信息。這種模式就是卷積神經網絡中降低參數數目的重要神器:局部感受野。
- 提取特徵
如果字母 X、字母 O 是固定不變的,那麼最簡單的方式就是圖像之間的像素一一比對就行,但在現實生活中,字體都有著各個形態上的變化(例如手寫文字識別),例如平移、縮放、旋轉、微變形等等,如下圖所示:
我們的目標是對於各種形態變化的 X 和 O,都能通過 CNN 準確地識別出來,這就涉及到應該如何有效地提取特徵,作為識別的關鍵因子。
回想前面講到的「局部感受野」模式,對於 CNN 來說,它是一小塊一小塊地來進行比對,在兩幅圖像中大致相同的位置找到一些粗糙的特徵(小塊圖像)進行匹配,相比起傳統的整幅圖逐一比對的方式,CNN 的這種小塊匹配方式能夠更好的比較兩幅圖像之間的相似性。如下圖:
以字母 X 為例,可以提取出三個重要特徵(兩個交叉線、一個對角線),如下圖所示:
假如以像素值 ”1" 代表白色,像素值 ”-1" 代表黑色,則字母 X 的三個重要特徵如下:
卷積運算
卷積核(也稱為過濾器)提取圖像的特徵。在單個卷積層中,通常有許多大小相同的內核。例如,AlexNet 的第一個 CONV 層包含 96 個 11x11x3 大小的內核。內核的寬度和高度通常相同,深度與通道數相同
當給定一張新圖時,CNN 並不能準確地知道這些特徵到底要匹配原圖的哪些部分,所以它會在原圖中把每一個可能的位置都進行嘗試,相當於把這個 feature(特徵) 變成了一個過濾器。這個用來匹配的過程就被稱為卷積運算,這也是卷積神經網絡名字的由來。
卷積運算如下圖所示
3x3 卷積核 (1,1) 元素值,與圖像藍框的 (1,1) 元素值,二者相乘後為 1
繼續計算其他座標的值
9 個座標都計算完後
將 9 個值取平均值,將值填入 feature map (特徵圖)
對於其它位置的匹配,也是類似(例如中間部分的匹配)
計算之後的卷積如下
3x3 卷積核起始位置
如果步長 stride=1,3x3 卷積核就向右平移一個像素
如果步長 stride=2,3x3 卷積核就向右平移兩個像素
如此移動到最右邊後,返回左邊,開始第二排。同樣,如果步長 stride=1,向下平移一個像素;stride=2 則向下平移兩個像素
通過每一個 feature(特徵)的卷積運算,最後會填滿一張完整的 feature map,feature map 是每一個卷積核從原始圖像中提取出來的「特徵」,值越接近「1」表示對應位置和 feature 的匹配越完整,值越接近「-1」表示對應位置和 feature 的反面匹配越完整,值越接近「0」表示對應位置沒有任何匹配或者說沒有什麼關聯。如下圖所示:
底下是另一個卷積運算的例子
CNN 使用過濾器(內核)來區分圖像中的邊緣。如下所示:
上圖顯示了過濾器(權重)如何將圖像矩陣轉換為新矩陣的方式。
假設有兩個過濾矩陣 V 和 H。使用這兩個過濾器對輸入圖像進行卷積。
與輸入圖像進行卷積時,如果「行」上的變化很大,濾波矩陣 V 就會給出較大的值;如果「列」上的變化很小,濾波矩陣 V 就不會產生任何影響。
像素值中沿著「行」的值,表示垂直方向的邊緣,沿著「列」的值,表示水平方向的邊緣。
CNN 過濾器以非常特殊的方式確定圖像中的邊緣。這些過濾器的權重是由模型學習,這些權重可以是任何數字集合,這些數字可以嘗試學習和檢測圖像中任何給定角度的邊緣,以便於分類圖像。
對於 RGB 圖像,過濾器可以是一維或是三維,也可以有多個過濾器,可從圖像的不同方向提取信息。
具有一個過濾器的卷積輸出將產生二維結果,對於同一圖像上的不同過濾器將得到一個二維矩陣,當堆疊在一起時產生三維結果,深度=過濾器數量。(任何過濾器的深度始終等於應用它的矩陣的深度)
下圖為使用三維過濾器可視化卷積
在卷積過程中,尺寸為 (3,3,3) 的三維過濾器貫穿整個圖像以產生一個二維結果。
使用多個這樣的過濾器,並且當堆疊在一起時給出三維結果,輸出矩陣的深度等於所使用的過濾器的數量。
每個過濾器的大小必須相同才能將輸出堆疊成三維矩陣,每個過濾器的深度必須等於輸入圖像的深度才能進行卷積。在這種情況下,圖像深度為 3,因此過濾器的深度也必須為 3
Stride(步幅)
Stride 是圖像中每個過濾器應用於圖像的步幅。在上面的例子中,Stride=1。下面是 stride=2 的卷積的例子。
Padding(填充)
在這種情況下,角落周圍的圖像用 0 填充,以便保持輸出矩陣的形狀不變,或者與沒有填充的矩陣相比減少較少的數量。
有效卷積:無填充的卷積稱為有效卷積。
相同的卷積:如果想要將卷積結果的維數保持為與該層的輸入維數相同,需使用 Padding 並選擇填充深度使得輸入高度和寬度保持與矩陣的輸出深度和寬度相同。(深度可以不同,它僅取決於使用的過濾器的數量)
Padding 和 Stride 參考下圖顯示
深度神經網絡
通過將卷積、激活函數、池化組合在一起,就變成下圖:
通過加大網絡的深度,增加更多的層,就得到了深度神經網絡,如下圖:
再加上全連接層(Fully connected layers),就形成「卷積神經網路(CNN)」,如下圖所示:
卷積神經網絡主要由兩部分組成,一部分是特徵提取(卷積、激活函數、池化),另一部分是分類識別(全連接層)。
激活函數:ReLU (Rectified Linear Units)
常用的激活函數有 Sigmoid、Tanh、ReLU 等等,前兩者 Sigmoid/Tanh比較常見於全連接層,後者 ReLU 常見於卷積層。
感知機在接收到各個輸入,然後進行求和,再經過激活函數後輸出。激活函數的作用是用來加入非線性因素,把卷積層輸出結果做非線性映射
ReLU 作為 non-saturating 非線性激活函數,有效避免了梯度消失問題
神經網絡需要非線性函數來捕獲數據中的非線性依賴關係。ReLU 不會像其他如 Sigmoid 或 Tanh 函數那樣飽和,Sigmoid 函數在兩個極端都飽和,而 ReLU 則不是
與 Tanh( saturating 非線性激活函數) 或 Sigmoid 相比,使用 ReLU(non-saturating 非線性激活函數),在深度學習梯度下降時,訓練速度要快得多。下圖顯示,使用 ReLUs(實線),AlexNet 可以達到 25% 的 Training error rate,是使用 Tanh(虛線)的六倍
Tanh 函數在 z 非常高或非常低時為飽和。在這些區域,函數的斜率非常接近零。可以減緩梯度下降
對於較高的 +z 值,ReLU 函數的斜率不接近零。有助於優化收斂更快。對於 -z 值,斜率為零,神經網絡中的大多數神經元通常都為正值
f(x)=max(0,x),若值為正數,則輸出該值大小,若值為負數,則輸出為0
卷積後產生的特徵圖中的值,越靠近「1」表示與該特徵越關聯,越靠近「-1」表示越不關聯,特徵提取時為了使得數據更少,就捨棄那些不相關聯的數據
>=0 的值不變
<0 的值改寫為 0
激活函數 ReLU 作用後的結果
對所有的 feature map 執行 ReLU 激活函數操作,結果如下:
深度學習中常用的激活函數
我們知道深度學習的理論基礎是神經網絡,在單層神經網絡中(感知機),輸入和輸出計算關係如下圖所示:
可見,輸入與輸出是一個線性關係,對於增加了多個神經元之後,計算公式也是類似,如下圖:
這樣的模型就只能處理一些簡單的線性數據,而對於非線性數據則很難有效地處理(也可通過組合多個不同線性表示,但這樣更加複雜和不靈活),如下圖所示:
那麼,通過在神經網絡中加入非線性激勵函數後,神經網絡就有可能學習到平滑的曲線來實現對非線性數據的處理了。如下圖所示:
因此,神經網絡中激活函數的作用通俗上講,就是將多個線性輸入轉換為非線性的關係。如果不使用激活函數的話,神經網絡的每層都只是做線性變換,即使是多層輸入疊加後也還是線性變換。通過激活函數引入非線性因素後,使神經網絡的表示能力更強了。
局部歸一化 ( Local Response Normalization, LRN)
神經生物學有一個概念叫做「側抑制」(lateral inhibitio),指的是被激活的神經元抑制相鄰神經元。歸一化(normalization)的目的是「抑制」,局部歸一化就是借鑒了「側抑制」來實現局部抑制,尤其當使用 ReLU 時,因為 ReLU 的響應結果是無界的(可以非常大),所以需要歸一化。使用局部歸一化的方案有助於增加泛化能力。LRN 的核心思想就是利用臨近的數據做歸一化。
每一個卷積層的輸出形狀為 [B, H, W, C],以第一個卷積層為例,batch_size取 32,則輸出為 [32, 55, 55, 96],取定 b, h, w, c,假如 b=5, h=10, w=10, c=30,Local Response Normalization 的意思是將 b,h,w 相同,c 附近 n 個結果做歸一化,即 [5, 10, 10, 30-n/2~30+n/2] 的元素歸一化作為 [5, 10, 10, 30] 的結果。具體的計算公式如下:
α. β. k. (n) 的值是在驗證集實驗得到的,α=1e-4, β=0.75, k=2, n=5
下圖的示意比較直觀
Local Response Normalization 實現了某種形式的橫向抑制
這種具有對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得更大,而對響應比較小的值更加加以抑制,從而增強模型的泛化能力,這讓更加明顯的特徵更加明顯,很細微不明顯的特徵加以抑制
主要是為了防止過擬合,增加模型的泛化能力。對當前層的輸出結果做平滑處理。這個策略貢獻了 1.2% 的 Top-5 錯誤率
局部歸一化試圖抑制輸入值,因為 ReLU 的輸出可能非常大。ReLU 具有理想的屬性,它們不需要輸入歸一化來防止飽和,因此 LRN 在 ReLU 之後應用。
「 和在相同的空間位置上,運行在相鄰的內核映射上,最多可以包含,該位置上的所有內核(過濾器)映射 」:
假設有 5 個過濾器,將獲得深度為 5 的 3 維體積卷積。LRN 將對給定(x,y)處的值進行歸一化,但是通過深度中的所有元素並在 z 的不同值上替換這些(x,y)處的值。
歸一化鄰域的大小實際上定義了要歸一化求和的樣本數量。也就是說,在上面的例子中,我們不是對所有 5 個樣本求和(即鄰域(n)=2),我們甚至可以只對 n=1 即鄰域的 3 個樣本求和。
pooling 池化層
卷積運算後,得到 feature map,為減少數據量,會進行池化操作
執行池化會減小維度。能減少參數的數量,既縮短訓練時間,又避免過度擬合。池化層可以獨立地對每個特徵映射進行採樣,降低高度和寬度,保持深度不變。
池化分為兩種,Max Pooling 最大池化(取最大值)、Average Pooling 平均池化(取平均值)
最大池化:選擇池化尺寸為 2x2,選定一個 2x2 的窗口,在其內選出最大值更新入新的 feature map
向右依據步長滑動窗口
最後得到池化後的 feature map
對所有的 feature map 執行同樣的操作,結果如下:
最大池化保留了每一個小塊內的最大值,相當於保留了這一塊最佳匹配結果 (因為值越接近 1 表示匹配越好),不會具體關注窗口內到底是哪一個地方匹配了,只關注是不是有某個地方匹配上了,CNN 能夠發現圖像中是否具有某種特徵,而不用在意到底在哪裡具有這種特徵。
通過加入池化層,圖像縮小了,能很大程度上減少計算量,降低機器負載。
底下是另外兩個 Max Pooling 圖示
Max pooling 是目前最流行的池化類型。主要是通過在過濾區域中存儲最大值,來幫助保留最活躍的神經元信息。這也可以稱為,通過僅將重要值傳遞到下一層,來防止過度擬合。
Non-overlapping pooling
當 stride-size(s) > = filter-size(f) 時。使任何一個像素在任何一個過濾器中只被計數一次。
Overlapping Max Pooling
當 stride-size(s) < filter-size(f) 時。使相同的輸入在多個實例中通過相同的過濾器
AlexNet 使用 Overlapping Max Pooling,設置 s=2, f=3,Max Pooling 可以解決 Average Pooling 的模糊問題。同時卷積核掃描步長比池化核的尺寸小,這樣在池化層的輸出之間會有重疊和覆蓋,在一定程度上提升了特徵的豐富性。這個策略貢獻了 0.3% 的 Top-5 錯誤率
尺寸變化:通過過濾器時的輸出大小由給定的公式決定。s=stride,f=filter size (考慮square filter),n=input dimensions(長度或寬度),p =padding。(池化層只有超參數,沒有參數)
使 Overlapping Pooling,可以降低原始 input 在深層 Convolution 的損失,所以錯誤率會下降
全連接層( Fully Connected Layers,FC)
全連接層在整個卷積神經網絡有「分類器」的作用,即通過卷積、激活函數、池化等深度網路後,再經過全連接層對結果進行識別分類。
首先將經過卷積、激活函數、池化的深度網路後的結果串起來,如下圖所示:
由於神經網路是屬於監督學習,在模型訓練時,根據訓練樣本對模型進行訓練,從而得到全連接層的權重(如預測字母 X 的所有連接的權重)
使用該模型進行結果識別時,根據剛才提到的模型訓練得出來的權重,以及經過卷積、激活函數、池化等深度網路計算出來的結果,進行加權求和,得到各個結果的預測值,然後取值最大的作為識別的結果(如下圖,最後計算出來字母 X 的識別值為 0.92,字母 O 的識別值為 0.51,則結果判定為 X )
上述這個過程的操作定義為全連接層(Fully connected layers),全連接層也可以有多個,如下圖:
全連接層是傳統的神經網路,層中的每個節點與前一個層中的每個節點相連接。
與具有相似大小的層的標準前饋神經網絡相比,CNN 具有更少的連接和參數,因此它們更容易訓練。
在 Alex-Net 中可以看到較少數量的參數,因為它的 8 個層中有 5 個是卷積層,3 個是完全連接層,但仍然只有 1% 的參數由卷積層貢獻
使用 CNN 而不使用完全連接層的優點是:
- 參數共享:在圖像的一部分中有用的特徵檢測器(例如垂直邊緣檢測器)可能在圖像的另一部分中也有用,因為過濾器在整個圖像中都是使用的。
- 連接的稀疏性:在每個層中,每個輸出值只依賴於少量的輸入。
這些屬性為 CNN 提供了 translational in-variance,也就是說移動圖像不會影響模型,因為在整個過程中都應用了相同的過濾器。
AlexNet 96% 的參數都集中在 3 層全連接層中,卷積層只佔據 4%。(因全連接層參數太多,現在一般盡量避免全連接層,改用全卷積 + Global Average Pooling)
減少 Overfitting:Data Augmentation (數據增強)
減少圖像數據過度擬合的最簡單和最常用的方法是使用 label-preserving 變換人為地擴大數據集
- Data Augmentation by Mirroring (使用 Mirroring 進行數據增強):沿水平和垂直軸進行鏡像,此方法在訓練階段時使用
- Data Augmentation by Random Crop (使用 Random Crop 進行數據增強):例如將 256x256 分批裁剪成四個 227x227,此方法在預測階段時使用
由於 ImageNet 中圖片分辨率不固定,作先將每張圖片的最短邊 resize 到256,並保持圖片長寬比例,再裁取圖片正中部分的 256x256
從 (256,256) 樣本中隨機提取 (227,227) 大小的 patch,並進行水平反射。該網絡在這個提取的維度上進行了訓練 (227,227)
這種機制將數據集的大小增加了 2048 倍,因為 (227,227) 的維度可以從 256,256 圖像中抽取 32*32=1024 種 patch,horizontal reflection 使每個圖像的樣本數增加了一倍,每個圖像可以生成 2048 種 patch)。
我們在測試時使用了類似的機制,即我們從原始的大小樣本 (256,256) 中提取了 5 個相同大小的 (227,227),並平均了 10 個網絡的 softmax 層的預測(由於水平反射增加了一倍)
- 改變訓練樣本 RGB 通道的強度值:PCA,此方法在訓練階段時使用
簡單地說,主成分分析的顏色移動可以理解為,改變像素對應的顏色比例的方差或說其值的傳播。這意味著假設紅色通道中的像素從 10 到 255 變化,而綠色通道從 150 到 200 變化,而對於藍色通道從 190 到 195 變化,那麼每個顏色通道中相應的變化對於紅色最大,然後是綠色,然後是藍色通道即與其方差成比例的種類。
假設我們有一個 mxn 維彩色圖像。然後我們有相應圖像的 mxnx3 維矩陣。我們將每個圖像轉換為(m * n,3)維的二維矩陣。這樣我們在每列中都有 m * n 個元素和 3 個這樣的列。我們可以計算該矩陣的協方差矩陣(它是一個 3x3 維的矩陣,列數是 3)
下一步是通過計算協方差矩陣的特徵向量,按特徵值的降序排序,計算出 RGB 顏色樣本的最大方差方向。這就給出了 RGB 彩色通道的主要組成部分。
在色彩增強圖像的旁邊,我們取特徵向量與相應特徵值的點積乘以一個隨機數。(三種顏色的隨機數不同,取正態分布)
這形成了我們想要添加到規範化圖像數據的 δ(delta)。(記住我們在計算 PCA 之前規範化數據)
AlexNet 利用 PCA 技術對原圖像素值進行更新。一張圖片有 3 個通道,RGB。3 個通道間的 3x3 協方差矩陣,求出其特徵值 λi 和特徵向量 Pi,λi 再乘以一個服從高斯分布 N(0;0.1) 的隨機數 αi 的到 λi*αi(i=1,2,3)。再利用下式,就可以求出RGB每個通道不隨圖片灰度值變化的重要特性 object identity。
δ 的數學公式如下:
每個像素三通道值分別加上上述更新量
δ 值顯示在上面。這個值被加/減以獲得新的顏色值。這裡 p 表示特徵向量,α 表示隨機正態值,λ 表示特徵值。
接下來,我們將這些數據轉換回原始形式,即對數據進行反規範化。
該方案近似地捕獲了自然圖像的一個重要特性,即物體的特徵不隨光照強度和顏色的變化而變化。
上述過程最終輸出 PCA 顏色增強數據,如下所示。仔細觀察會發現第二張圖像比第一張圖像亮一點。
減少 Overfitting:Dropout
Dropout 在 Batch Normalization 之前是常用且非常有效的正则化技巧,但Batch Normalization 出世之后,基本就销声匿迹了。
Dropout 是以一定的概率使神經元的輸出為 0,AlexNet 設置概率為 0.5,在第 1,2 個全連接網絡中使用了 Dropout,使迭代收斂速度增加了一倍
假設使用硬幣投擲隨機選擇一層中的一半節點並丟棄它們,這樣它的所有連接都會丟失,這些節點既不用於正向傳播也不用於反向傳播,這樣就得到一個更小的網絡。這個過程就是以 0.5 的機率實現 DropOut
Dropout 層接受超參數,該超參數是稱為保持機率(keep-prob)的機率值,位於(0,1)之間。保持機率的值決定了訓練過程中正向和反向傳播時隨機選擇的樣本所占的比例。如果 keep-prob = 1,則表示考慮了所有節點,並發生了 Dropout。如果 keep-prob = 0.1,則在該層中丟棄所有節點的 90%,而訓練只在該層中剩下的 10% 的節點中進行
為什麼 Dropout 有效:Dropout 有效是因為它消除了我們的模型對神經網絡中某些特定輸入或特定節點的依賴,並阻止模型學習神經元的複雜協同適應,因為神經元不能依賴於特定其他神經元的存在。通常情況下,我們主要在計算機視覺任務中沒有足夠的數據,在這些情況下也可能會有所幫助
Dropout 造成的影響是 training performance下降,可有效的減少 overfitting 帶來的問題。在做預測 testing 階段不做 Dropout。
訓練學習
模型訓練使用了隨機梯度下降法,batchsize 是128,權重更新公式如下:
其中 i 是迭代的索引,v 是動量變量,0.9 是動量參數,ε 是學習率,0.0005 是 weight decay 系數,有正則化的作用,而且減少了模型的訓練誤差
這一批圖片代價函數對權重 w 的偏導數:(代表了第 i 批 Di 的平均值目標函數關於 w 的導數,在 wi 處的值)
所有的 weight 都採用均值為 0,方差為 0.01 的高斯分布進行初始化
第 2,4,5 卷積層和所有全連接層的 bias 都初始化為 1,因為這種初始化通過向 ReLU 提供正輸入來加速學習的早期階段,並且傾向於開始學習過程
其他層的 bias 初始化為 0
學習率 ε=0.01,所有層都使用這個學習率,在訓練過程中,當錯誤率不再下降時,將學習率除以 10,減少3次直到終止。
通過 120 萬張圖像運行了 90 個周期
结果
下圖是 AlexNet 在2010年 ImageNet 測試集上的 Top-1 和 Top-5 準確度 ,提升相當明顯,說明瞭深度學習性能的優越性。
下圖是單模型、多模型集成,有無預訓練等的結果對比,可以看出一下幾點:
1. 效果提升超 10 個點,質的提升,說明瞭深度學習性能的優越性
2. 預訓練是有效的
3. 多模型繼承是有效的
匹配與檢索,使用最後一個全連接層的輸出作為特徵,通過歐氏距離可計算圖像間的特徵相似度,可做匹配,提出可以通過 auto-encoder 進一步壓縮獲取到 short binary code,可用於檢索。
下圖第一列是 test set 中的 5 張照片,右邊是訓練集中,模型最後一個隱藏層 FC4096,與第一列中的照片歐式距離最近的 6 張。可以看出,訓練集中的照片與測試集的照片姿態變化挺大的,說明模型能學習到物體有效特徵。
下圖是第一層卷積神經網絡的 96 個 11x11x3 卷積核的可視化,上面 48 個是在 GPU1 上學習的,下面 48 個是在 GPU2 上學習的,GPU1 上學習的都是與顏色無關的特徵,GPU2 上學習的大部分都是與顏色相關的特徵。
在 ILSVRC 2012 上做的報告展示了使用 AlexNet 做 detection 的結果,如下所示
Backward propagation (反向傳播)
https://medium.com/ran-ai-deep-learning,ran1988mail@gmail.com