我們將先描述卷積神經⽹絡中卷積層和池化層的⼯作原理,並解釋填充、步幅、輸⼊通道和輸出通道的含義。掌握了這些基礎知識以后,我們將探究數個具有代表性的深度卷積神經⽹絡的設計思路。
卷積神經⽹絡是含有卷積層(convolutional layer)的神經⽹絡,以常見的二維卷積層為例,它有⾼和寬兩個空間維度,常⽤來處理圖像數據,雖然卷積層得名於卷積(convolution)運算,但我們通常在卷積層中使⽤更加直觀的互相關(crosscorrelation)運算。⼀個⼆維輸⼊數組和⼀個⼆維核(kernel)數組通過互相關運算輸出⼀個⼆維數組。
在⼆維互相關運算中,卷積窗口從輸⼊數組的最左上⽅開始,按從左往右、從上往下的順序,依次在輸⼊數組上滑動。當卷積窗口滑動到某⼀位置時,窗口中的輸⼊⼦數組與核數組按元素相乘並求和,得到輸出數組中相應位置的元素。
自己定義一個互相關運算:
def corr2D(x,k): hight , width = k.shape y = nd.zeros((x.shape[0] - hight + 1 , x.shape[1] - width + 1)) for i in range(y.shape[0]): for j in range(y.shape[1]): y[i,j] = (x[i:i+hight,j:j+width]*k).sum() return y
x = nd.array([[0,1,2],[3,4,5],[6,7,8]]) k = nd.array([[0,1],[2,3]]) y = corr2D(x,k) y
結果是:
[[19. 25.] [37. 43.]] <NDArray 2x2 @cpu(0)>
⼆維卷積層輸出的⼆維數組可以看作是輸⼊在空間維度(寬和⾼)上某⼀級的表征,也叫特征圖(featuremap)。影響元素
x的前向計算的所有可能輸⼊區域(可能⼤於輸⼊的實際尺⼨)叫做x
的感受野(receptivefield)。我們使⽤⾼和寬為3的輸⼊與⾼和寬為2的卷積核得到⾼和寬為2的輸出。⼀般來說,假設輸⼊
形狀是nh×nw,卷積核窗口形狀是kh×kw,那么輸出形狀將會是:
(nh - kh + 1) * (nw - kw + 1)
填充(padding)是指在輸⼊⾼和寬的兩側填充元素(通常是0元素)。我們在原輸⼊⾼和寬的兩側分別添加了值為0
的元素,使得輸⼊⾼和寬從3變成了5,並導致輸出⾼和寬由2增加到4。
⼀般來說,如果在⾼的兩側⼀共填充ph⾏,在寬的兩側⼀共填充pw列,那么輸出形狀將會是
(nh - kh + ph + 1) * (nw - kw + pw + 1)
在很多情況下我們為了保證輸出和輸入形狀一樣,就會取ph = kh - 1 , pw = kw - 1 , 例如:當kh是奇數 就會在高的兩側加上ph/2行,當ph是偶數就會在兩側加上[ph-1]/2
行,所以我們卷積神經網絡的卷積核維數通常取得是奇數1, 3 , 5 , 7,這樣的話,在輸入網絡中兩側(上下)填充的維數就是一樣的
步幅(stride)
卷積窗口從輸⼊數組的最左上⽅開始,按從左往右、從上往下的順序,依次在輸⼊數組上滑動。我們將每次滑動的⾏數和列數稱為。
當高上的步幅是sh, 寬上的步幅是sw,則輸出形狀是:
[(nh-kh+ph+sh)/sh] * [(nw-kw+pw+sw)/sw]
通道channel:
彩色圖像除了長寬兩個維度外還有一個顏色維度(RGB),假設彩色圖像的寬w和高h(像素),那么他在內存中可以表示為3*h*w的多維數組。我們把這個3的這一維度稱為通道維。
當輸⼊數據含多個通道時,我們需要構造⼀個輸⼊通道數與輸⼊數據的通道數相同的卷積核,從而能夠與含多通道的輸⼊數據做互相關運算。假設輸⼊數據的通道數為ci,那么卷積核的輸⼊通道數同樣為ci。設卷積核窗口形狀為kh×kw。當ci=1時,我們知道卷積核只包含⼀個形狀為kh×kw的⼆維數組。當ci>1時,我們將會為每個輸⼊通道各分配⼀個形狀為kh×kw的核數組。把這ci個數組在輸⼊通道維上連結,即得到⼀個形狀為ci×kh×kw的卷積核。由於輸⼊和卷積核各有ci個通道,我們可以在各個通道上對輸⼊的⼆維數組和卷積核的⼆維核數組做互相關運算,再將這ci個互相關運算的⼆維輸出按通道相加,得到⼀個⼆維數組。這就是含多個通道的輸⼊數據與多輸⼊通道的卷積核做⼆維相關運算的輸出。
圖展⽰了含2個輸⼊通道的⼆維互相關計算的例⼦。在每個通道上,⼆維輸⼊數組與⼆維核數組做互相關運算,再按通道相加即得到輸出。圖5.4中陰影部分為第⼀個輸出元素及其計算所使⽤的輸⼊和核數組元素:(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56。
如下圖展⽰了使⽤輸⼊通道數為3、輸出通道數為2的1×1卷積核的互相關計算。值得注意的是,輸⼊和輸出具有相同的⾼和寬。輸出中的每個元素來⾃輸⼊中在⾼和寬上相同位置的元素在不同通道之間的按權重累加。假設我們將通道維當做是特征維,將⾼和寬維度上的元素當成數據樣本,那么1×1卷積層的作⽤與全連接層等價。
在之后的模型⾥我們將會看到1×1卷積層被當做保持⾼和寬維度形狀不變的全連接層使⽤。於是,我們可以通過調整⽹絡層之間的通道數來控制模型復雜度。