動手學pytorch 卷積神經網路基礎

2022-08-21 00:45:14 字數 3881 閱讀 1339

1.二維卷積層

2.填充和步幅

3.多輸入通道和多輸出通道

4.卷積層與全連線層的對比

5.池化

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

圖1 二維互相關運算

特徵圖與感受野

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

以圖1為例,輸入中陰影部分的四個元素是輸出中陰影部分元素的感受野。將圖中形狀為\(2 \times 2\)的輸出記為\(y\),將\(y\)與另乙個形狀為\(2 \times 2\)的核陣列做互相關運算,輸出單個元素\(z\)。那麼,\(z\)在\(y\)上的感受野包括\(y\)的全部四個元素,在輸入上的感受野包括其中全部9個元素。可見,可以通過更深的卷積神經網路使特徵圖中單個元素的感受野變得更加廣闊,從而捕捉輸入上更大尺寸的特徵。

填充(padding)是指在輸入高和寬的兩側填充元素(通常是0元素),圖2裡在原輸入高和寬的兩側分別新增了值為0的元素。

圖2 在輸入的高和寬兩側分別填充了0元素的二維互相關計算

如果原輸入的高和寬是\(n_h\)和\(n_w\),卷積核的高和寬是\(k_h\)和\(k_w\),在高的兩側一共填充\(p_h\)行,在寬的兩側一共填充\(p_w\)列,則輸出形狀為:

\[(n_h+p_h-k_h+1)\times(n_w+p_w-k_w+1)

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

圖3 高和寬上步幅分別為3和2的二維互相關運算

一般來說,當高上步幅為\(s_h\),寬上步幅為\(s_w\)時,輸出形狀為:

\[\lfloor(n_h+p_h-k_h+s_h)/s_h\rfloor \times \lfloor(n_w+p_w-k_w+s_w)/s_w\rfloor

\]如果\(p_h=k_h-1\),\(p_w=k_w-1\),那麼輸出形狀將簡化為\(\lfloor(n_h+s_h-1)/s_h\rfloor \times \lfloor(n_w+s_w-1)/s_w\rfloor\)。更進一步,如果輸入的高和寬能分別被高和寬上的步幅整除,那麼輸出形狀將是\((n_h / s_h) \times (n_w/s_w)\)。

當\(p_h = p_w = p\)時,稱填充為\(p\);當\(s_h = s_w = s\)時,稱步幅為\(s\)。

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

多輸入通道

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

圖4 含2個輸入通道的互相關計算

假設輸入資料的通道數為\(c_i\),卷積核形狀為\(k_h\times k_w\),為每個輸入通道各分配乙個形狀為\(k_h\times k_w\)的核陣列,將\(c_i\)個互相關運算的二維輸出按通道相加,得到乙個二維陣列作為輸出。把\(c_i\)個核陣列在通道維上鏈結,即得到乙個形狀為\(c_i\times k_h\times k_w\)的卷積核。

多輸出通道

卷積層的輸出也可以包含多個通道,設卷積核輸入通道數和輸出通道數分別為\(c_i\)和\(c_o\),高和寬分別為\(k_h\)和\(k_w\)。如果希望得到含多個通道的輸出,可以為每個輸出通道分別建立形狀為\(c_i\times k_h\times k_w\)的核陣列,將它們在輸出通道維上鏈結,卷積核的形狀即\(c_o\times c_i\times k_h\times k_w\)。

對於輸出通道的卷積核,提供這樣一種理解,乙個\(c_i \times k_h \times k_w\)的核陣列可以提取某種區域性特徵,但是輸入可能具有相當豐富的特徵,需要有多個這樣的\(c_i \times k_h \times k_w\)的核陣列,不同的核陣列提取的是不同的特徵。

1x1卷積層

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

圖5 1x1卷積核的互相關計算。輸入和輸出具有相同的高和寬

\(1 \times 1\)卷積核可在不改變高寬的情況下,調整通道數。\(1 \times 1\)卷積核不識別高和寬維度上相鄰元素構成的模式,其主要計算發生在通道維上。假設將通道維當作特徵維,將高和寬維度上的元素當成資料樣本,那麼\(1\times 1\)卷積層的作用與全連線層等價。

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

一是全連線層把影象展平成乙個向量,在輸入影象上相鄰的元素可能因為展平操作不再相鄰,網路難以捕捉區域性資訊。而卷積層的設計,天然地具有提取區域性資訊的能力。

二是卷積層的參數量更少。不考慮偏置的情況下,乙個形狀為\((c_i, c_o, h, w)\)的卷積核的參數量是\(c_i \times c_o \times h \times w\),與輸入影象的寬高無關。假如乙個卷積層的輸入和輸出形狀分別是\((c_1, h_1, w_1)\)和\((c_2, h_2, w_2)\),如果要用全連線層進行連線,引數數量就是\(c_1 \times c_2 \times h_1 \times w_1 \times h_2 \times w_2\)。使用卷積層可以以較少的引數數量來處理更大的影象。

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

圖6 池化視窗形狀為 2 x 2 的最大池化

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

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

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

卷積神經網路 pytorch

vocab args.vocab size 已知詞的數量 dim args.embed dim 每個詞向量長度 cla args.class num 類別數 ci 1 輸入的channel數 knum args.kernel num 每種卷積核的數量 ks args.kernel sizes 卷積核...

Pytorch 卷積神經網路

一般而言,輸入層的大小應該能夠被2整除很多次,常用32,64,96,224 盡可能使用小尺寸的濾波器,例如3 3,滑動步長選擇1。需要對輸入資料體進行零填充,保證輸出和輸入一樣的空間大小 對輸入資料空間進行下取樣 不使用的話,會導致影象邊緣資訊過快地損失掉 沒有人能在一開始就想清楚,只有開始做了,你...

動手學pytorch 語言模型

假設序列 w 1,w 2,ldots,w t 中的每個詞是依次生成的,我們有 begin p w 1,w 2,ldots,w t prod t p w t mid w 1,ldots,w p w 1 p w 2 mid w 1 cdots p w t mid w 1w 2 cdots w end 例...