深度學(xué)習(xí)之卷積

今日休假,把卷積神經(jīng)網(wǎng)絡(luò)梳理下。先從一些基本概念入手,什么是卷積?為什么叫這么個名字?

搜索了一遍,網(wǎng)上有很多人已經(jīng)表述的非常好了,這里用自己理解的語言重述下。

既然是卷積,肯定是一種積,積我們知道是兩個數(shù)的乘的結(jié)果,那么卷積也是一種乘,所以需要兩個相乘的單元。

先考慮在一維變量上:

image

函數(shù) f 與函數(shù) g 不停在搏斗,同時把搏斗的結(jié)果進(jìn)行求和,而且這個過程是從生到死(負(fù)無窮-正無窮)

下面是連續(xù)函數(shù)的積分表達(dá)形式,效果是一樣的

image

上面的兩個式子可以看到有共同的地方就是:

image

這就有意思了,也就是解釋卷積的“卷”的關(guān)鍵所在。

我們假設(shè)

image

x+y=a 是一條直線,a 的取值從負(fù)無窮到正無窮,這個過程就是把 xy 坐標(biāo)系從西南角一直掃描到東北角,就像我們卷手絹一樣,還是比較形象的。

image

有了上面的認(rèn)識,我們進(jìn)一步看看二維的。

如果在在二維空間,有函數(shù) f(x, y) 和 g(x, y),他們兩個做乘積,也就是:

image

這個式子看上去有點(diǎn)小復(fù)雜,其實(shí)就是表示從負(fù)無窮到正無窮的全部 s 和 t 值,把 g 在 (x-s, y-t) 上的值乘以 f 在 (s, t) 上的值之后再“加和”到一起,得到 c 在 (x, y) 上的值。說白了卷積就是一種“加權(quán)求和”:以 f 為權(quán),以 (x, y) 為中心,把 g 距離中心 (-s, -t) 位置上的值乘上 f 在 (s, t) 的值,最后加到一起。

如果是離散的,把積分修改為求和即可:

image

式子最右邊就是表示跨度德爾塔為1。

尤其需要注意的是 f 與 g 里面的 s 與 t 的正負(fù)方向。

舉個例子:

假如現(xiàn)在有一個10*10的圖片,該圖片是灰度處理過的,也就是黑白圖片,不是 RGB 三個通道的。

在這10

10的格子里有對應(yīng)的值,范圍之外全是0,我們令整個圖片叫G。另外還有一個矩陣(一般應(yīng)該是特征矩陣,用來提取大圖的特征),我們叫他F,他的值應(yīng)該是預(yù)先給定好的,這里我們也是假設(shè)一組數(shù)據(jù)填充進(jìn)來。

image

接下來,我們要做的就是,把 F 進(jìn)行上下左右反轉(zhuǎn),形成F‘,然后與 G 從00點(diǎn)開始對齊,進(jìn)行小格子乘積操作,再求和。

比如在3**7這個點(diǎn)進(jìn)行,求新得到的該點(diǎn)數(shù)值。

image

image

上述操作其實(shí)就是對數(shù)字圖像進(jìn)行離散卷積操作,又叫濾波。F 稱作卷積核或濾波器。不同的 F 有不同的效果。

比如:

image

經(jīng)過不同的卷積核,可能得到的圖片:

image

image

進(jìn)一步

有了卷積,我們可能還要做一些輔助的事,比如步長,補(bǔ)0等。

比如有一個5乘5的矩陣,都是1,現(xiàn)在有一個2**2卷積核,值是[-1,0,0,-1]。

image

現(xiàn)在需要做卷積,每次移動2格,也就是步長是2,開始計算各個小區(qū)塊,如下圖。

image

最終結(jié)果是:

-2,-2,-1,

-2,-2,-1,

-1,-1,-1

在移動步長的時候,不足的地方需要補(bǔ)0操作,如果不補(bǔ)0,就 dropped,這都是 padding 的策略

多核卷積

一個 G 函數(shù),可以使用多個 F 函數(shù)做卷積核,得到不同的卷積結(jié)果,也就是某張圖片使用多個卷積核,得到各個不同地方的特征。

全卷積

全卷積也叫反卷積,他的步長是1,是把原始圖片的每個像素點(diǎn)用卷積操作展開。比如下圖,

image

如果原始圖片的大小是 N1乘N1,核的大小是 N2乘N2,那么生成的圖片大小是:(N1+N2-1)(N1+N2-1)

池化

池化的操作就是降低維度,我們再對圖片做操作的時候,由于維度太多,需要降低維度,同時要保持特征部分。池化的操作也是需要一個矩陣,也需要步長,原始數(shù)據(jù)經(jīng)過池化操作,矩陣大小明顯變小,里面的數(shù)值的確定有:取池化范圍的最大值,取池化區(qū)域均值,下圖是一個最大池化的例子

image

在 TensorFlow 中學(xué)習(xí)卷積

在 TensorFlow 里面已經(jīng)包裝了這些函數(shù),我們不在需要逐個計算,tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None) 函數(shù)實(shí)現(xiàn)了卷積操作。來看下他的具體參數(shù)含義:

給定一個input的張量[batch, in_height, in_width, in_channels]和一個過濾器 / 內(nèi)核張量 [filter_height, filter_width, in_channels, out_channels]后,執(zhí)行以下操作:

展平filter為一個形狀為[filter_height * filter_width * in_channels, output_channels]的二維矩陣。

從input中按照filter大小提取圖片子集形成一個大小為[batch, out_height, out_width, filter_height * filter_width * in_channels]的虛擬張量。

循環(huán)每個圖片子集,右乘filter矩陣。

舉個例子:

有一個輸入[1,3,3,1],表示一個圖像,33大小,1個通道;

filter 是[2,2,1,1]表示過濾器是2

2大小,輸入輸出通道都是1;

步長是1,padding是VALID;

這種情況下,輸出是1x2x2x1,其中2=(3-2)/1+1,即(圖片大小-filter大小)/步長+1。

input 和 filter 都是4維度

importtensorflowastfinput = tf.constant([[? [[1],? [2],? [3]],? [[4],? [5],? [6]],? [[7],? [8],? [9]]]],dtype=tf.float32)filter = tf.constant([[[[1]],? [[2]]], [[[3]],? [[4]]]],dtype=tf.float32)op = tf.nn.conv2d(input,filter,strides = [1,1,1,1],padding ='VALID')withtf.Session()assess:? ? sess.run(tf.global_variables_initializer())? ? result = sess.run(op)? ? print(result)

輸出結(jié)果是:

[[[[37.]? [47.]]? [[67.]? [77.]]]]

如果 padding(補(bǔ)0操作)是 SAME,也就是和輸入一樣大小,那么

op = tf.nn.conv2d(input,filter,strides = [1,1,1,1],padding ='SAME')

得到的結(jié)果1x3x3x1。

[[[[37.]? [47.]? [21.]]? [[67.]? [77.]? [33.]]? [[23.]? [26.]? [9.]]]]

image

對于多通道來說,輸入是[1x3x3x2]是3x3圖像有2個通道,過濾器是[2x2x2x1]是2x2大小2個輸入1個輸出,步長是1,padding=VALID,輸出是[1x2x2x1],如圖:

image

作者:breezedancer

鏈接:http://www.itdecent.cn/p/33ea5bbfcc46

來源:簡書

簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容