學號:20031211597
姓名:鄒志強
原文鏈接:https://blog.csdn.net/qq_37635772/article/details/107760263
【嵌牛導讀】淺談卷積神經網絡
【嵌牛鼻子】卷積神經網絡
【嵌牛正文】
1、卷積神經網絡CNN (Convolutional Neural Network):被廣泛應用于圖像識別、語音識別等場合,在圖像識別比賽中镰矿,基于深度學習的方法幾乎都以CNN為基礎只嚣。CNN中新增卷積層(Convolution層)和池化層(Pooling層)穗椅,連接順序變成了“Convolution-Relu-Pooling(有時可以省略)”蔓倍,而輸出層的前一層依舊使用“Affine-ReLU”組合全肮。
2敞咧、全連接:神經網絡相鄰層的所有神經元之間都有連接,輸出的數量可以任意決定辜腺,比如Affine層休建。全連接層所存在的問題是忽視了數據的形狀,無法利用與形狀相關的信息评疗,例如三維數據被拉平成一維數據测砂,圖像是3維形狀包含著重要的空間信息(空間上鄰近的像素為相似的值、RGB的各個通道之間分別有密切聯(lián)系百匆、相距較遠的像素之間沒有什么關聯(lián))砌些,3維形狀中可能隱藏有值得提取的本質模式。
3加匈、特征圖:卷積層的輸入輸出數據稱為特征圖存璃,輸入數據稱為輸入特征圖,輸出數據稱為輸出特征圖雕拼。卷積層會以3維數據的形式接收輸入數據有巧,并同樣以3維數據的形式輸出至下一層。
4悲没、卷積運算:卷積層進行的處理就是卷積運算篮迎,相當于圖像處理中的“濾波器運算”,對輸入數據應用濾波器進行處理示姿,輸入數據和濾波器都有高長方向上的維度甜橱,卷積運算時以一定間隔滑動濾波器的窗口并應用,將濾波器各個位置的元素與輸入的對應元素相乘栈戳,然后再進行求和(乘積累加運算)岂傲,最后再將這個結果保存到輸出對應位置,將這個過程在所有位置都進行一遍就可以得到卷積運算的最終結果子檀。
在全連接的神經網絡中镊掖,除了權重參數,還存在偏置褂痰,CNN中濾波器的參數對應之前的權重亩进,然后再將結果加上偏置(通常只有1個,會被加到應用了濾波器的所有元素上)得到輸出結果缩歪。
5归薛、填充:在進行卷積層處理之前,有時要向輸入數據的周圍填入固定的數據(比如0),進行輸出大小的調整主籍,一般是為了保持輸入輸出數據的空間大小一致习贫,是卷積運算中經常會用到的處理,“幅度為1的填充”是指用幅度為1像素的0填充周圍的空間千元。
6苫昌、步幅:應用濾波器的位置間隔,通常增大步幅后幸海,輸出大小會變小蜡歹,而增大擴充后,輸出大小會變大涕烧。假設輸入大小為(H月而,W),濾波器大小為(FH议纯,F(xiàn)W)父款,輸出大小為(OH,OW)瞻凤,填充為P憨攒,步幅為S,輸出大小可以用以下公式計算阀参。
雖然只要代入值就可以計算輸出大小肝集,但是所設定的值需使公式分別可以除盡,無法除盡時要采取報錯等對策蛛壳,根據深度學習框架的不同杏瞻,有時也會向最接近的整數四舍五入。
7衙荐、3維數據的卷積運算:除了高捞挥、長方向之外,還需要處理通道方向忧吟,濾波器的通道數只能設定為和輸入數據的通道數相同的值砌函。當通道方向上有多個特征圖時,會按照通道進行輸入數據和濾波器的卷積運算溜族,并將結果相加得到最終輸出讹俊。
如果要在通道方向上擁有多個卷積運算的輸出,要考慮使用多個濾波器(權重)煌抒,通過應用FN個濾波器(權重數據按照(output_channel,input_channel,height,width)順序書寫)仍劈,輸出特征圖也生成FN個,再將這FN個特征圖匯集到一起摧玫,就得到形狀為(FN耳奕,OH绑青,OW)的輸出方塊诬像,最后傳給下一層屋群,這個過程表示CNN的處理流。進行追加偏置的加法運算處理時坏挠,偏置的形狀是(FN芍躏,1,1),可以基于Numpy的廣播功能加以實現(xiàn)降狠。
8对竣、批處理:能夠實現(xiàn)高效化和學習時對mini-batch的對應,卷積運算與批處理結合需要將各層間傳遞的數據保存為4維數據(batch_num,channel,height,width)榜配,在批處理版的數據流中否纬,各個數據的開頭會添加批用的維度,數據作為4維形狀在各層間傳遞蛋褥,批處理將N次處理匯總成1次進行临燃。
9、池化層:池化是縮小高烙心、長方向上空間的運算膜廊,比如有一個4x4的原空間,進行2x2區(qū)域集約成1個元素淫茵,縮小空間大小爪瓜,一般來說,池化的窗口大小會和步幅設定成相同的值匙瘪,步幅設為2铆铆,“2x2”表示目標區(qū)域的大小,“Max池化”是獲取目標區(qū)域最大值的運算丹喻,取值結束向前移動步幅為2繼續(xù)取值算灸。
池化層的特征:
沒有要學習的參數——池化只是從目標區(qū)域中取最大值或者平均值(Max池化/Average池化),不存在要學習的參數驻啤;
通道數不發(fā)生變化——經過池化運算菲驴,輸入數據和輸出數據的通道數不會發(fā)生變化,計算按照通道獨立進行骑冗;
對微小位置變化具有魯棒性(健壯性)——輸入數據發(fā)生微小偏差時赊瞬,池化仍會返回相同的結果。
10贼涩、卷積層的實現(xiàn):CNN中各層間傳遞的數據是4維數據巧涧,比如10個高為28、長為28遥倦,通道數為1的數據形狀是(10,1,28,28)谤绳,看上去比較復雜占锯,這時使用im2col技巧可以使問題變簡單。im2col是一個函數缩筛,功能是將輸入數據展開以適合濾波器(權重)消略,對于輸入數據,會將應用濾波器的區(qū)域(3維方塊)橫向展開為1列瞎抛,這個展開處理會在所有應用濾波器的地方進行艺演。
im2col(input_data,filter_h,filter_w,stride=1,pad=0)
input_data——由(數據量N,通道C桐臊,高H胎撤,長W)4維數組構成的輸入數據
filter_h——濾波器的高
filter_w——濾波器的長
stride——步幅
pad——填充
在實際運算中,濾波器的應用區(qū)域幾乎是重疊的断凶,使用im2col展開后伤提,展開后的元素個數會多于原方塊的元素個數,因此im2col的實現(xiàn)比普通實現(xiàn)消耗更多的內存认烁,但是匯總成一個大矩陣進行計算又比較方便(比如線性代數庫中矩陣計算的實現(xiàn)已經高度最優(yōu)化)肿男。使用im2col展開輸入數據后,只需將卷積層的濾波器縱向展開為1列砚著,并計算兩個矩陣的乘積次伶,最后輸出結果是2維矩陣,還需要進行進一步轉換稽穆,轉換成4維數組冠王。
通過reshape(FN,-1)將參數指定為-1,會自動計算-1維度上的元素個數舌镶,以使多維數組的元素個數前后一致柱彻;transpose會更改多維數組的軸的順序,可以將輸出大小轉換為合適的形狀餐胀。另外在進行卷積層的反向傳播時哟楷,要注意必須進行im2col的逆處理。
11否灾、池化層的實現(xiàn):池化層的實現(xiàn)也使用im2col展開輸入數據卖擅,池化情況下在通道方向上是獨立的,按通道單獨展開墨技,展開之后只需求各行的最大值并轉換為合適的形狀即可惩阶。
步驟:
①展開輸入數據扣汪;
②求各行的最大值(可以使用np.max方法,指定axis參數并在這個參數指定的各個軸方向上求最大值)崭别;
③轉換為合適的輸出大小冬筒。
池化層的backward處理可以參考ReLU層的實現(xiàn)中使用的max的反向傳播。
12舞痰、CNN的實現(xiàn):網絡構成為“Convolution-ReLU-Pooling-Affine-ReLU-Affine-Softmax”,實現(xiàn)為名為SimpleConvNet的類匀奏,超參數通過名為conv_param的字典傳入鞭衩。
參數:
input_dim——輸入數據的維度(通道学搜,高娃善,長)瑞佩;
conv_param——卷積層的超參數(字典)聚磺,關鍵字為(filter_num,filter_size,stride,pad);
hidden_size——隱藏層(全連接)的神經元數量炬丸;
output_size——輸出層(全連接)的神經元數量瘫寝;
weight_int_std——初始化時權重的標準差。
參數的梯度通過誤差反向傳播法(將正向傳播和反向傳播組裝在一起)求出稠炬,各層已經實現(xiàn)了正向傳播和反向傳播功能焕阿,所以只需要以合適順序調用即可,最后把各個權重參數的梯度保存在grads字典中首启。卷積層和池化層是圖像識別中必備的模塊暮屡,CNN可以有效讀取圖像中的某種特性從而實現(xiàn)高精度識別。
13毅桃、CNN的可視化:學習前的濾波器是隨機進行初始化的褒纲,所以黑白濃淡沒有規(guī)律可循,通過學習钥飞,使得濾波器變成了有規(guī)律的圖像莺掠,這些有規(guī)律的濾波器通過觀察邊緣(顏色變化的分界線)和斑塊(局部的塊狀區(qū)域)從而做出響應。
在堆疊了多層的CNN中读宙,隨著層次加深彻秆,提取的信息也會越來越抽象,神經元從簡單的形狀向高級信息變化结闸,比如AlexNet網絡結構堆疊了多層卷積層和池化層唇兑,最后經過全連接層輸出結果,對于中間數據會連續(xù)應用卷積運算膀估。
14幔亥、代表性CNN:
LeNet——1998年首次提出的CNN元祖,是進行手寫數字識別的網絡察纯,有著連續(xù)的卷積層和池化層帕棉,最后經過全連接層輸出結果针肥。激活函數采用sigmoid函數,并且使用子采樣(subsampling)縮小中間數據的大邢惆椤慰枕;現(xiàn)在主流CNN主要采用ReLU函數并進行Max池化。
AlexNet——是引發(fā)深度學習熱潮的導火索即纲,網絡結構疊加多個卷積層和池化層具帮,最后經過全連接層輸出結果,區(qū)別主要是:①激活函數使用ReLU低斋、②使用局部正規(guī)化的LRN層蜂厅、③使用Dropout。