1. 程式人生 > >Deep Learning 讀書筆記(七):關於CNN的實際例子

Deep Learning 讀書筆記(七):關於CNN的實際例子

        昨天晚上開了組會,主要是給新成員入下門,講完之後,感覺大家理解上還是有些困難,入門總是會辛苦些,但確實有些概念會感覺有些抽象。因為打算從CNN入手,所以這篇部落格呢,會結合CNN的具體例子,說說整個網路到底是一個怎樣的流程。當然咯,想要了解細節,還得回到我之前寫的那篇部落格中去關於CNN的各種。這篇部落格主要結合了下面三篇論文:

        (1)Multi-column Deep Neural Networks for Image Classification

        (2)Multi-Column Deep Neural Network for Traffic Sign Classification

        (3)Flexible,High Performance Convolutional Neural Networks for Image Classification

        從題目中就可以看出,這三篇主要是講多列CNN,這個思想還是很簡單的:就是構建多個CNN模型,輸入訓練資料,綜合各個模型的輸出結果,最後給出最終的結果。類似於一個提升模型。其實,這樣做也有一定的生物依據,試想,我們人腦中的視覺神經不可能只有一條路徑吧。有文章說明:即使我們不對CNN組合起來的網路進行任何的優化,只是對這些網路的輸出取平均值,也能夠取得比較好的效果。而本文中也正是採取這樣的做法。

        整個模型的訓練過程如下:

        從圖中可以看出,在訓練開始之前,需要對訓練資料進行預處理。這個預處理過程並不是一個隨機的過程,對圖片採取的平移、旋轉和縮放的程度是隨機的值。一般來說,對圖片進行平移的值會是,對圖片進行縮放的比例會是0.9-1.1,而旋轉的程度是。之後會對圖片進行雙線性插值來獲取原圖片大小的圖片作為新的訓練資料。

       在模型初始化時,對不同列的CNN都是賦予隨機的初始值。試驗發現,如果我們使用相同的訓練資料來訓練這些多列的CNN,會導致訓練誤差會有較強的關聯性。因此,我們需要為這些不同列的CNN輸入不同的訓練資料。要達到這樣的目的其實很簡單,只需要在預處理階段使用不同的方法,或是不同的值就可以。

        有試驗表明,如果使用相同的資料來訓練一個多列CNN和一個單列的CNN,多列CNN的效果要比單列的好,這就表明了並不是因為訓練資料上的原因而使得多列CNN的效果要更好。

       文章中還證明了無監督的初始化方法或是預訓練的方法都是沒有必要的。目前,Deep Learning的研究熱點就在於無監督或是半監督方法的研究,因為大量的資料都是無標籤的,無監督或是半監督的方法應用的並不是很廣泛。但是否對於CNN這樣一種網路,網路的結構就預示著無監督的方法就是沒有必要的呢?這是非常值得思考的一點。

        整個網路的模型結構如下圖示:

 

        接下來,我們就來仔細分析下這個圖。首先對於輸入影象,我們需要將其分成3個channel來進行處理。在第一層卷積層中,模型感受野的大小為7x7,同時使用了300個濾波器。這樣,對於卷積之後每一個影象的大小為42x42(48-7+1,這裡使用的是傳統的卷積方法,只是向右移動一個單元)。之前,是將影象分成3個channel來處理,我們可以理解為提取出了影象的三個特徵,而後一層中提取出了影象的100個特徵,聯絡到這裡使用了300個濾波器,我們可以得知,前一層的map與後一層的map之間是全連線的關係。對於第二層池化層,我們所使用的池化區域的大小為2x2,所以池化後,圖片的大小就變為了21x21。L2到L3之間的變化與輸入層到L1之間的變化是相同的,前一層的map與後一層的map之間也是全連線的關係,不同之處就是卷積區域的大小發生了變化。之後也沒有什麼特殊的變化過程需要說明的了。最後就是在L6中,池化之後區域的大小為3x3,我們怎樣將其變成一維的向量呢?有兩種選擇方法,第一,就是對其使用一個3x3的卷積,第二,就是使用一個全連線層,將其過渡到1x1的大小。這裡選擇的就是第二種方法。最後,是一個softmax層,模型輸出的大小與所需分類的數目是相等的。

        我們可以參照這樣一種分析方法,來對之前那篇部落格中ImageNet模型進行分析,因為那篇文章中所使用的trick比較多,如果能準確的分析出來,對CNN還是能夠有比較深的理解。

        其實,現在很多關於Deep Learning的程式碼都是通過GPU來跑的,特別是與影象有關的一些程式碼,因為GPU對於二維卷積操作有著很好的優化,能夠使得訓練速度有著顯著的提升。現在的兩大顯示卡廠商NVIDIA和AMD對於GPU程式設計都提供有很好的藉口,Deep Learning也有方向來做演算法效能的優化。所以想要在Deep Learning方面有較高的造詣,這一方面也是必不可少的。這一方面,我就不能提供給大家更多的東西了。

        這一篇水文終於結束了。