當前位置:編程學習大全網 - 源碼下載 - 卷積神經網絡

卷積神經網絡

1、二維互相關運算

二維互相關(cross-correlation)運算的輸入是壹個二維輸入數組和壹個二維核(kernel)數組,輸出也是壹個二維數組,其中核數組通常稱為卷積核或過濾器(filter)。卷積核的尺寸通常小於輸入數組,卷積核在輸入數組上滑動,在每個位置上,卷積核與該位置處的輸入子數組按元素相乘並求和,得到輸出數組中相應位置的元素。圖1展示了壹個互相關運算的例子,陰影部分分別是輸入的第壹個計算區域、核數組以及對應的輸出。

2、二維卷積層

卷積層得名於卷積運算,但卷積層中用到的並非卷積運算而是互相關運算。我們將核數組上下翻轉、左右翻轉,再與輸入數組做互相關運算,這壹過程就是卷積運算。由於卷積層的核數組是可學習的,所以使用互相關運算與使用卷積運算並無本質區別。

二維卷積層將輸入和卷積核做互相關運算,並加上壹個標量偏置來得到輸出。卷積層的模型參數包括卷積核和標量偏置。

3、特征圖與感受野

二維卷積層輸出的二維數組可以看作是輸入在空間維度(寬和高)上某壹級的表征,也叫特征圖(feature map)。影響元素x的前向計算的所有可能輸入區域(可能大於輸入的實際尺寸)叫做x的感受野(receptive field)。

以圖1為例,輸入中陰影部分的四個元素是輸出中陰影部分元素的感受野。我們將圖中形狀為2×2的輸出記為Y,將Y與另壹個形狀為2×2的核數組做互相關運算,輸出單個元素z。那麽,z在Y上的感受野包括Y的全部四個元素,在輸入上的感受野包括其中全部9個元素。可見,我們可以通過更深的卷積神經網絡使特征圖中單個元素的感受野變得更加廣闊,從而捕捉輸入上更大尺寸的特征。

4、填充和步幅

我們介紹卷積層的兩個超參數,即填充和步幅,它們可以對給定形狀的輸入和卷積核改變輸出形狀。

4.1 填充(padding)

是指在輸入高和寬的兩側填充元素(通常是0元素),圖2裏我們在原輸入高和寬的兩側分別添加了值為0的元素。

如果原輸入的高和寬是 和 ,卷積核的高和寬是 和 ,在高的兩側壹***填充 行,在寬的兩側壹***填充 列,則輸出形狀為:

? )

我們在卷積神經網絡中使用奇數高寬的核,比如3×3,5×5的卷積核,對於高度(或寬度)為大小為2k+1的核,令步幅為1,在高(或寬)兩側選擇大小為k的填充,便可保持輸入與輸出尺寸相同。

4.2 步幅(stride)

在互相關運算中,卷積核在輸入數組上滑動,每次滑動的行數與列數即是步幅(stride)。此前我們使用的步幅都是1,圖3展示了在高上步幅為3、在寬上步幅為2的二維互相關運算。

壹般來說,當高上步幅為 ,寬上步幅為 時,輸出形狀為:

?

如果? ,那麽輸出形狀將簡化為:

?

更進壹步,如果輸入的高和寬能分別被高和寬上的步幅整除,那麽輸出形狀將是:(nh/sh)×(nw/sw)

?

當 時,我們稱填充為p;當 時,我們稱步幅為s。

5、多輸入通道和多輸出通道

之前的輸入和輸出都是二維數組,但真實數據的維度經常更高。例如,彩色圖像在高和寬2個維度外還有RGB(紅、綠、藍)3個顏色通道。假設彩色圖像的高和寬分別是h和w(像素),那麽它可以表示為壹個3×h×w的多維數組,我們將大小為3的這壹維稱為通道(channel)維。

5.1 多輸入通道

卷積層的輸入可以包含多個通道,圖4展示了壹個含2個輸入通道的二維互相關計算的例子。

5.2?多輸出通道

卷積層的輸出也可以包含多個通道,設卷積核輸入通道數和輸出通道數分別為ci和co,高和寬分別為kh和kw。如果希望得到含多個通道的輸出,我們可以為每個輸出通道分別創建形狀為ci×kh×kw的核數組,將它們在輸出通道維上連結,卷積核的形狀即co×ci×kh×kw。

對於輸出通道的卷積核,我們提供這樣壹種理解,壹個ci×kh×kw的核數組可以提取某種局部特征,但是輸入可能具有相當豐富的特征,我們需要有多個這樣的ci×kh×kw的核數組,不同的核數組提取的是不同的特征。

5.3 1x1卷積層

最後討論形狀為1×1的卷積核,我們通常稱這樣的卷積運算為1×1卷積,稱包含這種卷積核的卷積層為1×1卷積層。圖5展示了使用輸入通道數為3、輸出通道數為2的1×1卷積核的互相關計算。

1×1卷積核可在不改變高寬的情況下,調整通道數。1×1卷積核不識別高和寬維度上相鄰元素構成的模式,其主要計算發生在通道維上。假設我們將通道維當作特征維,將高和寬維度上的元素當成數據樣本,那麽1×1卷積層的作用與全連接層等價。

6、卷積層與全連接層的對比

二維卷積層經常用於處理圖像,與此前的全連接層相比,它主要有兩個優勢:

壹是全連接層把圖像展平成壹個向量,在輸入圖像上相鄰的元素可能因為展平操作不再相鄰,網絡難以捕捉局部信息。而卷積層的設計,天然地具有提取局部信息的能力。

二是卷積層的參數量更少。不考慮偏置的情況下,壹個形狀為(ci,co,h,w)的卷積核的參數量是ci×co×h×w,與輸入圖像的寬高無關。假如壹個卷積層的輸入和輸出形狀分別是(c1,h1,w1)和(c2,h2,w2),如果要用全連接層進行連接,參數數量就是c1×c2×h1×w1×h2×w2。使用卷積層可以以較少的參數數量來處理更大的圖像。

X=torch.rand(4,2,3,5)

print(X.shape)

conv2d=nn.Conv2d(in_channels=2,out_channels=3,kernel_size=(3,5),stride=1,padding=(1,2))

Y=conv2d(X)

print('Y.shape: ',Y.shape)

print('weight.shape: ',conv2d.weight.shape)

print('bias.shape: ',conv2d.bias.shape)

輸出:

torch.Size([4, 2, 3, 5])

Y.shape:? torch.Size([4, 3, 3, 5])

weight.shape:? torch.Size([3, 2, 3, 5])

bias.shape:? torch.Size([3])

7、池化

7.1 二維池化層

池化層主要用於緩解卷積層對位置的過度敏感性。同卷積層壹樣,池化層每次對輸入數據的壹個固定形狀窗口(又稱池化窗口)中的元素計算輸出,池化層直接計算池化窗口內元素的最大值或者平均值,該運算也分別叫做最大池化或平均池化。圖6展示了池化窗口形狀為2×2的最大池化。

二維平均池化的工作原理與二維最大池化類似,但將最大運算符替換成平均運算符。池化窗口形狀為p×q的池化層稱為p×q池化層,其中的池化運算叫作p×q池化。

池化層也可以在輸入的高和寬兩側填充並調整窗口的移動步幅來改變輸出形狀。池化層填充和步幅與卷積層填充和步幅的工作機制壹樣。

在處理多通道輸入數據時,池化層對每個輸入通道分別池化,但不會像卷積層那樣將各通道的結果按通道相加。這意味著池化層的輸出通道數與輸入通道數相等。

CNN網絡中另外壹個不可導的環節就是Pooling池化操作,因為Pooling操作使得feature map的尺寸變化,假如做2×2的池化,假設那麽第l+1層的feature map有16個梯度,那麽第l層就會有64個梯度,這使得梯度無法對位的進行傳播下去。其實解決這個問題的思想也很簡單,就是把1個像素的梯度傳遞給4個像素,但是需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的。

7.2?mean pooling

mean pooling的前向傳播就是把壹個patch中的值求取平均來做pooling,那麽反向傳播的過程也就是把某個元素的梯度等分為n份分配給前壹層,這樣就保證池化前後的梯度(殘差)之和保持不變,還是比較理解的,圖示如下:

mean pooling比較容易讓人理解錯的地方就是會簡單的認為直接把梯度復制N遍之後直接反向傳播回去,但是這樣會造成loss之和變為原來的N倍,網絡是會產生梯度爆炸的。

7.3?max pooling

max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳遞給後壹層,而其他像素的值直接被舍棄掉。那麽反向傳播也就是把梯度直接傳給前壹層某壹個像素,而其他像素不接受梯度,也就是為0。所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id。

源碼中有壹個max_idx_的變量,這個變量就是記錄最大值所在位置的,因為在反向傳播中要用到,那麽假設前向傳播和反向傳播的過程就如下圖所示。

7.4 Pytorch 實現池化層

我們使用Pytorch中的nn.MaxPool2d實現最大池化層,關註以下構造函數參數:

kernel_size?– the size of the window to take a max over

stride?– the stride of the window. Default value is kernel_size

padding?– implicit zero padding to be added on both sides

forward函數的參數為壹個四維張量,形狀為 ,返回值也是壹個四維張量,形狀為 ,其中N是批量大小,C,H,W分別表示通道數、高度、寬度。

X=torch.arange(32,dtype=torch.float32).view(1,2,4,4)

pool2d=nn.MaxPool2d(kernel_size=3,padding=1,stride=(2,1))

Y=pool2d(X)

print(X)

print(Y)

練習

1、假如妳用全連接層處理壹張256 \times 256256×256的彩色(RGB)圖像,輸出包含1000個神經元,在使用偏置的情況下,參數數量是:

?答:圖像展平後長度為3×256×256,權重參數和偏置參數的數量是3× 256× 256 × 1000 + 1000 =196609000。

2、假如妳用全連接層處理壹張256×256的彩色(RGB)圖像,卷積核的高寬是3×3,輸出包含10個通道,在使用偏置的情況下,這個卷積層***有多少個參數:

答:輸入通道數是3,輸出通道數是10,所以參數數量是10×3×3×3+10=280。

3、conv2d = nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, padding=2),輸入壹張形狀為3×100×100的圖像,輸出的形狀為:

答:輸出通道數是4,上下兩側總***填充4行,卷積核高度是3,所以輸出的高度是104 - 3 + 1=102104?3+1=102,寬度同理可得。

4、關於卷積層,以下哪種說法是錯誤的:

A.1×1卷積可以看作是通道維上的全連接

B.某個二維卷積層用於處理形狀為3×100×100的輸入,則該卷積層無法處理形狀為3×256×256的輸入

C.卷積層通過填充、步幅、輸入通道數、輸出通道數等調節輸出的形狀

D .兩個連續的3×3卷積核的感受野與壹個5×5卷積核的感受野相同

答:選B,對於高寬維度,只要輸入的高寬(填充後的)大於或等於卷積核的高寬即可進行計算。

the first layer is a 3 × 3 convolution, the second is a fully connected layer on top of the 3 × 3 output grid of the first layer (see Figure 1). Sliding this small network over the input activation grid boils down to replacing the 5 × 5 convolution with two layers of 3 × 3 convolution.

我們假設圖片是5*5的

我們使用5*5的卷積核對其卷積,步長為1,得到的結果是:(5-5)/1+1=1

然後我們使用2個卷積核為3*3的,這裏的兩個是指2層:

第壹層3*3:

得到的結果是(5-3)/1+1=3

第二層3*3:

得到的結果是(3-3)/1+1=1

所以我們的最終得到結果感受野大小和用5*5的卷積核得到的結果大小是壹樣的!!!

5、關於池化層,以下哪種說法是錯誤的:

A.池化層不參與反向傳播

B.池化層沒有模型參數

C.池化層通常會減小特征圖的高和寬

D.池化層的輸入和輸出具有相同的通道數

答:A

選項1:錯誤,池化層有參與模型的正向計算,同樣也會參與反向傳播

選項2:正確,池化層直接對窗口內的元素求最大值或平均值,並沒有模型參數參與計算

選項3:正確

選項4:正確

參考文獻:

/

/question/265791259/answer/298610437

/zouxiaolv/article/details/97366681

  • 上一篇:NBA歷史上有沒有作為黑馬,最後奪得冠軍的球隊?
  • 下一篇:影視軟件哪個好?
  • copyright 2024編程學習大全網