接上篇:捲積神經網路對圖片分類-中 9 ReLU(Rectified Linear Units) Layers 在每個捲積層之後,會馬上進入一個激勵層,調用一種激勵函數來加入非線性因素,決絕線性不可分的問題。這裡我們選擇的激勵函數方式叫做ReLU, 他的方程是這樣f(x) = max(0, x),就 ...
接上篇:捲積神經網路對圖片分類-中
9 ReLU(Rectified Linear Units) Layers
在每個捲積層之後,會馬上進入一個激勵層,調用一種激勵函數來加入非線性因素,決絕線性不可分的問題。這裡我們選擇的激勵函數方式叫做ReLU, 他的方程是這樣f(x) = max(0, x),就是把小於零的值都歸為0,好處是可以是網路訓練的更快,減少梯度消失的問題出現。具體如何理解,例如:
上圖A中可以通過一條直線來區分2種不同類型的數據點,然而B就不可以。但是調用激勵函數經過變換之後就可以對它們進行很好的區分。
10 訓練
到目前為止大家肯定會有一些疑問,捲積層是如何知道提取哪些特征圖像,過濾器里的權重值是如果被確定的,全連接層是如何進行對比的。
接下來我們就來看看,網路是如何被訓練的。其實網路在訓練的過程中電腦是通過反向傳播演算法來調整過濾器的權重值。在講解反向傳播演算法之前我們先來看一個類比。
當我們生下來的時候,我們的思想是嶄新的,不知道什麼是鳥什麼是狗。類似在CNN在開始訓練之前,權重值也是隨機初始化的,過濾器不知道提取哪些特征值。當我們長大一些的時候,父母和老師給我們看不同的圖片並且告訴我們這些圖片對應的是什麼。這種思想或者方法就是給圖片打標簽,就是CNN訓練的過程。在CNN訓練之前,其實我們已經有一些訓練樣本,裡面有成千上萬張貓,狗,鳥,船的圖片,並且每一張圖片都有一個對應的標簽說明它是什麼動物,例如有一張訓練圖片被標記為狗,它的標簽是[0 0 0 1 0 0 0 0 0 0],屬於它的分類對應的位置被標記為1,其他不屬於它的分類位置被標記為0值。
反向傳播演算法可以分成4個不同的部分,向前傳遞,損失函數,反向傳遞,更新權重。在向前傳播過程中,你拿到一張訓練圖片28X28X3的數組,通過網路傳遞它。剛開始所有的權重值都被隨機初始化,它們可能會是這樣一些隨機值[0.3, 0.1, 0.4, 0.2, 0.3....]。網路通過初始化的權重值,是無法提取準確特征圖像 ,因此無法給出任何合理的結論,圖片屬於哪種類別。這時我們就需要反向傳播中的損失函數來幫助網路更新權重值找到想要的特征圖像。損失函數的定義方式有很多種,但是一種常用方式的是MSE(mean squared erro)均方誤差。
這裡target就是圖片的真實分類值,output就是圖片通過網路訓練出來的分類值,然後調用均方誤差就得到了損失值。這個損失值在網路剛開始訓練的時候可能會很高,這個很好理解因為權重值都是隨機初始化出來的。我們的最終目的就是想要得到預測值和真實值一樣。為了達到這個目的,我們就需要儘量減少損失值,損失值越小就說明預測結果越接近。在這一個過程中,我們就需要不斷的調整權重值,來尋找出哪些權重值能使網路的損失減小。具體怎樣來尋找這些權重值,就需要使用到梯度下降演算法。它的示例圖如下:
剛開始在曲面上有一個點,這個點就是我們的初始化權重,然後不停的更新權重值,讓這個點沿著曲面的邊緣慢慢下降,最終降到最低點,得到一個很小的損失值。在訓練的過程中,你可以指定一個下降速率或者叫做訓練速率,也就是這個點每次移動的步伐。給一個大的訓練速率意味著權重在更新的時候步伐更大,訓練的速度更快,但是當你給的值太大時就有可能在快達到最低點時跳躍過它,這樣就獲取不到最佳權重值了。
做一次前向傳遞,損失函數,反向傳遞和參數更新的過程通常被稱為one epoch。 每次訓練都會指定完成epoch的次數,然後程式就會不斷重覆這一過程,當最後一輪訓練結束之後,我們的網路也就被訓練好了,得到了訓練出來的一些權重值。
11 測試
最後,為了檢測訓練出來的CNN模型是否準確,我們需要一些不同的圖片和標簽,把他們傳遞給CNN,用預測出來的結果和真實結果做一下對比就可以知道訓練出來的模型是否準確了。
(完)
參考:
http://neuralnetworksanddeeplearning.com/chap6.html#convolutional_neural_networks_in_practice
https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks/