caffe卷積輸入通道如何到輸出通道詳解

2021-08-07 16:00:18 字數 3683 閱讀 5902

問題:10個卷積核,得到10個feature map, 那麼輸入影象為rgb三個通道呢,輸出就為 30個feature map 嗎, 答案肯定不是的, 輸出的個數依然是 卷積核的個數。 可以檢視常用模型,比如lenet 手寫體,alex imagenet 模型, 每一層輸出feature map 個數 就是該層卷積核的個數。

1、一通道 多個卷積核卷積過程

2、 多通道的多個卷積核

下圖展示了在四個通道上的卷積操作,有兩個卷積核,生成兩個通道。其中需要注意的是,四個通道上每個通道對應乙個卷積核,先將w2忽略,只看w1,那麼在w1的某位置(i,j)處的值,是由四個通道上(i,j)處的卷積結果相加然後再取啟用函式值得到的。 所以最後得到兩個feature map, 即輸出層的卷積核核個數為 feature map 的個數

所以,在上圖由4個通道卷積得到2個通道的過程中,引數的數目為4×2×2×2個,其中4表示4個通道,第乙個2表示生成2個通道,最後的2×2表示卷積核大小。

下面是常見模型, 理解一下 每層feature map 個數,為上一層卷積核的個數下圖即為alex的cnn結構圖。需要注意的是,該模型採用了2-gpu並行結構,即第1、2、4、5卷積層都是將模型引數分為2部分進行訓練的。在這裡,更進一步,並行結構分為資料並行與模型並行。資料並行是指在不同的gpu上,模型結構相同,但將訓練資料進行切分,分別訓練得到不同的模型,然後再將模型進行融合。而模型並行則是,將若干層的模型引數進行切分,不同的gpu上使用相同的資料進行訓練,得到的結果直接連線作為下一層的輸入。

上圖模型的基本引數為:

輸入:224×224大小的,3通道

第一層卷積:5×5大小的卷積核96個,每個gpu上48個。

第一層max-pooling:2×2的核。

第二層卷積:3×3卷積核256個,每個gpu上128個。

第二層max-pooling:2×2的核。

第三層卷積:與上一層是全連線,3*3的卷積核384個。分到兩個gpu上個192個。

第四層卷積:3×3的卷積核384個,兩個gpu各192個。該層與上一層連線沒有經過pooling層。

第五層卷積:3×3的卷積核256個,兩個gpu上個128個。

第五層max-pooling:2×2的核。

第一層全連線:4096維,將第五層max-pooling的輸出連線成為乙個一維向量,作為該層的輸入。

第二層全連線:4096維

softmax層:輸出為1000,輸出的每一維都是屬於該類別的概率。

4 deepid網路結構

deepid網路結構是香港中文大學的sun yi開發出來用來學習人臉特徵的卷積神經網路。每張輸入的人臉被表示為160維的向量,學習到的向量經過其他模型進行分類,在人臉驗證試驗上得到了97.45%的正確率,更進一步的,原作者改進了cnn,又得到了99.15%的正確率。

如下圖所示,該結構與imagenet的具體引數類似,所以只解釋一下不同的部分吧。

上圖中的結構,在最後只有一層全連線層,然後就是softmax層了。**中就是以該全連線層作為影象的表示。在全連線層,以第四層卷積和第三層max-pooling的輸出作為全連線層的輸入,這樣可以學習到區域性的和全域性的特徵。

(1)在矩陣a中

m為卷積核個數,k=k*k,等於卷積核大小,即第乙個矩陣每行為乙個卷積核向量(是將二維的卷積核轉化為一維),總共有m行,表示有m個卷積核。
(2)在矩陣b中

n=((image_h + 2*pad_h – kernel_h)/stride_h+ 1)*((image_w +2*pad_w – kernel_w)/stride_w + 1)

image_h:輸入影象的高度

image_w:輸入影象的寬度

pad_h:在輸入影象的高度方向兩邊各增加pad_h個單位長度(因為有兩邊,所以乘以2)

pad_w:在輸入影象的寬度方向兩邊各增加pad_w個單位長度(因為有兩邊,所以乘以2)

kernel_h:卷積核的高度

kernel_w:卷積核的寬度

stride_h:高度方向的滑動步長;

stride_w:寬度方向的滑動步長。

因此,n為輸出影象大小的長寬乘積,也是卷積核在輸入影象上滑動可擷取的最大特徵數。

k=k*k,表示利用卷積核大小的框在輸入影象上滑動所擷取的資料大小,與卷積核大小一樣大。

(3)在矩陣c中

矩陣c為矩陣a和矩陣b相乘的結果,得到乙個m*n的矩陣,其中每行表示乙個輸出影象即feature map,共有m個輸出影象(輸出影象數目等於卷積核數目)
(在caffe中是使用src/caffe/util/im2col.cu中的im2col和col2im來完成矩陣的變形和還原操作)

舉個例子(方便理解):

假設有兩個卷積核為與,因此m=2,kernel_h=2,kernel_w=2,k= kernel_h * kernel_w=4

輸入影象矩陣為,因此image_h=3,image_w=3,令邊界擴充套件為0即pad_h=0,pad_w=0,滑動步長為1,即stride_h=1,stride_w=1

故n=[(3+2*0-2)/1+1]*[ (3+2*0-2)/1+1]=2*2=4

a矩陣(m*k)為(一行為乙個卷積核),b矩陣(k*n)為(b矩陣的每一列為乙個卷積核要卷積的大小)

a 矩陣的由來:::

b矩陣的由來:(caffe 有 imtocol.cpp**,專門用於實現)

c=a*b=*=

c中的與分別為兩個輸出特徵影象即feature map。驗證了 有幾個卷積核就有幾個feature map

在caffe原始碼中,src/caffe/util/math_functions.cu(如果使用cpu則是src/util/math_functions.cpp)中的caffe_gpu_gemm()函式,其中有兩個矩陣a(m*k)

與矩陣 b(k*n),大家可以通過輸出m、k、n的值即相應的矩陣內容來驗證上述的原理,**中的c矩陣與上述的c矩陣不一樣,**中的c矩陣儲存的是偏置bias,

是a 與b相乘後得到m*n大小的矩陣,然後再跟這個儲存偏置的矩陣c相加完成卷積過程。如果是跑mnist訓練網路的話,可以看到第乙個卷積層卷積過程中,

m=20,k=25,n=24*24=576。

(caffe中涉及卷積具體過程的檔案主要有:src/caffe/layers/conv_layer.cu、src/caffe/layers/base_conv_layer.cpp、 src/caffe/util/math_functions.cu、src/caffe/util/im2col.cu)

(對於他給出的ppt上的c表示影象通道個數,如果是rgb影象則通道數為3,對應於caffe**中的變數為src/caffe/layers/base_conv_layer.cpp中

函式forward_gpu_gemm中的group_)

關於卷積層的輸入輸出通道數問題

卷積層的輸入是一張或者多張,有可能是單通道或者多通道,但不管是單通道還是多通道,經過卷積層後,得到的輸出map都是單通道的特徵圖。1 假如輸入1張,通道數為5,那麼在設計卷積核的時候,對應的卷積核的通道數也因該是5 import tensorflow as tf input tf.variable ...

動手學深度學習 5 3 多輸入通道和多輸出通道

前面兩節裡我們用到的輸入和輸出都是二維陣列,但真實資料的維度經常更高。例如,彩色影象在高和寬2個維度外還有rgb 紅 綠 藍 3個顏色通道。假設彩色影象的高和寬分別是 hh h 1 1 2 2 4 3 5 4 0 0 1 1 3 2 4 3 56 圖5.4 含2個輸入通道的互相關計算 接下來我們實現...

三通道輸入一通道輸出實現三路觸控功能

華誠hc8t046p觸控ic有4個輸入 輸出管腳,所以最大可以實現三通道輸入。用這顆ic實現三通道觸控的最大難點在於只有乙個通道負責輸出,三個通道三種波形,如果對波形識別不準確就會導致竄鍵的產生。p10 p13是4個輸入 輸出管腳 ic定製p10 p11 p13觸控輸入管腳,p12為pwm輸出管腳。...