卷積神經網絡在幾個主流的神經網絡開源架構上面都有實現,我這里不是想實現一個自己的架構,主要是通過分析一個最簡單的卷積神經網絡實現代碼,來達到進一步的加深理解卷積神經網絡的目的.
筆者在github上找到了一個十分簡單的卷積神經網絡python的代碼實現:
https://github.com/ahmedfgad/NumPyCNN
具體的怎么使用這里就不用說了,這里都有介紹,我只是分析一下這個代碼的實現過程並解析代碼,梳理一下神經網絡是怎么使用的和構造原理.
一般的神經網絡主要包含幾個步驟:
-
准備濾波器。
-
卷積層:使用濾波器對輸入圖像執行卷積操作。
-
ReLU 層:將 ReLU 激活函數應用於特征圖(卷積層的輸出)。
-
最大池化層:在 ReLU 層的輸出上應用池化操作。
-
堆疊卷積層、ReLU 層和最大池化層。
我也按照這幾個步驟去分析代碼:
一 准備濾波器:
根據濾波器的數量和每個濾波器的大小創建數組。我們有 2 個大小為 3*3 的濾波器,因此數組大小為 (2=num_filters, 3=num_rows_filter, 3=num_columns_filter)。將濾波器的尺寸選擇為沒有深度的 2D 數組,因為輸入圖像是灰度圖且深度為 1。如果圖像是具有 3 個通道的 RGB,則濾波器大小必須是(3, 3, 3=depth)。
濾波器組的大小由上述 0 數組指定,但不是由濾波器的實際值指定。可以按如下方式覆寫這些值,以檢測垂直和水平邊緣。
二 卷積處理:
在准備好濾波器之后,下一步就是用它們對輸入圖像執行卷積操作。下面一行使用 conv 函數對圖像執行卷積操作:
此類函數只接受兩個參數,即輸入圖像數據和濾波器數組,它的實現如下:
這個函數都做了些什么呢?下面我們逐一進行分析一下:
1 對卷積的過濾器做檢查,確保過濾器符合以下約束條件(行列為奇數並且相等),確保過濾器和圖像的維度相同.
2 創建空的一個卷積提取特征的數組
3 針對兩維的卷積網絡做卷積特征提取:conv_
從這里可以總結出,這個函數的作用就是使用過濾器對圖像做卷積處理,並提取出特征值以供后面使用.
三 ReLU激活函數層
ReLU層將ReLU激活函數應用於conv層輸出的每個特征圖上,根據以下代碼行調用ReLU激活函數:
ReLU激活函數(ReLU)的具體實現代碼如下:
ReLU思想很簡單,只是將特征圖中的每個元素與0進行比較,若大於0,則保留原始值。否則將其設置為0。
四 最大池化層
ReLU層的輸出作為最大池化層的輸入,根據下面的代碼行調用最大池化操作:
最大池化函數(max pooling)的具體實現代碼如下:
該函數接受3個參數,分別為ReLU層的輸出,池化掩膜的大小和步幅。首先也是創建一個空數組,用來保存該函數的輸出。數組大小根據輸入特征圖的尺寸、掩膜大小以及步幅來確定.
對每個輸入特征圖通道都進行最大池化操作,返回該區域中最大的值,這個就是最大池化.這就達到了降采樣的目的.
參考文檔: