CNN中卷積層的計算細節


轉載自:https://blog.csdn.net/dcrmg/article/details/79652487



 

前幾天在看CS231n中的CNN經典模型講解時,花了一些時間才搞清楚卷積層輸入輸出的尺寸關系到底是什么樣的,現總結如下。(可以參照我畫的題圖理解卷積層的運算)

 

卷積層尺寸的計算原理

  • 輸入矩陣格式:四個維度,依次為:樣本數、圖像高度、圖像寬度、圖像通道數
  • 輸出矩陣格式:與輸出矩陣的維度順序和含義相同,但是后三個維度(圖像高度、圖像寬度、圖像通道數)的尺寸發生變化。
  • 權重矩陣(卷積核)格式:同樣是四個維度,但維度的含義與上面兩者都不同,為:卷積核高度、卷積核寬度、輸入通道數、輸出通道數(卷積核個數)
  • 輸入矩陣、權重矩陣、輸出矩陣這三者之間的相互決定關系
    • 卷積核的輸入通道數(in depth)由輸入矩陣的通道數所決定。(紅色標注)
    • 輸出矩陣的通道數(out depth)由卷積核的輸出通道數所決定。(綠色標注)
    • 輸出矩陣的高度和寬度(height, width)這兩個維度的尺寸由輸入矩陣、卷積核、掃描方式所共同決定。計算公式如下。(藍色標注)

 

 * 注:以下計算演示均省略掉了 Bias ,嚴格來說其實每個卷積核都還有一個 Bias 參數。

 

標准卷積計算舉例

 以 AlexNet 模型的第一個卷積層為例,
- 輸入圖片的尺寸統一為 227 x 227 x 3 (高度 x 寬度 x 顏色通道數),
- 本層一共具有96個卷積核,
- 每個卷積核的尺寸都是 11 x 11 x 3。
- 已知 stride = 4, padding = 0,
- 假設 batch_size = 256,
- 則輸出矩陣的高度/寬度為 (227 - 11) / 4 + 1 = 55

 

 1 x 1 卷積計算舉例

后期 GoogLeNet、ResNet 等經典模型中普遍使用一個像素大小的卷積核作為降低參數復雜度的手段。
從下面的運算可以看到,其實 1 x 1 卷積沒有什么神秘的,其作用就是將輸入矩陣的通道數量縮減后輸出(512 降為 32),並保持它在寬度和高度維度上的尺寸(227 x 227)。

 

 

全連接層計算舉例

實際上,全連接層也可以被視為是一種極端情況的卷積層,其卷積核尺寸就是輸入矩陣尺寸,因此輸出矩陣的高度和寬度尺寸都是1。

 

 

      總結下來,其實只需要認識到,雖然輸入的每一張圖像本身具有三個維度,但是對於卷積核來講依然只是一個一維向量。卷積核做的,其實就是與感受野范圍內的像素點進行點積(而不是矩陣乘法)。

      卷積層內卷積核的個數不是計算出來的,而是人為設計出來的。經典的網絡每一個卷積層有多少個卷積核可以查看對應論文。如果是自己玩,你弄多少個都沒人管你。

附:TensorFlow 中卷積層的簡單實現

def conv_layer(x, out_channel, k_size, stride, padding):
    in_channel = x.shape[3].value
    w = tf.Variable(tf.truncated_normal([k_size, k_size, in_channel, out_channel], mean=0, stddev=stddev))
    b = tf.Variable(tf.zeros(out_channel))
    y = tf.nn.conv2d(x, filter=w, strides=[1, stride, stride, 1], padding=padding)
    y = tf.nn.bias_add(y, b)
    y = tf.nn.relu(y)
    return x
  • 輸入 x:[batch, height, width, in_channel]
  • 權重 w:[height, width, in_channel, out_channel]
  • 輸出 y:[batch, height, width, out_channel]

 

 

參考鏈接:https://zhuanlan.zhihu.com/p/29119239


免責聲明!

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



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