卷積神經網絡CNN的原理(三)---代碼解析


 

  卷積神經網絡在幾個主流的神經網絡開源架構上面都有實現,我這里不是想實現一個自己的架構,主要是通過分析一個最簡單的卷積神經網絡實現代碼,來達到進一步的加深理解卷積神經網絡的目的.

筆者在github上找到了一個十分簡單的卷積神經網絡python的代碼實現:

https://github.com/ahmedfgad/NumPyCNN

具體的怎么使用這里就不用說了,這里都有介紹,我只是分析一下這個代碼的實現過程並解析代碼,梳理一下神經網絡是怎么使用的和構造原理.

一般的神經網絡主要包含幾個步驟:

  1. 准備濾波器。

  2. 卷積層:使用濾波器對輸入圖像執行卷積操作。

  3. ReLU 層:將 ReLU 激活函數應用於特征圖(卷積層的輸出)。

  4. 最大池化層:在 ReLU 層的輸出上應用池化操作。

  5. 堆疊卷積層、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層的輸出,池化掩膜的大小和步幅。首先也是創建一個空數組,用來保存該函數的輸出。數組大小根據輸入特征圖的尺寸、掩膜大小以及步幅來確定.

 對每個輸入特征圖通道都進行最大池化操作,返回該區域中最大的值,這個就是最大池化.這就達到了降采樣的目的.

 

參考文檔:

1 https://www.jiqizhixin.com/articles/2018-05-29

2 https://yq.aliyun.com/articles/585741


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM