前言
卷積神經(jīng)網(wǎng)絡(luò)(CNN)漓踢,也稱為卷積網(wǎng)絡(luò),是一種專門(mén)用來(lái)處理具有類似網(wǎng)格結(jié)構(gòu)的數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò),如時(shí)間序列數(shù)據(jù)(一維網(wǎng)格)和圖像數(shù)據(jù)(二維像素網(wǎng)格)午乓,主要應(yīng)用于圖像識(shí)別領(lǐng)域。它也是一種前饋神經(jīng)網(wǎng)絡(luò)闸准,是指在該網(wǎng)絡(luò)中益愈,各神經(jīng)元從輸入層開(kāi)始,接收前一級(jí)輸入,并輸出到下一級(jí)蒸其,直至輸出層敏释,整個(gè)網(wǎng)絡(luò)中無(wú)反饋,如下所示:
卷積神經(jīng)網(wǎng)絡(luò)一般含有多個(gè)卷積層摸袁,池化層钥顽,以及激活層和全鏈接層。
卷積層的一些小事
在卷積神經(jīng)網(wǎng)絡(luò)中靠汁,將一個(gè)卷積過(guò)程定義為
y = x * w
耳鸯,其中x是輸入(input),w是卷積核(kernel)函數(shù)膀曾,y作為輸出也稱作特征映射(feature map)县爬。圍繞這個(gè)等式,探討下卷積神經(jīng)網(wǎng)絡(luò)相較傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的三個(gè)改進(jìn)點(diǎn):稀疏交互添谊、參數(shù)共享以及等變表示财喳。
1.稀疏交互
也稱作稀疏(sparse)連接或稀疏權(quán)重耳高。
先舉個(gè)栗子:
當(dāng)處理一張圖片時(shí),輸入的圖像可能包含成千上萬(wàn)個(gè)像素點(diǎn)所踊,但是通過(guò)與等式中的w核卷積后泌枪,就可以得到這張圖中有意義的特征(例如圖像的邊緣信息),相比輸入圖秕岛,提取出特征圖的像素點(diǎn)大大減少碌燕,并且該kernel只占有幾十到上百個(gè)像素,這個(gè)過(guò)程就可以理解為稀疏交互继薛。
再舉個(gè)栗子:
如果有m個(gè)輸入和n個(gè)輸出修壕,那么使用傳統(tǒng)神經(jīng)網(wǎng)絡(luò)(矩陣乘法)需要mn個(gè)參數(shù),從而學(xué)習(xí)一次的時(shí)間復(fù)雜度為
O(m*n)
遏考。而如果限制*每一個(gè)輸出擁有的連接數(shù)為k慈鸠,則該方法學(xué)習(xí)一次的時(shí)間復(fù)雜度為O(k*n)
,k只需比m小幾個(gè)數(shù)量級(jí)即可灌具。
應(yīng)用于圖像,就是經(jīng)過(guò)卷積操作的網(wǎng)絡(luò)咖楣,不再是對(duì)每個(gè)像素的輸入信息做處理了督笆,而是對(duì)圖片上每一小塊像素區(qū)域進(jìn)行處理。
總結(jié)下就是截歉,卷積網(wǎng)絡(luò)的稀疏交互特性胖腾,使得模型存儲(chǔ)的參數(shù)更少烟零,不僅節(jié)省了內(nèi)存瘪松,也提高了統(tǒng)計(jì)效率咸作。更進(jìn)一步,該特性使得宵睦,得到輸出結(jié)果所需要的計(jì)算量更少了记罚,以及提高了模型的泛化能力。
2.參數(shù)共享
在傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)中壳嚎,權(quán)重矩陣的每個(gè)元素對(duì)對(duì)應(yīng)的輸入元素只使用一次桐智,而在卷積網(wǎng)絡(luò)中,核的每個(gè)元素都作用在輸入的每個(gè)位置上烟馅。參數(shù)共享特性保證了網(wǎng)絡(luò)只需要學(xué)習(xí)一個(gè)參數(shù)的集合说庭,而不是對(duì)每個(gè)位置都學(xué)習(xí)一個(gè)單獨(dú)的參數(shù)集合。同樣郑趁,參數(shù)共享特性也降低了模型的存儲(chǔ)大小刊驴,畢竟不是每個(gè)元素都學(xué)習(xí)一個(gè)參數(shù)。
3.等變表示
參數(shù)共享使得神經(jīng)網(wǎng)絡(luò)具有對(duì)平移等變的性質(zhì)(如果一個(gè)函數(shù)滿足輸入改變寡润,輸出也以同樣方式改變捆憎,則該函數(shù)是等變的)。對(duì)于卷積函數(shù)梭纹,先進(jìn)行平移變換再進(jìn)行卷積所得到的結(jié)果和先做卷積再做平移變換得到的結(jié)果是一樣躲惰。
簡(jiǎn)單地說(shuō),如果移動(dòng)輸入中的對(duì)象变抽。那它卷積后的特征表示也會(huì)移動(dòng)同樣的量础拨。例如,輸入圖像的左上角有一個(gè)人臉绍载,那經(jīng)過(guò)卷積太伊,人臉的特征(眼睛,鼻子)也位于特征圖的左上角逛钻。對(duì)應(yīng)的如果人臉特征在圖像的左下角僚焦,那么卷積后對(duì)應(yīng)的特征也在特征圖的左下角。等變性意味著即使目標(biāo)的外觀發(fā)生了某種變化曙痘,但是網(wǎng)絡(luò)依然可以把它識(shí)別出來(lái)芳悲,這也是卷積網(wǎng)絡(luò)學(xué)習(xí)能力的體現(xiàn)。
4.TensorFlow中的卷積函數(shù)
一個(gè)卷積核只能提取某一個(gè)特征边坤,多個(gè)卷積核就能提取多個(gè)豐富的特征(至于為什么卷積操作可以提取特征名扛,會(huì)在池化層中介紹),所以經(jīng)常見(jiàn)到一個(gè)卷積網(wǎng)絡(luò)中有許多的卷積操作茧痒。
TensorFlow中對(duì)卷積等一些列操作進(jìn)行了很多封裝(tf.nn肮韧、tf.layers、tf.contrib,它們的封裝程度依次遞增)弄企,但大體的用法是差不多的超燃。一般一個(gè)卷積函數(shù)的基本參數(shù)包括以下幾個(gè)(其他參數(shù)可以訪問(wèn)tensorflow官方文檔查看):
- 輸入:一個(gè)4維tensor,第一維表示batch-size(訓(xùn)練一次輸入的樣本量)拘领,后面幾維表示圖像樣本的長(zhǎng)意乓、寬以及通道數(shù)(深度)。
- 卷積核(過(guò)濾器):描述卷積核的size约素,深度(卷積核的個(gè)數(shù))届良。
- 步長(zhǎng):卷積核每次移動(dòng)的距離
- 填充:是否對(duì)邊緣進(jìn)行填充(填充的目的可以保證卷積后,輸入輸出的大小不變)
舉個(gè)栗子:
import tensorflow as tf
import numpy as np
#初始化一個(gè)形狀為3*3的矩陣圣猎,并調(diào)整輸入的格式為(1, 3, 3, 1)
matrix = np.array([[[2],[1],[2]],
[[1],[4],[2]],
[[1],[1],[0]]],
dtype="float32").reshape(1, 3, 3, 1)
#創(chuàng)建一個(gè)2*2的卷積核士葫,并為其賦上基礎(chǔ)權(quán)重
#第三個(gè)維度的1表示當(dāng)前層的深度,第四個(gè)維度的1表示卷積核的數(shù)量
kernel = tf.get_variable("weights", [2, 2, 1, 1],
initializer = tf.constant_initializer([[1, 2],[2, 1]]))
#開(kāi)始卷積
#先創(chuàng)建一個(gè)占位輸入
x = tf.placeholder('float32', [1, None, None, 1])
#卷積送悔,選擇的是不填充-VALID为障,填充為SAME,步長(zhǎng)每個(gè)通道為1
conv = tf.nn.conv2d(x, kernel, strides=[1, 1, 1, 1], padding="VALID")
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
conv = sess.run(conv, feed_dict={x: matrix})
#(1放祟,2鳍怨,2,1)
print("The shape of matrix after conv:", conv.shape)
#10, 15
#12, 10
print("Matrix after conv: \n", conv)
卷積輸出尺寸可由公式out = (i + 2p - k)/s + 1
計(jì)算跪妥,其中鞋喇,i為輸入圖像的尺寸,p為填充的寬度眉撵,k為卷積核的size侦香,s為步長(zhǎng)的長(zhǎng)度。
總結(jié)
卷積網(wǎng)絡(luò)中的卷積過(guò)程可以理解為:
有一個(gè)卷積核(過(guò)濾器), 持續(xù)不斷的在輸入圖片上移動(dòng)纽疟,如圖二所示罐韩,每次移動(dòng)都會(huì)收集一小塊像素區(qū)域的信息(特征值),當(dāng)遍歷完整張圖污朽,就提取出了這張圖片的低層次特征散吵。
然后再以同樣的步驟,用類似的卷積核再去卷積上一次提取到的低層次特征蟆肆,CNN就可以從這些低層次特征中總結(jié)出更高層的特征信息矾睦。當(dāng)然中間少不了池化層和激活層的幫助。
【關(guān)注公眾號(hào)DoCode炎功,每日一道LeetCode枚冗,更有其他學(xué)習(xí)內(nèi)容,將零碎時(shí)間利用起來(lái)】