卷積現在可能是深度學習中最重要的概念。正是靠著卷積和卷積神經網路,深度學習才超越了幾乎其他所有的機器學習手段。
1. 一般卷積
卷積在數學上用通俗的話來說就是輸入矩陣與卷積核(卷積核也是矩陣)進行對應元素相乘並求和,所以一次卷積的結果的輸出是乙個數,最後對整個輸入輸入矩陣進行遍歷,最終得到乙個結果矩陣,說白了就是乙個卷積核在影象上滑動,並求取對應元素相乘求和的過程,如下圖:
卷積核為3*3,步長為2和填充的2d卷積
首先,一般情況下卷積層的作用都是用來自動提取影象的一些視覺特徵,代替傳統的手動方法提取特徵不精確,不全面等缺點。常見的一般卷積操作都包括以下四個引數:卷積核大小(kernel size):卷積核定義了卷積的大小範圍,在網路中代表感受野的大小,二維卷積核最常見的就是 3*3 的卷積核,也可以根據網路設計5*5或者7*7,甚至1*1等不同size的卷積核,來提取不同尺度的特徵。
在卷積神經網路中,一般情況下,卷積核越大,感受野(receptive field)越大,看到的資訊越多,所獲得的全域性特徵越好。雖說如此,但是大的卷積核會導致計算量的暴增,不利於模型深度的增加,計算效能也會降低。如上圖中卷積核的size為3*3.
步長(stride):卷積核的步長度代表提取的精度, 步長定義了當卷積核在影象上面進行卷積操作的時候,每次卷積跨越的長度。在預設情況下,步長通常為 1,但我們也可以採用步長是 2 的下取樣過程,類似於 maxpooling 操作。
對於size為3的卷積核,如果step為1,那麼相鄰步感受野之間就會有重複區域;如果step為2,那麼相鄰感受野不會重複,也不會有覆蓋不到的地方;如果step為3,那麼相鄰步感受野之間會有一道大小為1顆畫素的縫隙,從某種程度來說,這樣就遺漏了原圖的資訊。
填充(padding):卷積核與影象尺寸不匹配,往往填充影象缺失區域,如上圖,原始尺寸為5*5,卷積核的大小為3*3,如果不進行填充,步長為1的話,當卷積核沿著滑動後只能滑動出乙個3*3的出來,這就造成了卷積後的和卷積前的尺寸不一致,這顯然不是我們想要的結果,所以為了避免這種情況,需要先對原始做邊界填充處理。
輸入和輸出通道數(input & output channels):卷積核的輸入通道數(in depth)由輸入矩陣的通道數所決定;輸出矩陣的通道數(out depth)由卷積核的輸出通道數所決定。每一層卷積有多少channel數,以及一共有多少層卷積,這些暫時沒有理論支撐,一般都是靠感覺去設定幾組候選值,然後通過實驗挑選出其中的最佳值。這也是現在深度卷積神經網路雖然效果拔群,但是一直為人詬病的原因之一。
2. 擴張卷積
使用3核心進行2d卷積,擴充套件率為2且無填充
擴張卷積(dilated convolution)也被稱為空洞卷積或者膨脹卷積,是在標準的卷積核中注入空洞,以此來增加模型的感受野(reception field)。相比原來的正常卷積操作,除了卷積核大小,步長和填充外,擴張卷積多了乙個引數: dilation rate,指的是卷積核的點的間隔數量,比如常規的卷積操作dilatation rate為1。擴張的卷積為卷積層引入另乙個引數,稱為擴張率。這定義了卷積核中值之間的間距。擴張率為2的3x3核心與5x5核心具有相同的視野,而僅使用9個引數。想象一下,獲取乙個5x5核心並刪除每乙個第二列和第二行(間隔刪除)。如之前的一篇文章:
如下圖,正常卷積核空洞卷積對比:
上圖左側為對0-9共10顆畫素的正常3x3卷積,padding為same,stride=1的情況下,我們知道其卷積後共得到10個特徵,每個特徵的感受野均為3x3,如左側紅色的那個特徵覆蓋3,4,5三顆畫素(想象二維情況下應該是3x3)。 上圖右側為對0-9共10顆畫素的空洞3x3卷積,這裡的3x3是指有效區域,在padding為same,stride=1的情況下,也得到了10個特徵,但是每個特徵的感受野為5x5,如右側藍色的那個特徵覆蓋2,3,4,5,6五顆畫素(想象二維情況下應該是5x5)。
這就在不丟失特徵解析度的情況下擴大了感受野,進而對檢測大物體有比較好的效果。所以總的來說,空洞卷積主要作用:不丟失解析度的情況下擴大感受野;調整擴張率獲得多尺度資訊。但是對於一些很小的物體,本身就不要那麼大的感受野來說,這就不那麼友好了。
##3. 轉置卷積 轉置卷積又叫反卷積、逆卷積。不過轉置卷積是目前最為正規和主流的名稱,因為這個名稱更加貼切的描述了卷積的計算過程,而其他的名字容易造成誤導。在主流的深度學習框架中,如tensorflow,pytorch,keras中的函式名都是conv_transpose。所以學習轉置卷積之前,我們一定要弄清楚標準名稱,遇到他人說反卷積、逆卷積也要幫其糾正,讓不正確的命名盡早的淹沒在歷史的長河中。 有大佬一句話總結:轉置卷積相對於卷積在神經網路結構的正向和反向傳播中做相反的運算。其實還是不是很理解。我們先從轉置卷積的用途來理解下,轉置卷積通常用於幾個方面:cnn視覺化,通過反卷積將卷積得到的feature map還原到畫素空間,來觀察feature map對哪些pattern相應最大,即視覺化哪些特徵是卷積操作提取出來的;
fcn全卷積網路中,由於要對影象進行畫素級的分割,需要將影象尺寸還原到原來的大小,類似upsampling的操作,所以需要採用反卷積;
gan對抗式生成網路中,由於需要從輸入影象到生成影象,自然需要將提取的特徵圖還原到和原圖同樣尺寸的大小,即也需要反卷積操作。
我們先來看看卷積和反卷積的圖,簡直不要太形象。 如下圖正常卷積(convolution): 卷積核為 3x3;no padding , strides=1
正常卷積
轉置卷積可以理解為upsample conv.如下圖: 卷積核為:3x3; no padding , strides=1
轉置卷積
從上面兩個圖可以看到,轉置卷積和卷積有點類似,因為它產生與假設的反卷積層相同的空間解析度。但是,對值執行的實際數**算是不同的。轉置卷積層執行常規卷積,但恢復其空間變換。 需要注意的是:反卷積只能恢復尺寸,不能恢復數值。
4. 可分離卷積
任何看過mobilenet架構的人都會遇到可分離卷積(separable convolutions)這個概念。但什麼是「可分離卷積」,它與標準的卷積又有什麼區別?可分離卷積主要有兩種型別:空間可分離卷積和深度可分離卷積。
空間可分離卷積
在可分離的卷積中,我們可以將核心操作分成多個步驟。讓我們將卷積表示為y = conv(x,k),其中y是輸出影象,x是輸入影象,k是核。簡單。接下來,假設k可以通過以下公式計算:k = k1.dot(k2)。這將使它成為可分離的卷積,因為我們可以通過用k1和k2進行2個1d卷積來得到相同的結果,而不是用k進行2d卷積。
sobel x和y濾鏡
以sobel核心為例,它通常用於影象處理。你可以通過乘以向量[1,0,-1]和[1,2,1] .t得到相同的核心。在執行相同操作時,這將需要6個而不是9個引數。上面的例子顯示了所謂的空間可分卷積。
空間可分卷積的主要問題是並非所有卷積核都可以「分離」成兩個較小的卷積核。 這在訓練期間變得特別麻煩,因為網路可能採用所有可能的卷積核,它最終只能使用可以分成兩個較小卷積核的一小部分。
實際上,通過堆疊1xn和nx1核心層,可以建立與空間可分離卷積非常相似的東西。這最近在乙個名為effnet的架構中使用,顯示了有希望的結果。
深度可分離卷積
在神經網路中,我們通常使用稱為深度可分離卷積的東西。這將執行空間卷積,同時保持通道分離,然後進行深度卷積。這裡,通過乙個例子可以最好地理解它(以下參考文獻2): 以輸入影象為12x12x3的rgb影象為例,正常卷積是卷積核對3個通道同時做卷積。也就是說,3個通道,在一次卷積後,輸出乙個數。而深度可分離卷積分為兩步:第一步用三個卷積對三個通道分別做卷積,這樣在一次卷積後,輸出3個數。
這輸出的三個數,再通過乙個1x1x3的卷積核(pointwise核),得到乙個數。
所以深度可分離卷積其實是通過兩次卷積實現的。
第一步,對三個通道分別做卷積,輸出三個通道的屬性,如下圖:
第二步,用卷積核1x1x3對三個通道再次做卷積,這個時候的輸出就和正常卷積一樣,是8x8x1:
如果要提取更多的屬性,則需要設計更多的1x1x3卷積核心就可以(引用自原**。感覺應該將8x8x256那個立方體繪製成256個8x8x1,因為他們不是一體的,代表了256個屬性):
可以看到,如果僅僅是提取乙個屬性,深度可分離卷積的方法,不如正常卷積。隨著要提取的屬性越來越多,深度可分離卷積就能夠節省更多的引數。
膨脹卷積的缺點 卷積 反卷積與膨脹卷積
卷積 多 1 的對映 本質 在對輸入做9 1的對映關係時,保持了輸出相對於input中的位置性關係 對核矩陣做以下變形 卷積核的滑動步驟變成了卷積核矩陣的擴增 卷積的矩陣乘法變成以下形式 核矩陣重排,輸入featuremap變形為向量 反卷積 1 多 的對映 deconvlution transpo...
深度學習中常見的優化演算法
有批量梯度下降法 batch gradient descent,bgd 和 隨機梯度下降 stochastic gradient descent,sgd 牛頓法是一種在實數域和複數域上近似求解方程的方法。特點是收斂速度很快。擬牛頓法是求解非線性優化問題最有效的方法之一,常用的擬牛頓法有dfp演算法和...
深度學習中常見的啟用函式
下面分別進行介紹。1.sigmoid函式 s型增長函式 sigmoid函式能夠將取值為 infty,infty 的數對映到 0,1 公式和圖形如下 s x frac sigmoid函式作為非線性啟用函式卻不被經常使用,具有以下幾個缺點 1.當x非常大或者非常小的時候,sigmoid函式的導數將接近0...