每個對機器學習感興趣的機器學習工程師/軟件開發(fā)人員/學生都在卷積神經(jīng)網(wǎng)絡(luò)(也稱為CNN)上工作。我們有一個一般理論,即如何訓練網(wǎng)絡(luò)對圖像進行分類。但是,剛接觸機器學習/神經(jīng)網(wǎng)絡(luò)的人們并不了解CNN如何精確地學習參數(shù)。
我們知道,在每個轉(zhuǎn)換層中,網(wǎng)絡(luò)都試圖了解基本模式。例如:在第一層中,網(wǎng)絡(luò)嘗試學習圖案和邊緣。在第二層中,它嘗試了解形狀/顏色和其他內(nèi)容。最后一層稱為要素層/完全連接層嘗試對圖像進行分類。
在學習參數(shù)之前,我們需要了解卷積網(wǎng)絡(luò)中的一些基本概念,這對修改/重用源代碼非常有幫助。
CNN網(wǎng)絡(luò)中存在各種層。
輸入層:所有輸入層所做的都是讀取圖像。因此,這里沒有學習參數(shù)。
卷積層:考慮一個以“ l ”個特征圖為輸入并以“ k ”個特征圖為輸出的卷積層。過濾器尺寸為“ n * m ” 。
在此,輸入具有l(wèi) = 32個特征圖作為輸入,k = 64個特征圖作為輸出,并且過濾器大小為n = 3和m = 3。重要的是要理解,我們不只是擁有3 * 3過濾器,而是實際上擁有3 * 3 * 32過濾器,因為我們的輸入具有32個尺寸。作為第一轉(zhuǎn)換層的輸出,我們學習了64個不同的3 * 3 * 32濾波器,總權(quán)重為“ n * m * k * l ”。然后,每個特征圖都有一個稱為“偏差”的術(shù)語。因此,參數(shù)總數(shù)為“ (n * m * l + 1)* k ”.
池化層:池化層中沒有可以學習的參數(shù)。該層僅用于減小圖像尺寸。
完全連接層:在此層中,所有輸入單元對每個輸出單元都具有可分離的權(quán)重。對于“ n ”個輸入和“ m ”個輸出,權(quán)數(shù)為“ n * m ”。另外,該層對于每個輸出節(jié)點都有偏差,因此“ (n + 1)* m ”個參數(shù)。
輸出層:此層是完全連接的層,因此當“ n ”是輸入數(shù)而“ m ”是輸出數(shù)時,參數(shù)(n + 1)m。
CNN層的最后一個困難是第一個完全連接的層。我們不知道完全連接層的尺寸,因為它是卷積層。要計算它,我們必須從輸入圖像的大小開始,并計算每個卷積層的大小。
在簡單的情況下,輸出CNN層的大小被計算為“ input_size-(filter_size-1) ”。例如,如果輸入image_size為(50,50)且filter為(3,3),則(50-(3-1))= 48。但是卷積網(wǎng)絡(luò)的輸入圖像的大小不應(yīng)小于輸入的大小,因此可以進行填充。
因此可以進行填充。
要計算填充,請輸入input_size + 2 * padding_size-(filter_size-1)。對于上述情況,(50+(2 * 1)-(3-1)= 52–2 = 50)給出相同的輸入大小。
如果我們想明確地想在卷積過程中對圖像進行下采樣,則可以定義一個跨度。
最后,要計算網(wǎng)絡(luò)學習的參數(shù)數(shù)量(n * m * k + 1)* f.
讓我們在給定的代碼中看到這一點。
import keras
input_1(輸入層)的形狀為(None,96,96,1),參數(shù)為0。在整個程序中,stride = 1,kernel_size = 2 * 2,padding = same。
卷積_1:(((kernel_size)* stride + 1)* filters)= 3 * 3 * 1 + 1 * 32 = 320個參數(shù)。在第一層中,卷積層具有32個濾鏡。
Dropout_1:Dropout層不執(zhí)行任何操作。它只是刪除低于所述權(quán)重的節(jié)點。
Convolutional_2:由于convolutional_1已經(jīng)學習了32個過濾器。所以數(shù)量該層中的可訓練參數(shù)為3 * 3 * 32 + 1 * 32 = 9248,依此類推。
Max_pooling_2d:此層用于減小輸入圖像的大小。kernal_size =(2,2)在這里使用。因此輸入圖像96減少到一半48。模型從這一層學不到任何東西。
Convolutional_3: 3 * 3 * 32 + 1 * 64 = 18496,依此類推。
最后,所有的參數(shù)總結(jié)在一起。
總訓練參數(shù)= 7,759,521可訓練參數(shù)= 7,759,251非訓練參數(shù)= 0。
Have a great day..!