程式設計師小伙9行tensorflow代碼,演示卷積網絡(CNN),有代碼

引文:最近的膠囊網絡也真的是太火了,身邊的朋友也都在各種誇:什麼空間相對特徵的,那我就寫一篇入門級的CNN理解案例,作為自己在CNN領域的一個收尾,同時也給剛入門CNN的同學留下一些我學習CNN時記的筆記以及一些感悟,希望能幫到大家。

一、經典BP神經網絡在圖像處理方面的表現

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼

BP神經網絡

左圖為一經典BP網絡處理MNIST時常用的模型,由於MNIST數據集的像素為28*28,所以輸入層設為784個 節點。MNIST數據集只存在十種答案:0123456789, 故設定十個輸出節點,中間包含一層500節點的隱藏 層,用於提取像素特徵進行運算處理。

這裡我們不考慮數據是如何在其內部進行運算的,BP神經網絡的運算相信大家已經不陌生了,我們來計算 一下這個神經網絡資源耗費問題:

運算過程:輸入*weightes1+biases1……

浮點參數量:[28*28*1+500]*500+10 = 642010

這還只是個淺層的BP神經網絡,如果將深度增加到四 層,在內部添加一個500節點的隱藏層,那麼這個網絡 的浮點參數量將是: [(28*28*1+500)*500+500]*500+10 ≈3.2億

由此可見,越深的BP模型在訓練上所需要耗費的計算 機資源就越多,時間也就越長,對於開發者來說這是 將是一筆不菲的開銷。

缺點:

1、運算量大導致訓練時間過長

2、參數過多導致耗費系統內存資源

3、結構體系單一導致訓練效果不理想

針對以上這幾點問題,早在上個世紀七八十年代就給出了一種沿用至今的解決方案“感受野”,也就是我們現在所謂的卷積內核(kernerl)或過濾器(filter)。

在本篇文章中主要以卷積核的形式來為大家講解。

接下來,我們正式的進入卷積神經網絡的學習(CNN)

一個標準的經典卷積網絡,包含一個輸入層、若干卷積層、若干池化層和一個輸出層,當然也可能有多個輸出層,這些都是後話。

1.1 卷積

如下圖,設此圖的像素為5*5,我們設一卷積核大小為3*3,步長為[1,1],那麼我們最終的數據為整個像素塊與卷積核的加權和加上偏置項的和。 (此圖沒有偏置項)

卷積核工作原理

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼

計算方式

卷積核步長為1時,輸出的長寬尺寸為:原圖長寬– 卷積核大小+ 1

關於步長不為1的卷積處理所得到的公式 就留給大家當一個思考題。

通道:在實際情況中我們設立的卷積核的深度並不為1,卷積核的功能是要提取圖像的特徵,顯然單一的卷積核在提取多特徵並不現實,卷積核的深度就是卷積層的通道,通道數量等於當前卷基層輸出的深度,必須由人為設定。

多通道處理方式:實際情況中我們要處理的圖像深度大多不為1,學過圖像處理的同學可能比較清楚,如RGB色彩圖像(全綵圖)的深的就為3,雖然這相當於是三個值不同的單通道圖像,但也通過一批卷積核進行卷積處理。

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼

多通道卷積

如上圖,這是一個LeNet-5的第一層卷積,採用了5*5大小的內核,通道數為6,根據內核大小我可以計算出輸出的尺寸為28*28,通道數量依舊為6

講到這裡,我們不妨來考慮一個問題,我們剛才所講的是卷積核步長為1的例子,這些步長為1的卷積核都恰好計算圖像中所有的像素塊,那如果我們的圖像大小為3*3,卷積核大小為2*2,步長為2的時候呢?

我們的卷積核是不是就無法正常工作了?

針對以上的問題,我們引出了全零填充這個概念

1、全零填充(SAME)

卷積輸出輸入尺寸相同,不考慮卷積核的尺寸,缺失像素填充0。

2、不填充(VALID)

考慮濾波器尺寸。儘量不越過圖像邊界,也可能邊界被填充

讓我們回到上面的問題,這個時候我們對3*3的圖像進行全零填充,使之成為4*4

如下圖

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼

全零填充

這樣一來,我們的卷積核就可以對圖像進行卷機處理了。

1.2池化

池化的作用是對圖像的上採樣與下采樣:

上採樣是增加圖像的參照值, 從而獲取圖片更的信息,類似於放大圖片(像素和算法允許的情況下)

下采樣是縮小圖像尺寸,忽略細微差距,提高訓練速度與效率 常用的池化處理有兩種:

最大池化與均值池化

如下圖就是最大池化的計算過程。我們可以將下圖的池化想象為一個2*2空核,步長為2,其中包含 if語句用於篩選出當前空核所覆蓋的區域最大值並輸出。

關於均值池化就是計算空核所覆蓋區域的平均值並進行輸出

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼

最大池化過程

在CNN中採用下采樣居多,只對當前層參數進行運算處理,對於通道則不會進行運算。在池化層中也相應的有填充模式,參考1.1講的卷積填充方式是一樣的。

特點:

1、輸入通道等於輸出通道

2、尺寸改變

3、空核無參數

嚴格意義上來講,池化層並不屬於神經網絡中的layer,僅僅當作一個優化算法的工具

二、LeNet-5分析與實現

LeNet-5是在1998年被提出來用於解決識別手寫數字的第一代卷積神經網絡, LeNet-5中的數字5是指此網絡有五層結構,如下圖

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼

LeNet-5

在本模型中含兩層卷積、兩層池化和三層全連接,由於池化層在嚴格意義上來講並不將其歸為網絡深度,所以本模型只有五層。

當時我的筆記:一般的,我們在規劃卷積網絡時,將池化層當作工具對待,而不是單獨的“層”。而層必須包含可被訓練的Weight

講到這裡,我來給大家出一道思考小題:

求此卷積網絡中的參數量並與BP神經網絡進行對比

得出來的答案就是本文的核心問題:為什麼我們再圖像識別領域不推薦用BP模型

除了參數的數量,我們還要關注一個問題:模型訓練效率

在第一節給大家介紹BP網絡處理MNIST的模型,在使用RELU作為激活函數迭代10000次的精度為98.4%

而LeNet-5同樣使用RELU作為激活函數迭代10000次時的精度可以達到99.3%

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼

參考代碼

結語:本文僅給出了LeNet-5這種鼻祖類型的CNN供大家入門,有學習能力的同學還可以去了解一下VGG、Inception、AlexNet等等這些經典卷積模型.

我們專注深度學習社群。關注昂鈦客,跟小編交流。

程序員小夥9行tensorflow代碼,演示卷積網絡(CNN),有代碼


分享到:


相關文章: