1. 程式人生 > >CNN學習一:概述

CNN學習一:概述

前言

本系列文章介紹學習CNN的過程,並結合Tensorflow來使用CNN進行影象的識別

CNN概述

卷積神經網路是在普通的BP全連線的基礎上發展而來的,CNN重點就為了解決BP全連線網路中因為網路權值引數過多而導致的無法訓練的問題,CNN提出的區域性連線、權值共享、池化技術都是出於減少網路引數的目的。如下圖所示:圖1.全連線網路的缺陷與CNN的區域性連線 假如我們的網路模型是:  輸入層->一層隱含層->輸出層  樣圖是1000x1000的影象,把它變行向量就是1x1000000的向量 。如果隱含層設定為1000000個節點,那麼根據全連線的定義輸入層的每一個元素都要連線到隱含層中,此時輸入層與隱含層之間的權值矩陣 的大小應該為1000000*1000000=10^12 ,這是蠻恐怖的。

現在我們使用區域性連線的方法來減少引數。我們規定,隱含層還是1000000個神經元,但是每個隱層的神經元只和輸入層的10*10個像素髮生關係。比如說圖1右邊,我們讓黑色的神經元只與圖片的右上角那一塊塊發生關係。  這個時候,隱層的每個神經元就只要100個引數就行了,然後輸入層與隱層之間的引數就剩下10^8啦,一下子少了4個數量級,還是蠻厲害的。但是10^8也還是很多啊,每一層10^8還是幹不過。怎麼辦嘞?於是就出現了權值共享···

什麼是權值共享嘞?

這就是權值共享!通過這樣的設定,這一層的引數一下子就只剩下100個吧!!社會、社會!後面,設計者發現這樣瞎幾把規定不好收場,於是搞出來一套理論來自圓其說:同一層的使用的權值矩陣叫做特徵提取器,我們覺得每一層只提取一種特徵就好啦,所以可以讓同一層的特徵提取器被這一層的神經元共享。為了提取不同的特徵,大家需要多使用幾層哈,多來幾層,特徵就來了唄。

  上面是大白話的理解。

區域性連線、池化技術的是現代生物神經網路相關研究的啟發。權值共享則是設計之初規定的,單獨一層的權值是共享的(不要問為什麼,因為這種做法可以大大減低每一層的引數個數,另外這種設計的出發點是認為如果每一層的權值共享的話,那麼這層的權值就用於提取某一特徵。若要提取不同的特徵,設定多層網路即可)。這就是CNN的核心思想。

具體結構

概述說了CNN的核心思想是為了減少引數,主要通過區域性連線、池化、權值共享來實現的。我們把權值共享當做一規定,展開下面的內容。

區域性連線

區域性連線即是本層的神經元只與上層的某些神經元發生關係。那我們熟悉的運算中有哪些是專門用來顯示類似的,輸出只和輸入的一部分有關的呢?很顯然,卷積運算就是其中一種典型代表。

圖2 卷積示意圖 如圖2,左邊的原圖,右邊是卷積運算後的結果。右邊的每一個元素都是原圖的區域性9領域與卷積核卷積而得到的。這種運算正是我們所想要的區域性連線!

於是在CNN裡面就是使用卷積運算來實現區域性連線的構想。下面的動圖很好的解釋了卷積的區域性性: 卷積

同時,我們也知道使用卷積運算可以對影象進行特徵提取,例如使用Laplace運算元進行邊緣特徵提取,區域性連線使用卷積運算後也可以看做是在使用某個卷積核對上層輸出進行某種特徵的提取。

池化技術:

池化技術又稱取樣技術,這種技術本質也是對區域性連線後的結果的進行整合提取,這麼做的目的主要是為了減少引數、減少輸出節點個數,同時降低過擬合的程度。池化/取樣的方式通常有以下兩種:

 Max-Pooling: 選擇Pooling視窗中的最大值作為取樣值;   Mean-Pooling: 將Pooling視窗中的所有值相加取平均,以平均值作為取樣值;

其示意圖如下: 圖3 池化示意圖

它將原來卷積的結果整合成一個2*2的輸出矩陣,這個聚合能力還是蠻厲害的。然而!正因為池化的能力太厲害,它過快的減少資料的大小,所以目前有很多網路傾向於聚合能力低的池化層,甚至直接不用池化層。

損失函式層

損失函式層(loss layer)用於決定訓練過程如何來“懲罰”網路的預測結果和真實結果之間的差異,它通常是網路的最後一層。各種不同的損失函式適用於不同型別的任務。例如,Softmax交叉熵損失函式常常被用於在K個類別中選出一個,而Sigmoid交叉熵損失函式常常用於多個獨立的二分類問題。歐幾里得損失函式常常用於結果取值範圍為任意實數的問題。

CNN的網路結構:

一般CNN高層結構