先講一下是怎么卷積的。一般輸入的是RGB顏色空間的圖片,即有三個通道。可以理解為這三個通道的每個對應的數值組合在一起表示了這一張圖片。
卷積操作過程:(通道數變化的原理)
先從一張示意圖說起,卷積基礎概念和操作步驟就不啰嗦了,只講這張圖,大意就是,有in-channel,有out-channel,你需要把in-channel都做卷積操作,然后產出out-channel,所以這個w是要層層拆解,w分拆成w0和w1,以對應2個out-channel。w0分拆成3個矩陣w0[:,:,0]、w0[:,:,1]、w0[:,:,2],以對應3個in-channel,因為輸入的3通道終究要合而為一的(進入一個核):y0=w0*x+b0、y1=w1*x+b1,所以w0只有一個b0對應,而不是三個。又因為卷積操作中,一個核要計算的目標是一個sum總值(綠圖中的一個點),而不是9個值,所以3*3的矩陣只要對應1*1的b就夠了。
經過卷積后的大小變化公式:
推導的公式:
out_size = (n - k + 2p)/s + 1
輸入圖片大小為n x n,卷積核kernel_size大小為k x k,步長stride為s,填充padding為p('same'為填充那么P就為1,否則就為0),得到輸出特征圖out_size大小
舉個栗子:
用Darknet53的第一層來說:
layer filters size input output
0 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
輸入的是416X416,三通道的圖片,輸出為416x416, 32通道的特征圖。有可能有人會問,卷積過后圖片大小不是會變嗎?對,正常卷積大小會變化,但是在這一層進行了用0對原圖片進行了填充,卷積步長為1,最后卷積出來過后特征圖的大小沒有變,只是通道數變了。如果實在是懶的話,請直接食用公式。