① 卷積神經網路
關於花書中卷積網路的筆記記錄於 https://www.jianshu.com/p/5a3c90ea0807 。
卷積神經網路(Convolutional Neural Network,CNN或ConvNet)是一種具有 局部連接、權重共享 等特性的深層前饋神經網路。卷積神經網路是受生物學上感受野的機制而提出。 感受野(Receptive Field) 主要是指聽覺、視覺等神經系統中一些神經元的特性,即 神經元只接受其所支配的刺激區域內的信號 。
卷積神經網路最早是主要用來處理圖像信息。如果用全連接前饋網路來處理圖像時,會存在以下兩個問題:
目前的卷積神經網路一般是由卷積層、匯聚層和全連接層交叉堆疊而成的前饋神經網路,使用反向傳播演算法進行訓練。 卷積神經網路有三個結構上的特性:局部連接,權重共享以及匯聚 。這些特性使卷積神經網路具有一定程度上的平移、縮放和旋轉不變性。
卷積(Convolution)是分析數學中一種重要的運算。在信號處理或圖像處理中,經常使用一維或二維卷積。
一維卷積經常用在信號處理中,用於計算信號的延遲累積。假設一個信號發生器每個時刻t 產生一個信號 ,其信息的衰減率為 ,即在 個時間步長後,信息為原來的 倍。假設 ,那麼在時刻t收到的信號 為當前時刻產生的信息和以前時刻延遲信息的疊加:
我們把 稱為 濾波器(Filter)或卷積核(Convolution Kernel) 。假設濾波器長度為 ,它和一個信號序列 的卷積為:
信號序列 和濾波器 的卷積定義為:
一般情況下濾波器的長度 遠小於信號序列長度 ,下圖給出一個一維卷積示例,濾波器為 :
二維卷積經常用在圖像處理中。因為圖像為一個兩維結構,所以需要將一維卷積進行擴展。給定一個圖像 和濾波器 ,其卷積為:
下圖給出一個二維卷積示例:
注意這里的卷積運算並不是在圖像中框定卷積核大小的方框並將各像素值與卷積核各個元素相乘並加和,而是先把卷積核旋轉180度,再做上述運算。
在圖像處理中,卷積經常作為特徵提取的有效方法。一幅圖像在經過卷積操作後得到結果稱為 特徵映射(Feature Map) 。
最上面的濾波器是常用的高斯濾波器,可以用來對圖像進行 平滑去噪 ;中間和最下面的過濾器可以用來 提取邊緣特徵 。
在機器學習和圖像處理領域,卷積的主要功能是在一個圖像(或某種特徵)上滑動一個卷積核(即濾波器),通過卷積操作得到一組新的特徵。在計算卷積的過程中,需要進行卷積核翻轉(即上文提到的旋轉180度)。 在具體實現上,一般會以互相關操作來代替卷積,從而會減少一些不必要的操作或開銷。
互相關(Cross-Correlation)是一個衡量兩個序列相關性的函數,通常是用滑動窗口的點積計算來實現 。給定一個圖像 和卷積核 ,它們的互相關為:
互相關和卷積的區別僅在於卷積核是否進行翻轉。因此互相關也可以稱為不翻轉卷積 。當卷積核是可學習的參數時,卷積和互相關是等價的。因此,為了實現上(或描述上)的方便起見,我們用互相關來代替卷積。事實上,很多深度學習工具中卷積操作其實都是互相關操作。
在卷積的標準定義基礎上,還可以引入濾波器的 滑動步長 和 零填充 來增加卷積多樣性,更靈活地進行特徵抽取。
濾波器的步長(Stride)是指濾波器在滑動時的時間間隔。
零填充(Zero Padding)是在輸入向量兩端進行補零。
假設卷積層的輸入神經元個數為 ,卷積大小為 ,步長為 ,神經元兩端各填補 個零,那麼該卷積層的神經元數量為 。
一般常用的卷積有以下三類:
因為卷積網路的訓練也是基於反向傳播演算法,因此我們重點關注卷積的導數性質:
假設 。
, , 。函數 為一個標量函數。
則由 有:
可以看出, 關於 的偏導數為 和 的卷積 :
同理得到:
當 或 時, ,即相當於對 進行 的零填充。從而 關於 的偏導數為 和 的寬卷積 。
用互相關的「卷積」表示,即為(注意 寬卷積運算具有交換性性質 ):
在全連接前饋神經網路中,如果第 層有 個神經元,第 層有 個神經元,連接邊有 個,也就是權重矩陣有 個參數。當 和 都很大時,權重矩陣的參數非常多,訓練的效率會非常低。
如果採用卷積來代替全連接,第 層的凈輸入 為第 層活性值 和濾波器 的卷積,即:
根據卷積的定義,卷積層有兩個很重要的性質:
由於局部連接和權重共享,卷積層的參數只有一個m維的權重 和1維的偏置 ,共 個參數。參數個數和神經元的數量無關。此外,第 層的神經元個數不是任意選擇的,而是滿足 。
卷積層的作用是提取一個局部區域的特徵,不同的卷積核相當於不同的特徵提取器。
特徵映射(Feature Map)為一幅圖像(或其它特徵映射)在經過卷積提取到的特徵,每個特徵映射可以作為一類抽取的圖像特徵。 為了提高卷積網路的表示能力,可以在每一層使用多個不同的特徵映射,以更好地表示圖像的特徵。
在輸入層,特徵映射就是圖像本身。如果是灰度圖像,就是有一個特徵映射,深度 ;如果是彩色圖像,分別有RGB三個顏色通道的特徵映射,深度 。
不失一般性,假設一個卷積層的結構如下:
為了計算輸出特徵映射 ,用卷積核 分別對輸入特徵映射 進行卷積,然後將卷積結果相加,並加上一個標量偏置 得到卷積層的凈輸入 再經過非線性激活函數後得到輸出特徵映射 。
在輸入為 ,輸出為 的卷積層中,每個輸出特徵映射都需要 個濾波器以及一個偏置。假設每個濾波器的大小為 ,那麼共需要 個參數。
匯聚層(Pooling Layer)也叫子采樣層(Subsampling Layer),其作用是進行特徵選擇,降低特徵數量,並從而減少參數數量。
常用的匯聚函數有兩種:
其中 為區域 內每個神經元的激活值。
可以看出,匯聚層不但可以有效地減少神經元的數量,還可以使得網路對一些小的局部形態改變保持不變性,並擁有更大的感受野。
典型的匯聚層是將每個特徵映射劃分為 大小的不重疊區域,然後使用最大匯聚的方式進行下采樣。匯聚層也可以看做是一個特殊的卷積層,卷積核大小為 ,步長為 ,卷積核為 函數或 函數。過大的采樣區域會急劇減少神經元的數量,會造成過多的信息損失。
一個典型的卷積網路是由卷積層、匯聚層、全連接層交叉堆疊而成。
目前常用卷積網路結構如圖所示,一個卷積塊為連續 個卷積層和 個匯聚層( 通常設置為 , 為 或 )。一個卷積網路中可以堆疊 個連續的卷積塊,然後在後面接著 個全連接層( 的取值區間比較大,比如 或者更大; 一般為 )。
目前,整個網路結構 趨向於使用更小的卷積核(比如 和 )以及更深的結構(比如層數大於50) 。此外,由於卷積的操作性越來越靈活(比如不同的步長),匯聚層的作用變得也越來越小,因此目前比較流行的卷積網路中, 匯聚層的比例也逐漸降低,趨向於全卷積網路 。
在全連接前饋神經網路中,梯度主要通過每一層的誤差項 進行反向傳播,並進一步計算每層參數的梯度。在卷積神經網路中,主要有兩種不同功能的神經層:卷積層和匯聚層。而參數為卷積核以及偏置,因此 只需要計算卷積層中參數的梯度。
不失一般性,第 層為卷積層,第 層的輸入特徵映射為 ,通過卷積計算得到第 層的特徵映射凈輸入 ,第 層的第 個特徵映射凈輸入
由 得:
同理可得,損失函數關於第 層的第 個偏置 的偏導數為:
在卷積網路中,每層參數的梯度依賴其所在層的誤差項 。
卷積層和匯聚層中,誤差項的計算有所不同,因此我們分別計算其誤差項。
第 層的第 個特徵映射的誤差項 的具體推導過程如下:
其中 為第 層使用的激活函數導數, 為上采樣函數(upsampling),與匯聚層中使用的下采樣操作剛好相反。如果下采樣是最大匯聚(max pooling),誤差項 中每個值會直接傳遞到上一層對應區域中的最大值所對應的神經元,該區域中其它神經元的誤差項的都設為0。如果下采樣是平均匯聚(meanpooling),誤差項 中每個值會被平均分配到上一層對應區域中的所有神經元上。
第 層的第 個特徵映射的誤差項 的具體推導過程如下:
其中 為寬卷積。
LeNet-5雖然提出的時間比較早,但是是一個非常成功的神經網路模型。基於LeNet-5 的手寫數字識別系統在90年代被美國很多銀行使用,用來識別支票上面的手寫數字。LeNet-5 的網路結構如圖:
不計輸入層,LeNet-5共有7層,每一層的結構為:
AlexNet是第一個現代深度卷積網路模型,其首次使用了很多現代深度卷積網路的一些技術方法,比如採用了ReLU作為非線性激活函數,使用Dropout防止過擬合,使用數據增強來提高模型准確率等。AlexNet 贏得了2012 年ImageNet 圖像分類競賽的冠軍。
AlexNet的結構如圖,包括5個卷積層、3個全連接層和1個softmax層。因為網路規模超出了當時的單個GPU的內存限制,AlexNet 將網路拆為兩半,分別放在兩個GPU上,GPU間只在某些層(比如第3層)進行通訊。
AlexNet的具體結構如下:
在卷積網路中,如何設置卷積層的卷積核大小是一個十分關鍵的問題。 在Inception網路中,一個卷積層包含多個不同大小的卷積操作,稱為Inception模塊。Inception網路是由有多個inception模塊和少量的匯聚層堆疊而成 。
v1版本的Inception模塊,採用了4組平行的特徵抽取方式,分別為1×1、3× 3、5×5的卷積和3×3的最大匯聚。同時,為了提高計算效率,減少參數數量,Inception模塊在進行3×3、5×5的卷積之前、3×3的最大匯聚之後,進行一次1×1的卷積來減少特徵映射的深度。如果輸入特徵映射之間存在冗餘信息, 1×1的卷積相當於先進行一次特徵抽取 。
② 卷積神經網路
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:正確
參考文獻:
https://www.boyuai.com/
https://blog.csdn.net/qq_21578849/article/details/94667699
https://www.hu.com/question/265791259/answer/298610437
https://blog.csdn.net/zouxiaolv/article/details/97366681
③ 用卷積神經網路提取圖像特徵
前面講到的都是基於知識的圖像特徵提取方法,除此之外還有另一條技術路線——基於深度學習的圖像特徵提取。
人在認知圖像時是分層抽象的,首先理解的是顏色和亮度,然後是邊緣、角點、直線等局部細節特徵,接下來是紋理、幾何形狀等更復雜的信息和結構,最後形成整個物體的概念。
視覺神經科學(Visual Neuroscience)對於視覺機理的研究驗證了這一結論,動物大腦的視覺皮層具有分層結構。眼睛將看到的景象成像在視網膜上,視網膜把光學信號轉換成電信號,傳遞到大腦的視覺皮層(Visual cortex),視覺皮層是大腦中負責處理視覺信號的部分。1959年,David和Wiesel進行了一次實驗,他們在貓的大腦初級視覺皮層內插入電極,在貓的眼前展示各種形狀、空間位置、角度的光帶,然後測量貓大腦神經元放出的電信號。實驗發現,不同的宏盯神經元對各種空間位置和方向偏好不同。這一成果後來讓他們獲得了諾貝爾獎。
目前已經證明,視覺皮層具有層次結構。從視網膜傳來的信號首先到達初級視覺皮層(primary visual cortex),即V1皮層。V1皮層簡單神經元對一些細節、特定方向的圖像信號敏感。V1皮層處理之後,將信號傳導到V2皮層。V2皮層將邊緣和輪廓信息表示成簡單形狀,然後由V4皮層中的神經元進行處理,它顏色信息敏感。復雜物體最終在IT皮層(inferior temporal cortex)被表示出來。
卷積神經網路可以看成是上面這種機制的簡單模仿。它由多個卷積層構成,每個卷積層包含多個卷積核,用這些卷積核從左向右、從上往下依次掃描整個圖像,得到稱為特徵圖(feature map)的輸出數據。網路前面的卷積層捕捉圖像局部、細節信息,有小的感受野,即輸出圖像的每個像素只利用輸入圖像很小的一個范圍。後面的卷積層感受野逐層加大,用於捕獲圖猜絕岩像更復雜,更抽象的信息。經過多個卷積層的運算,最後得到圖像在各個不同尺度的抽象表示。
顧名思義,卷積層由一組卷積單元(又稱"卷積核")組成,可以把這些卷積單元理解為過濾器,每個過濾器都會提取一種特定的特徵,方法參見 圖像卷積 。
卷積層的過濾器負責從圖像中查找規律,過濾器越多則參數越多,這意味著卷積層的維度可能很穗御龐大。我們需要一種方法來降低維數,這就是卷積網路中的池化層(又名"下采樣層")所扮的角色。
池化主要有3種形式:一般池化,重疊池化和金字塔池化。
池化窗口的尺寸為n*n,一般情況下池化窗口都是正方形的。步長(stride)等於n。此時池化窗口之間是沒有重疊的。對於超出數字矩陣范圍的,只計算范圍內的或者范圍外的用0填充再計算。又可以分為最大值池化,均值池化。
池化窗口范圍內的最大值作為采樣的輸出值。
假如輸入是一個4×4矩陣,執行最大池化是一個2×2矩陣,每次滑動2步。執行過程非常簡單,把4×4的輸入拆分成不同的區域,把這些區域用不同顏色來標記。對於2×2的輸出,輸出的每個元素都是其對應顏色區域中的最大元素值。
普通均值池化就是將池化窗口范圍內的平均值作為采樣的輸出值。這種池化不如最大池化常用。
池化窗口之間有重疊。也就是步長大於等於1小於n,計算和一般池化是一樣的。
空間金字塔池化(Spatial Pyramid Pooling,簡稱SPP)可以將尺寸大小不一樣的圖片轉換為同樣的尺寸。
SPP首先把圖片看成1塊,對這1塊進行最大值池化,得到1個值,分成4塊,對這4塊分別進行最大值池化,得到4個值;分成16塊,對這16塊分別進行最大值池化,得到16個值,以此類推。這樣就可以保證對於不同尺寸的圖片而言,最終得到的值的個數是一樣的。因為是最大值池化,超出范圍的用不用0填充不會影響結果。
直接對原始圖像做卷積,會存在兩個問題。一是每次卷積後圖像(特徵圖)都會縮小,這樣卷不了幾次就沒了; 二是相比於圖片中間的點,圖片邊緣的點在卷積中被計算的次數很少,導致邊緣的信息易於丟失。
為了解決這個問題,我們可以採用填充的方法。我們每次卷積前,先給圖片周圍都補一圈空白,讓卷積之後圖片跟原來一樣大,同時,原來的邊緣也被計算了更多次。
比如,我們把(8,8)的圖片給補成(10,10),那麼經過(3,3)的filter之後,就是(8,8),沒有變。
能夠保證輸入的數據和輸出的數據具有相同的空間尺寸,假設零填充個數為p,卷積核為f * f,卷積核滑動步長為s,則p應設置為
假設原始輸入圖像為m * m,輸出圖像為n * n,零填充個數為p,卷積核為f * f,卷積核滑動步長為s,則輸出尺寸為
假設輸入圖像為(m,m,d),其中d為圖像深度(通道數),卷積核為f * f,卷積核個數為n,則weight個數為
bias個數:
池化層很少使用零填充。假設原始輸入圖像為m * m,輸出圖像為n * n,卷積核為f * f,卷積核滑動步長為s,則輸出尺寸為
④ 34-卷積神經網路(Conv)
深度學習網路和普通神經網路的區別
全連接神經網路的缺點
卷積神經網路的錯誤率
卷積神經網路的發展歷程
卷積神經網路的結構
結構特點:
神經網路(neural networks)的基本組成包括輸入層、隱藏層、輸出層。而卷積神經網路的特點在於隱藏層分為卷積層和池化層(pooling layer,又叫下采樣層)。
卷積過程
糾正:卷積層的過濾器,就是一個矩陣,裡面的元素是對應掃描時每個像素點的權重
即:每個過濾器會產生一張feature map
0填充的兩種方式
卷積核在提取特徵映射時的動作稱之為padding(零填充),由於移動步長不一定能整出整張圖的像素寬度。其中有兩種方式,SAME和VALID
彩色圖片的卷積過程
由於彩色圖片有3個通道,即3張表,所以filter需要分3次去分別觀察,每次觀察的結果直接相加作為最後的結果
過濾器的個數
有幾個過濾器,就會生成幾張表。eg:
對於[28, 28, 1]的圖片,如果有32個過濾器,就會卷積的結果就為[28, 28, 32],相當於圖片被「拉長」了
觀察結果大小的計算
面試可能考
注意:如果計算結果出現小數,需要結合情況具體考慮,而不是說直接四捨五入
卷積的api
在卷積神經網路中,主要使用Relu函數作為激活函數
即在這里使用relu函數去掉了像素中小於0的值
神經網路中為什麼要使用激活函數
為什麼使用relu而不再使用sigmoid函數?
api
卷積就是進行特徵的提取,觀察更加仔細,然而,觀察仔細就意味著數據多,運算量增加,這就需要使用池化層以減少計算量
Pooling層主要的作用是特徵提取,通過去掉Feature Map中不重要的樣本,進一步減少參數數量。Pooling的方法很鄭扒多,最常用的是Max Pooling。
池化層也有一個窗口大小(過濾器)
即:池化過程遲叢洞讓圖片變得更「窄」
即:卷積層使得圖片變長,池化層使得圖片變窄,所以經過卷積,圖片越來越「細長」
api
池化中SAME的計算方式與卷積過程中SAME的計算方式一樣。eg:
[None, 28, 28, 32]的數據,經過2x2,步長為2,padding為SAME的池化,碼枯變成了[None, 14, 14, 32]
分析:前面的卷積和池化相當於做特徵工程,後面的全連接相當於做特徵加權。最後的全連接層在整個卷積神經網路中起到「分類器」的作用。
所以神經網路也相當於是一個特徵選擇的方式
⑤ 卷積神經網路
卷積神經網路 (Convolutional Neural Networks,CNN)是一種前饋神經網路。卷積神經網路是受生物學上感受野(Receptive Field)的機制而提出的。感受野主要是指聽覺系統、本體感覺系統和視覺系統中神經元的一些性質。比如在視覺神經系統中,一個神經元的感受野是指視網膜上的特定區域,只有這個區域內的刺激才能夠激活該神經元。
卷積神經網路又是怎樣解決這個問題的呢?主要有三個思路:
在使用CNN提取特徵時,到底使用哪一層的輸出作為最後的特徵呢?
答:倒數第二個全連接層的輸出才是最後我們要提取的特徵,也就是最後一個全連接層的輸入才是我們需要的特徵。
全連接層會忽視形狀。卷積層可以保持形狀不變。當輸入數據是圖像時,卷積層會以3維數據的形式接收輸入數據,並同樣以3維數據的形式輸出至下一層。因此,在CNN中,可以(有可能)正確理解圖像等具有形狀的數據。
CNN中,有時將 卷積層的輸入輸出數據稱為特徵圖(feature map) 。其中, 卷積層的輸入數據稱為輸入特徵圖(input feature map) , 輸出數據稱為輸出特徵圖(output feature map)。
卷積層進行的處理就是 卷積運算 。卷積運算相當於圖像處理中的「濾波器運算」。
濾波器相當於權重或者參數,濾波器數值都是學習出來的。 卷積層實現的是垂直邊緣檢測 。
邊緣檢測實際就是將圖像由亮到暗進行區分,即邊緣的過渡(edge transitions)。
卷積層對應到全連接層,左上角經過濾波器,得到的3,相當於一個神經元輸出為3.然後相當於,我們把輸入矩陣拉直為36個數據,但是我們只對其中的9個數據賦予了權重。
步幅為1 ,移動一個,得到一個1,相當於另一個神經單元的輸出是1.
並且使用的是同一個濾波器,對應到全連接層,就是權值共享。
在這個例子中,輸入數據是有高長方向的形狀的數據,濾波器也一樣,有高長方向上的維度。假設用(height, width)表示數據和濾波器的形狀,則在本例中,輸入大小是(4, 4),濾波器大小是(3, 3),輸出大小是(2, 2)。另外,有的文獻中也會用「核」這個詞來表示這里所說的「濾波器」。
對於輸入數據,卷積運算以一定間隔滑動濾波器的窗口並應用。這里所說的窗口是指圖7-4中灰色的3 × 3的部分。如圖7-4所示,將各個位置上濾
波器的元素和輸入的對應元素相乘,然後再求和(有時將這個計算稱為乘積累加運算)。然後,將這個結果保存到輸出的對應位置。將這個過程在所有位置都進行一遍,就可以得到卷積運算的輸出。
CNN中,濾波器的參數就對應之前的權重。並且,CNN中也存在偏置。
在進行卷積層的處理之前,有時要向輸入數據的周圍填入固定的數據(比如0等),這稱為填充(padding),是卷積運算中經常會用到的處理。比如,在圖7-6的例子中,對大小為(4, 4)的輸入數據應用了幅度為1的填充。「幅度為1的填充」是指用幅度為1像素的0填充周圍。
應用濾波器的位置間隔稱為 步幅(stride) 。
假設輸入大小為(H, W),濾波器大小為(FH, FW),輸出大小為(OH, OW),填充為P,步幅為S。
但是所設定的值必須使式(7.1)中的 和 分別可以除盡。當輸出大小無法除盡時(結果是小數時),需要採取報錯等對策。順便說一下,根據深度學習的框架的不同,當值無法除盡時,有時會向最接近的整數四捨五入,不進行報錯而繼續運行。
之前的卷積運算的例子都是以有高、長方向的2維形狀為對象的。但是,圖像是3維數據,除了高、長方向之外,還需要處理通道方向。
在3維數據的卷積運算中,輸入數據和濾波器的通道數要設為相同的值。
因此,作為4維數據,濾波器的權重數據要按(output_channel, input_channel, height, width)的順序書寫。比如,通道數為3、大小為5 × 5的濾
波器有20個時,可以寫成(20, 3, 5, 5)。
對於每個通道,均使用自己的權值矩陣進行處理,輸出時將多個通道所輸出的值進行加和即可。
卷積運算的批處理,需要將在各層間傳遞的數據保存為4維數據。具體地講,就是按(batch_num, channel, height, width)的順序保存數據。
這里需要注意的是,網路間傳遞的是4維數據,對這N個數據進行了卷積運算。也就是說,批處理將N次的處理匯總成了1次進行。
池化是縮小高、長方向上的空間的運算。比如,如圖7-14所示,進行將2 × 2的區域集約成1個元素的處理,縮小空間大小。
圖7-14的例子是按步幅2進行2 × 2的Max池化時的處理順序。「Max池化」是獲取最大值的運算,「2 × 2」表示目標區域的大小。如圖所示,從
2 × 2的區域中取出最大的元素。此外,這個例子中將步幅設為了2,所以2 × 2的窗口的移動間隔為2個元素。另外,一般來說,池化的窗口大小會和步幅設定成相同的值。比如,3 × 3的窗口的步幅會設為3,4 × 4的窗口的步幅會設為4等。
除了Max池化之外,還有Average池化等。相對於Max池化是從目標區域中取出最大值,Average池化則是計算目標區域的平均值。 在圖像識別領域,主要使用Max池化。 因此,本書中說到「池化層」時,指的是Max池化。
池化層的特徵
池化層有以下特徵。
沒有要學習的參數
池化層和卷積層不同,沒有要學習的參數。池化只是從目標區域中取最大值(或者平均值),所以不存在要學習的參數。
通道數不發生變化
經過池化運算,輸入數據和輸出數據的通道數不會發生變化。如圖7-15所示,計算是按通道獨立進行的。
對微小的位置變化具有魯棒性(健壯)
輸入數據發生微小偏差時,池化仍會返回相同的結果。因此,池化對輸入數據的微小偏差具有魯棒性。比如,3 × 3的池化的情況下,如圖
7-16所示,池化會吸收輸入數據的偏差(根據數據的不同,結果有可能不一致)。
經過卷積層和池化層之後,進行Flatten,然後丟到全連接前向傳播神經網路。
(找到一張圖片使得某個filter響應最大。相當於filter固定,未知的是輸入的圖片。)未知的是輸入的圖片???
k是第k個filter,x是我們要找的參數。?這里我不是很明白。我得理解應該是去尋找最具有代表性的特徵。
使用im2col來實現卷積層
卷積層的參數是需要學習的,但是池化層沒有參數需要學習。全連接層的參數需要訓練得到。
池化層不需要訓練參數。全連接層的參數最多。卷積核的個數逐漸增多。激活層的size,逐漸減少。
最大池化只是計算神經網路某一層的靜態屬性,沒有什麼需要學習的,它只是一個靜態屬性 。
像這樣展開之後,只需對展開的矩陣求各行的最大值,並轉換為合適的形狀即可(圖7-22)。
參數
• input_dim ― 輸入數據的維度:( 通道,高,長 )
• conv_param ― 卷積層的超參數(字典)。字典的關鍵字如下:
filter_num ― 濾波器的數量
filter_size ― 濾波器的大小
stride ― 步幅
pad ― 填充
• hidden_size ― 隱藏層(全連接)的神經元數量
• output_size ― 輸出層(全連接)的神經元數量
• weitght_int_std ― 初始化時權重的標准差
LeNet
LeNet在1998年被提出,是進行手寫數字識別的網路。如圖7-27所示,它有連續的卷積層和池化層(正確地講,是只「抽選元素」的子采樣層),最後經全連接層輸出結果。
和「現在的CNN」相比,LeNet有幾個不同點。第一個不同點在於激活函數。LeNet中使用sigmoid函數,而現在的CNN中主要使用ReLU函數。
此外,原始的LeNet中使用子采樣(subsampling)縮小中間數據的大小,而現在的CNN中Max池化是主流。
AlexNet
在LeNet問世20多年後,AlexNet被發布出來。AlexNet是引發深度學習熱潮的導火線,不過它的網路結構和LeNet基本上沒有什麼不同,如圖7-28所示。
AlexNet疊有多個卷積層和池化層,最後經由全連接層輸出結果。雖然結構上AlexNet和LeNet沒有大的不同,但有以下幾點差異。
• 激活函數使用ReLU。
• 使用進行局部正規化的LRN(Local Response Normalization)層。
• 使用Dropout
TF2.0實現卷積神經網路
valid意味著不填充,same是填充
or the SAME padding, the output height and width are computed as:
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))
And
For the VALID padding, the output height and width are computed as:
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
因此,我們可以設定 padding 策略。在 tf.keras.layers.Conv2D 中,當我們將 padding 參數設為 same 時,會將周圍缺少的部分使用 0 補齊,使得輸出的矩陣大小和輸入一致。
⑥ 深度卷積網路
LeNet網路的結構如下圖所示,可以看出,LeNet網路並沒有使用padding,每進行一次卷積,圖像的高度和寬度都會縮小,而通道數會一直增加。在全連接層中有400個節點,每個極點都有120個神經元,有時還會從這400個節點抽取一部分節點構建一個全連接層,即有兩個全連接層。在該網路中,最後一步就是利用84個特徵得到最後的輸出,該網路剛開始使用的是 sigmoid 函數 tanh 函數,而現在常常傾向於使用 softmax 函數。需要注意的是,LeNet-5網路進行圖像分類時,輸入的圖像是單通道的灰度圖像。
AlexNet是以論文第一作者的名字命名的,該網路的結構,如下圖所示,該網路的輸出層使用了 softmax 函數。AlexNet網路比LeNet網路規模更大,大約有6000萬個參數,用於訓練圖像和數據集時,能夠處理非常相似的基本構造模塊,這些模塊中包含著大量的隱藏單元,並且與LeNet網路不同的是,該網路使用了ReLu的激活函數。
VGG-16網路沒有太多的超參數,這是一種專注於構建卷積層的簡單網路。如下圖所示,該網路首先利用64個過濾器進行了兩次卷積,接著在池化層將輸入圖像壓縮,接著又是128個過濾器進行兩次卷積,接著載池化。繼續用256個過濾器進行3次卷積,再池化,接著再利用512個過濾器卷積3次,再池化,將稍後得到的特徵圖進行全連接操作,再進 softmax 激活。
由於存在梯度消失和梯度爆炸的原因,深層次的神經網路是很難訓練的,如果採用一種跳躍連接的方式,即從某一層網路層獲取激活,然後迅速反饋給另外一層,甚至是神經網路的更深層。這種利用跳躍連接構建的深度神經網路ResNets,深度能夠超過100層
一個簡單的兩層神經網路示例,如下圖所示:
常規的輸出和輸出之間的關系可以用如下的公式表示:
如上公式所述,這是一條神經網路的主路徑。如果將 的輸入直接到深層的激活函數之前,此時,神經網路有了一條副路徑,其對應輸出將有公式(5)變成如下所示的公式(6)
此時的輸入除了原先的輸入 外,多了一個 項,即由於 產生了一個殘差塊。
構建一個ResNet網路就是將很多這樣的殘差塊堆積在一起,形成一個深度神經網路,如下所示:
使用傳統的標准優化演算法訓練一個網路,隨著網路深度的增加,訓練誤差會先減小再增加,隨著網路層數的增加,優化演算法會越難以訓練,訓練誤差也會越來越多。但是,使用ResNet網路,能夠有效地避免這種情況。
如上所述,加入殘差網路之後,其輸出計算公式如公式(6)所示,展開這個公式,則有:
如果使用L2正則化或者權重衰減,則會壓縮權重參數 的值,如果參數 和參數 等於0,其輸出將由公式(7)變成 ,假定使用ReLU激活函數,則有:
由於殘差網路存在的這種跳躍連接,很容易得出以上等式,這意味著,即使給神經網路增加兩層,但是其效率並不遜色與更簡單的神經網路。並且由於存在以上恆等式,使得網路學習隱藏層的單元的信息更加容易。而普通網路,隨著網路層數的增加,學習參數會變得很困難。
此外,關於殘差網路,如公式(6)所示,假設 與 具有相同的維度,由於ResNets使用了許多same卷積, 的維度等於輸出層的維度。如果輸入和輸出具有不同的維度,可以再增加一個矩陣 ,使得 和 具有相同的維度。而 的維度可以通過0值填充調節。
在卷積網路的架構設計中,一種有趣的想法是會使用到1×1的過濾矩陣,實際上,對於單通道的圖像而言,1×1的過濾矩陣,意義不大,但是,對於多通道的圖像而言,1×1的過濾矩陣能夠有效減少圖像卷積之後的通道數量。
根據卷積和池化的基本知識,隨著神經網路層數的增加,圖像的通道數量會逐漸增加,採用1×1的過濾矩陣卷積之後,可以有效減少圖像的通道數量,一個簡單的示例,如下所示:
假設有一個6×6×32的圖片,使用1×1×32的過濾矩陣進行卷積運算,整個運算過程將會遍歷36個單元格,並計算過濾矩陣所覆蓋區域的元素積之和,將其應用到ReLu非線性函數,會得到一個輸出值。此計算過程中,可能會用到多個1×1×32的過濾器,那麼,通過以上計算會得到一個 6×6×過濾器數量 的矩陣。
構建卷積神經網路時,有時會很難決定過濾器的大小,而Inception網路的引入,卻能很好的解決這個問題。
Inception網路的作用就是代替人工確定選擇卷積層的過濾器類型。如下圖所示,對於一個多通道圖像,可以使用不同的過濾矩陣或者池化層,得到不同的輸出,將這些輸出堆積起來。
有了如上圖所示的Inception塊,最終輸出為32+32+64+128=256,而Inception模塊的輸入為28×28×192,其整個計算成本,以5×5的過濾矩陣為例,其乘法的計算次數為:28×28×32×5×5×192,整個計算次數超過了1.2億次。而如果使用如下所示的優化計算方法,則可以有效減少計算量。
如果利用1×1的過濾器,將輸入矩陣的通道減少至16,則可以有效減少計算量,如下所示:
如上圖所示的價格中,整個網路的運算次數為:28×28×192×16+28×28×32×5×5×16=1240萬,整個計算成本降低至原來的十分之一。而,通過1×1×192過濾器卷積得到的這個網路層被稱之為瓶頸層。
如上,所示,可以給每一個非1×1的卷積層之前,加入一個1×1的瓶頸層,就可以構建一個基本的inception模塊了,如下圖所示:
而一個inception網路就是多個Inception模塊連接起來,如下圖所示:
事實上,以上網路中,還存在一些分支,如編號1所示,這些分支就是全連接層,而全連接層之後就是一個softmax層用於預測。又如分支2所示,包含一些隱藏層(編號3),通過全連接層和softmax進行預測。這些分支結構能夠確保,即使是隱藏層和中間層也參與了特徵計算,並且也能夠預測圖片的分類。這種做法能夠有效避免網路過擬合。
對於計算機視覺領域而言,神經網路的訓練可能需要大量的數據,但是當數據量有限時,可以通過數據增強來實現數據量的擴充,以提高系統的魯棒性,具體的數據增強方法如下所示:
除了以上三種數據增強的方法外,更多的數據增強方法和實現可以參考 圖像數據增強
數據增強可以利用計算機多線程實現,一個線程用來實現載入數據,實現數據增強,其他線程可以訓練這些數據以加快整體的運算速度。
⑦ 卷積神經網路CNN(Convolutional Neural Network)
上圖計算過程為,首先我們可以將右邊進行卷積的可以稱為過濾器也可以叫做核,覆蓋到左邊第一個區域,然後分別按照對應位置相乘再相加,3*1+1*1+2*1+0*0+0*0+0*0+1*(-1)+8*(-1)+2*(-1)=-5;
按照上述的計算方法逐步按右移一個步長(步長可以設定為1,2,...等),然後按往下移,逐漸計算相應的值,得出最終的值。
如上圖顯示,對於第一個圖像矩陣對應的圖,一邊是白色,一邊是黑色,那麼中間就會存在一個垂直的邊緣,我們可以選擇一個垂直邊緣檢測過濾器,如乘法右邊的矩陣,那麼兩者做卷積後得出的圖會顯示如等號右邊的結果矩陣對應的灰度圖中間會有一個白色的中間帶,也就是檢測出來的邊緣,那為什麼感覺中間邊緣帶會比較寬呢?而不是很細的一個局域呢?原因是我們輸入的圖像只有6*6,過於小了,如果我們選擇輸出更大的尺寸的圖,那麼結果來說就是相對的一個細的邊緣檢測帶,也就將我們的垂直邊緣特徵提取出來了。
上述都是人工選擇過濾器的參數,隨著神經網路的發展我們可以利用反向傳播演算法來學習過濾器的參數
我們可以將卷積的顧慮器的數值變成一個參數,通過反向傳播演算法去學習,這樣學到的過濾器或者說卷積核就能夠識別到很多的特徵,而不是依靠手工選擇過濾器。
- padding 操作,卷積經常會出現兩個問題:
1.每經過一次卷積圖像都會縮小,如果卷積層很多的話,後面的圖像就縮的很小了;
2.邊緣像素利用次數只有一次,很明顯少於位於中間的像素,因此會損失邊緣圖像信息。
為了解決上述的問題,我們可以在圖像邊緣填充像素,也就是 padding 操作了。
如果我們設置在圖像邊緣填充的像素數為p,那麼經過卷積後的圖像是:(n+2p-f+1)x(n+2p-f+1).
如何去選擇p呢
通常有兩種選擇:
-Valid:也就是說不填充操作(no padding),因此如果我們有nxn的圖像,fxf的過濾器,那麼我們進行卷積nxn fxf=(n-f+1)x(n-f+1)的輸出圖像;
-Same:也就是填充後是輸出圖像的大小的與輸入相同,同樣就有(n+2p)x(n+2p) fxf=nxn,那麼可以算,n+2p-f+1=n,得到p=(f-1)/2。
通常對於過濾器的選擇有一個默認的准則就是選擇過濾器的尺寸是奇數的過濾器。
- 卷積步長設置(Strided COnvolution)
卷積步長也就是我們進行卷積操作時,過濾器每次移動的步長,上面我們介紹的卷積操作步長默認都是1,也就是說每次移動過濾器時我們是向右移動一格,或者向下移動一格。
但是我們可以對卷積進行步長的設置,也就是我們能夠對卷積移動的格數進行設置。同樣假如我們的圖像是nxn,過濾器是fxf,padding設置是p,步長strided設置為s,那麼我們進行卷積操作後輸出的圖像為((n+2p-f)/s+1)x((n+2p-f)/s+1),那麼這樣就會出現一個問題,如果計算結果不是整數怎麼辦?
一般是選擇向下取整,也就是說明,只有當我們的過濾器完全在圖像上能夠覆蓋時才對它進行計算,這是一個慣例。
實際上上述所述的操作在嚴格數學角度來說不是卷積的定義,卷積的定義上我們計算的時候在移動步長之前也就是對應元素相乘之前是需要對卷積核或者說我們的過濾器進行鏡像操作的,經過鏡像操作後再把對應元素進行相乘這才是嚴格意義上的卷積操作,在數學角度上來說這個操作不算嚴格的卷積操作應該是屬於互相關操作,但是在深度學習領域中,大家按照慣例都省略了反轉操作,也把這個操作叫做卷積操作
我們知道彩色圖像有RGB三個通道,因此對於輸入來說是一個三維的輸入,那麼對三維輸入的圖像如何進行卷積操作呢?
例子,如上圖我們輸入圖像假設為6×6×3,3代表有RGB三個通道channel,或者可以叫depth深度,過濾器的選擇為3×3×3,其中需要規定的是,顧慮器的channel必須與輸入圖像的channel相同,長寬沒有限制,那麼計算過程是,我們將過濾器的立體覆蓋在輸入,這樣對應的27個數對應相乘後相加得到一個數,對應到我們的輸出,因此這樣的方式進行卷積後我們得出的輸出層為4×4×1。如果我們有多個過濾器,比如我們分別用兩個過濾器一個提取垂直特徵,一個提取水平特徵,那麼輸出圖4×4×2 。也就是代表我們輸出的深度或者說通道與過濾器的個數是相等的。
第l層的卷積標記如下:
加入我們的過濾器是3×3×3規格的,如果我們設定10個過濾器,那麼需要學習的參數總數為每個過濾器為27個參數然後加上一個偏差bias那麼每個過濾器的參數為28個,所以十個過濾器的參數為280個。從這里也就可以看出,不管我們輸入的圖片大小是多大,我們都只需要計算這些參數,因此參數共享也就很容易理解了。
為了縮減模型的大小,提高計算速度,同時提高所提取特徵的魯棒性,我們經常會使用池化層。池化層的計算方式與卷積類似,只是我們需要對每一個通道都進行池化操作。
池化的方式一般有兩種:Max Pooling和Average Pooling。
上面為Max Pooling,那麼計算方法與卷積類似,首先設定超參數比如過濾器的大小與步長,然後覆蓋到對應格子上面,用最大值取代其值作為輸出的結果,例如上圖為過濾器選擇2×2,步長選擇為2,因此輸出就是2×2的維度,每個輸出格子都是過濾器對應維度上輸入的最大值。如果為平均池化,那麼就是選擇其間的平均值作為輸出的值。
因此從上面的過程我們看到,通過池化操作能夠縮小模型,同時能讓特徵值更加明顯,也就提高了提取特徵的魯棒性。
⑧ 嵌入式與神經網路(二):CNN卷積層
姓名:王央京 學號:18050100052 學院:電子工程學院
轉自:https://blog.csdn.net/qq_25762497/article/details/51052861
【嵌牛導讀】本文具體介紹了CNN中的卷積層
【嵌牛鼻子】卷積層
【嵌牛提問】在初步了解之後,對CNN中的卷積層進行具體介紹
【嵌牛正文】
局部感知(Local Connectivity)
普通神經網路把輸入層和隱含層進行「全連接(Full Connected)「的設計。從計算的角度來講,相對較小的圖像從整幅圖像中計算特徵是可行的。但是,如果是更大的圖像(如 96x96 的圖像),要通過這種全聯通網路的這種方法來學習整幅圖像上的特徵,從計算角度而言,將變得非常耗時。你需要設計 10 的 4 次方(=10000)個輸入單元,假設你要學習 100 個特徵,那麼就有 10 的 6 次方個參數需要去學習。與 28x28 的小塊圖像相比較, 96x96 的圖像使用前向輸送或者後向傳導的計算方式,計算過程也會慢 100倍。
卷積層解決這類問題的一種簡單方法是對隱含單元和輸入單元間的連接加以限制:每個隱含單元僅僅只能連接輸入單元的一部分。例如,每個隱含單元僅僅連接輸入圖像的一小片相鄰區域。(對於不同於圖像輸入的輸入形式,也會有一些特別的連接到單隱含層的輸入信號「連接區域」選擇方式。如音頻作為一種信號輸入方式,一個隱含單元所需要連接的輸入單元的子集,可能僅僅是一段音頻輸入所對應的某個時間段上的信號。)
每個隱含單元連接的輸入區域大小叫r神經元的感受野(receptive field)。
由於卷積層的神經元也是三維的,所以也具有深度。卷積層的參數包含一系列過濾器(filter),每個過濾器訓練一個深度,有幾個過濾器輸出單元就具有多少深度。
具體如下圖所示,樣例輸入單元大小是32×32×3, 輸出單元的深度是5, 對於輸出單元不同深度的同一位置,與輸入圖片連接的區域是相同的,但是參數(過濾器)不同。
雖然每個輸出單元只是連接輸入的一部分,但是值的計算方法是沒有變的,都是權重和輸入的點積,然後加上偏置,這點與普通神經網路是一樣的,如下圖所示:
空間排列(Spatial arrangement)
一個輸出單元的大小有以下三個量控制:depth, stride 和 zero-padding。
深度(depth) : 顧名思義,它控制輸出單元的深度,也就是filter的個數,連接同一塊區域的神經元個數。又名:depth column
步幅(stride):它控制在同一深度的相鄰兩個隱含單元,與他們相連接的輸入區域的距離。如果步幅很小(比如 stride = 1)的話,相鄰隱含單元的輸入區域的重疊部分會很多; 步幅很大則重疊區域變少。
補零(zero-padding) : 我們可以通過在輸入單元周圍補零來改變輸入單元整體大小,從而控制輸出單元的空間大小。
我們先定義幾個符號:
W : 輸入單元的大小(寬或高)
F : 感受野(receptive field)
S : 步幅(stride)
P : 補零(zero-padding)的數量
K : 深度,輸出單元的深度
則可以用以下公式計算一個維度(寬或高)內一個輸出單元里可以有幾個隱藏單元:
如果計算結果不是一個整數,則說明現有參數不能正好適合輸入,步幅(stride)設置的不合適,或者需要補零,證明略,下面用一個例子來說明一下。
這是一個一維的例子,左邊模型輸入單元有5個,即W=5, 邊界各補了一個零,即P=1,步幅是1, 即S=1,感受野是3,因為每個輸出隱藏單元連接3個輸入單元,即F=3,根據上面公式可以計算出輸出隱藏單元的個數是5,與圖示吻合。右邊那個模型是把步幅變為2,其餘不變,可以算出輸出大小為3,也與圖示吻合。若把步幅改為3,則公式不能整除,說明步幅為3不能恰好吻合輸入單元大小。另外,網路的權重在圖的右上角,計算方法和普通神經網路一樣。
參數共享(Parameter Sharing)
應用參數共享可以大量減少參數數量,參數共享基於一個假設:如果圖像中的一點(x1, y1)包含的特徵很重要,那麼它應該和圖像中的另一點(x2, y2)一樣重要。換種說法,我們把同一深度的平面叫做深度切片(depth slice),那麼同一個切片應該共享同一組權重和偏置。我們仍然可以使用梯度下降的方法來學習這些權值,只需要對原始演算法做一些小的改動, 這里共享權值的梯度是所有共享參數的梯度的總和。
我們不禁會問為什麼要權重共享呢?一方面,重復單元能夠對特徵進行識別,而不考慮它在可視域中的位置。另一方面,權值共享使得我們能更有效的進行特徵抽取,因為它極大的減少了需要學習的自由變數的個數。通過控制模型的規模,卷積網路對視覺問題可以具有很好的泛化能力。
卷積(Convolution)
如果應用參數共享的話,實際上每一層計算的操作就是輸入層和權重的卷積!這也就是卷積神經網路名字的由來。
先拋開卷積這個概念不管。為簡便起見,考慮一個大小為5×5的圖像,和一個3×3的卷積核。這種情況下,卷積核實際上有9個神經元,他們的輸出又組成一個3×3的矩陣,稱為特徵圖。第一個神經元連接到圖像的第一個3×3的局部,第二個神經元則連接到第二個局部。具體如下圖所示。
圖的上方是第一個神經元的輸出,下方是第二個神經元的輸出。每個神經元的運算依舊是
現在我們回憶一下離散卷積運算。假設有二維離散函數 f(x,y) , g(x,y), 那麼它們的卷積定義為
上面例子中的9個神經元均完成輸出後,實際上等價於圖像和卷積核的卷積操作。
⑨ 卷機神經網路中的對輸入圖像的過濾器是什麼這里的過濾器怎麼理解
ConvOp是Theano中對卷積層的一個實現。它重復了Scipy中scipy.signal.convolve2d的函數功能,總的來講,ConvOp包含了兩個輸入(參數):
(1)對應輸入圖像的mini-batch的4D張量。每個張量的大小為:[mini-batch的大小,輸入的特徵圖的數量,圖像的高度,圖像的寬度]。
(2)對應於權值W的4D張量。每個張量的大小為:[m層的特徵圖數量,m-1層的特徵圖數量,濾波器的高度,濾波器的寬度]。
如果輸入數據是小塊圖像,比如8×8,那這種方法是可行的,但是如果輸入圖像是96×96,假設隱含層神經元100個,那麼就有一百萬個(96×96×100)參數需要學習,向前或向後傳播計算時計算時間也會慢很多。
解決這類問題的一種簡單方法是對隱含單元和輸入單元間的連接加以限制:每個隱含單元僅僅只能連接輸入單元的一部分。例如,每個隱含單元僅僅連接輸入圖像的一小片相鄰區域。這也是卷積神經網路的基本思想,它是一種特殊的MLP,這個概念是從生物裡面演化過來的. 根據Hubel和Wiesel早期在貓的視覺皮層上的工作, 我們知道在視覺皮層上面存在一種細胞的復雜分布,這些細胞對一些局部輸入是很敏感的,它們被成為感知野, 並通過這種特殊的組合方式來覆蓋整個視野. 這些過濾器對輸入空間是局部敏感的,因此能夠更好得發覺自然圖像中不同物體的空間相關性。
對一副圖片的局部特性的提取在整個視野上是可重復的,比如我們在96×96圖像中選取8×8作為樣本,在樣本上學習到的特徵應用到整幅圖像上,即利用8×8中學習到的特徵在96×96圖像上做卷積,從而獲得不同的特徵值,所需要學習的參數也從96×96降到了8×8,這樣成為一個特徵圖。我們需要從一副圖像上學習的特徵肯定不止一種,所以需要建立n個特徵圖來學習不同的特徵。即使是這樣,演算法的復雜度也比之前全連接的方法大大的降低了。
⑩ 卷積神經網路——卷積層、池化層和激活函數
2018年11月20日,在看tensorflow的時候發現還是有很多概念沒有理解透徹,發現一個很贊的資源(估計大家都知道的,只有我現在才發現),吳恩達老師在網易雲課堂上開的深度學習的 課程 ,感覺很贊.本文實際上是吳恩達卷積神經網路視頻學習筆記。
2019年2月14日,再次溫故這部分的內容,添加了1.1章節的自問自答,添加了對池化層實現反向傳播的方式,添加了激活函數relu和sigmoid的對比。
通過一個3 * 3的每列值相同、第一列為1,第二列為0,第三列為-1的過濾器可以檢測垂直的邊沿。注意到1表示亮,-1表示暗。這樣可以發現正負值的邊沿。
對於垂直邊緣過濾器而言,重要的是中間一列為0,左右兩列的值可以相差盡可能的大。
這個過濾器的數值也是可以通過反向傳播皮運行演算法學習的,不一定需要在演算法開始之前就決定。
深度學習甚至可以去學習其他的邊沿,無論是45度、73度乃至是其他的角度,雖然比手工要復雜一些,但是確實具有這樣的能力。
為什麼需要填充?大家都知道,卷積就是用過濾器(f x f)從左到右、從上到下的掃描一個矩陣(n x n)。有兩種卷積操作,一種稱為valid-conv,一種稱為same-conv。每次卷積的時候,過濾器右側碰到矩陣右邊界就結束當前行的掃描,下側碰到矩陣下邊界就結束掃描,因此通過過濾器的圖像都會縮小,變為(n-f+1) * (n-f+1)。valid-conv就是這樣的卷積操作,而same-conv會在卷積之前填充原始圖,使得卷積之後的大小不變。
一般來說燃嘩,若原圖像大小為n * n,過濾器大小為f * f,那麼需要padding的大小為p=(f-1)/2。一般來說我們會設置f為奇數,很少看見偶數的過濾器。其中的原因之一就是為了對稱填充。另一個原因可能是一般需要將過濾器的中間點用於定位卷積的位置,而偶數過濾器沒有中間點。
上面的提到的卷積過程每次只移動一步。實際上過濾器可以移動不止一步,用s表示步長。那麼n x n的矩陣輸入, f x f的過濾器, p填充padding,以及s步長的情況下,輸出的矩陣大小為 (n+2p-f)/2+1 x (n+2p-f)/2+1 ,這里是向下取整的,這意味過濾器只能在輸入圖像內部移動,不可以移動出邊緣。
注意 在tensorflow中,有兩種填充方式,一種是same,一種是valid。same是填充,而valid是不填充。如果遇到valid,那麼實際計算矩陣大小的時候,是向上取悄襪整,而不是這里提到的向下取整。如果是same模式,那麼最後的矩陣形狀是n/s,也是向上取整
上面提到的卷積的輸入是n x n的,這一般是灰度圖像。對應彩色圖像則存在RGB三個顏色channel,這樣的圖片是n x n x 3。此時的過濾器也必須存在第三個維度,即channel維度,且一個過濾器的channel維度必須和輸入的channel維度一致。這樣的卷積結果就是三個維度上,過濾器和輸入的重疊位置乘積之和。最後的輸出是(n - f + 1) x ( n - f +1)的。 注意,輸出是二維的
我們可以使用N個不同的過濾器得到不同的N個二維輸出,按照輸入的格式將其疊起來,這樣輸出就是 (n - f + 1) x ( n - f +1) x N了。
在上面一節中已經講了如何得到輸入和一個過濾器卷積之後的結果。通常會給卷積的結果添加一個偏執,然後使用非線性的函數進行處理,得到的就是這層網路的輸出。將過濾器的參數標記為W,偏置為 b(一個channel的輸出矩陣Wa的偏置是一個實數,而非一個矩陣。一個layer的偏置b的維度和通道數channel一致) , 輸入數據為上層的激活值。這樣每個過濾器處理之後的結果就可以看成是經過了該layer一個節點之後的輸出。
下面是每層的符號標記,以及根據上一層計算下一層輸入大小的公式,右下角是使用BP學習更新的時候參數更新的次數。可以看到每層的參數的個數只和這層的filter的大小、數目有關,而和輸入的規模無關。這樣就可以通過控制參數的數量避免過擬合了。
可以從下面的課件中看到,卷積神經網路的趨勢是長度和高度逐漸減少,而channel逐漸加深。最後一層會將卷積層平鋪開來,形成一個全連接。全連接層會連接到最後一個判別函數上,判別函數可以是logistic或者softmax層,用於輸出類別或者概率。
一般情況下,卷積網路除了卷積層之外,還會有池化層和全連接層,這些層可以提供更好的學習。
池化層一般在卷積層之後,可以也可以看成一個過濾器,實際上實現的一個采樣的功能,其主要的思想是,著重提取具有某種傾向的特徵,比如最大池化對應的是更顯著的特徵;平均池化對應的是更加平滑的特徵。過濾器有幾點不同
一般常用的池化層有max_pooling和average_pooling.max_pooling更加常用。 ,最大池化層意味著檢測某個特徵,並始終將這個特徵留在池化層的輸出中 。
池化層的輸入n x n x nc,過濾器 f x f,步長s,輸出 ((n-f)/s+1) x ((n-f)/s+1) * nc。
一般取s=2,這意味著輸入的長寬減小一半。
比較好奇的一個問題是,池化層的存在對反向傳播有什麼影響?我們都知道在傳統的神經網路中,反向傳播演算法實際上就是利用函數的梯度進行反向傳播的,那麼池化層這種既改變了矩陣大小又不好求導的情況,怎麼處理呢?
(下面的內容來自 迷川浩浩_ZJU 的博客 )
mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變,還是比較理解的。mean pooling比較容易讓人理解錯的地方就是會簡單的認為直接把梯度復制N遍之後直接反向傳播回去,但是這樣會造成loss之和變為原來的N倍,網路是會產生梯度爆炸的。
2、max pooling
max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id
一般概念上的一層包括卷積層和池化層,之所以不把池化層當做新的一層是因為池化層沒有需要學習的參數,一般意義上的layer是有權重和參數需要學習的。
盡量不要自己設置超參數,而是盡量參考別人論文裡面使用的超參數,選擇一個在別人任務中效果很好的超參數。
下面的表中列舉了上面的網路每一層的數據規模a^(l)以及參數數量。可以發現數據的規模逐漸減小。主卷積層的參數比較少,而進入全連接層之後參數數量很大。(表格中最後三列的參數數量可能存在錯誤,應該是48000 + 120, 120 * 84 + 84, 84 * 10 + 10)
以上的兩個特徵可以明顯的減少參數。減少過擬合
(內容來自 迷川浩浩_ZJU 的博客 )
常用的激活函數有sigmoid函數和relu函數.
Relu(x)={if x>0 then x;else 0}為了在反向傳播演算法中可以正常使用,將其在x=0x=0處的導數置為1,所以它的導數也就變為了 δRelu(x)={if x>0 then 1 else 0}
Relu是一個非常優秀的激活哈數,相比較於傳統的Sigmoid函數,有三個作用