手撕卷積神經網絡CNN
博主接觸CNN已有一段時間,寫這篇博客一方面是爲了加深自己的理解及記憶,另一方面是給初學者以啓發,同時也便於大家一起交流學習。
1.CNN發展史
簡單來說,CNN經過以下的發展史:
1.CNN的起源 1980年代末-1999年 ConvNet、LeNet-5
2.CNN停滯不前 2000年初 性能很難改進、SVM流行、反向傳播無法有效收斂到最佳點
3.CNN的復興 2006年-2011年 貪婪逐層預訓練方法、GPU、ImageNet
4.CNN的崛起 2012年-2014年 AlexNet、VGG、GoogleNet、R-CNN
5.CNN結構創新和應用迅速發展 2015年至今 ResNet、DenseNet、ResNext、Fast R-CNN、 Faster R-CNN、Mask R-CNN
2.CNN 基本組件
CNN基本結構如下圖所示:
2.1卷積層
爲了更好的理解卷積層,在這裏先舉個“栗子”:假設有張圖片,大小爲8*8,圖片中數字代表像素值,像素值越大,顏色越亮,圖中兩個顏色的分界線就是我們要檢測的邊界。
設計一個濾波器(filter,也叫kernel),大小爲3*3,然後,我們用這個filter,往我們的圖片上“蓋”,覆蓋一塊跟filter一樣大的區域之後,對應元素相乘,然後求和。計算一個區域之後,就向其他區域挪動,接着計算,直到把原圖片的每一個角落都覆蓋到了爲止。這個過程就是 “卷積”。
可以看到邊界被檢測到了,這就是卷積的神奇之處:
卷積的具體細節如下圖所示,簡單明瞭。
2.2池化層
池化,即下采樣,主要用於特徵降維,壓縮數據和參數的數量,減小過擬合,同時提高模型的容錯性。主要有:Max Pooling:最大池化;Average Pooling:平均池化。
2.3全連接層
全連接層通常在網絡末端用於分類任務。與卷積和池化不同,它是全局操作,它從前一層獲取輸入,並全局分析所有前一層的輸出。
這裏需要說明的是,在經過數次卷積和池化之後,我們最後會先將多維的數據進行“扁平化”,也就是把 (height,width,channel)的數據壓縮成長度爲 height × width × channel 的一維數組,然後再與 FC層連接,這之後就跟普通的神經網絡無異了。
2.4兩大特徵
1.權值共享
CNN中每一層由多個map(特徵圖)組成,每個map由多個神經單元組成,同一個map所有的神經單元共用一個卷積核(即權重),卷積核跟上一層圖像卷積往往得到圖像的一個特徵,權值共享策略減少了需要訓練的參數,使得訓練出來的模型的泛化能力更強。
權值共享也實現了特徵與位置無關性,圖像的一部分的統計特性與其他部分是一樣的。意味着在這一部分學習的特徵也能用在另一部分上,所以對於這個圖像上的所有位置,都能使用同樣的學習特徵。
2.局部連接
所謂局部連接,就是卷積層的節點僅僅和其前一層的部分節點相連接,只用來學習局部特徵。局部感知結構的構思理念來源於動物視覺的皮層結構,其指的是動物視覺的神經元在感知外界物體的過程中起作用的只有一部分神經元。在計算機視覺中,圖像中的某一塊區域中,像素之間的相關性與像素之間的距離同樣相關,距離較近的像素間相關性強,距離較遠則相關性就比較弱,由此可見局部相關性理論也適用於計算機視覺的圖像處理領域。
如下圖,卷積核大小爲22, 隱藏層有9個神經元,即經過卷積後輸出爲33的特徵圖,可以看到每個隱藏層只與4個輸入輸入神經元相連,這就是局部連接;而權值共享體現在每個隱藏層神經元與輸入層神經元連接的權值是一樣的,這樣就做到了權值共享,減少參數。
3.CNN的應用
1.圖像分類、檢索
2.目標定位檢測
3.目標分割
4.步態識別
4.CNN研究
基於keras的LeNet-5模型可視化、網絡特徵可視化及kernel可視化
深度學習一直被人們稱爲“黑盒子”,即內部算法不可見。但是,卷積神經網絡(CNN)卻能夠被可視化,通過可視化,人們能夠了解CNN識別圖像的過程。
4.1三種可視化方法
1.卷積核輸出的可視化(Visualizing intermediate convnet outputs (intermediate activations),即可視化卷積核經過激活之後的結果。能夠看到圖像經過卷積之後結果,幫助理解卷積核的作用。
2.卷積核的可視化(Visualizing convnets filters),幫助我們理解卷積核是如何感受圖像的。
3.熱度圖可視化(Visualizing heatmaps of class activation in an image),通過熱度圖,瞭解圖像分類問題中圖像哪些部分起到了關鍵作用,同時可以定位圖像中物體的位置。
4.2模型構建
model = Sequential()
model.add(Conv2D(6,(5,5),strides=(1,1),input_shape=(28,28,1),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(16,(5,5),strides=(1,1),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(120,activation='relu'))
model.add(Dense(84,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])
model.summary()
4.3網絡特徵可視化
4.3.1輸入圖片
4.3.2第一個卷積層可視化
4.3.3第一個池化層可視化
4.3.4第二個卷積層可視化
4.3.5第二個池化層可視化
4.3.6卷積核可視化
5.總結與致謝
大家閱讀到這裏就要結束了,感謝大家的閱讀,有什麼問題歡迎大家評論,最後轉載請註明出處。
最後附上代碼鏈接://download.csdn.net/download/qq_35874169/12062372,無積分的可私信博主發郵箱,謝謝!