目錄
1.5.2 當步幅導致結果不爲整時的處理方式:向下取整(直接去掉小數位)
1.1 計算機視覺
語音識別:speech recognition
計算機視覺:computer version
圖片分類:image classification
圖片識別:image recognition
目標檢測:object detection
卷積運算:convolutional operation
1.2 邊緣檢測示例
filter:過濾器 卷積計算中又稱卷積核
* 在數學中表示卷積 但是在Python中則表示矩陣對應元素相乘
卷積運算的命令:
Python : conv_forward
TensorFlow :tf.nn.conv2d
Keras :Conv2D
1.2.1 卷積核(濾波器)檢測邊緣的原理
就像它的名字一樣,濾波器,只允許它想要的波通過,而濾除其他的波。
例如:下面是一個檢測垂直邊緣的卷積核。不難看出這是一個三列像素差距大的矩陣,具有明顯的垂直邊緣。
1 | 0 | -1 |
1 | 0 | -1 |
1 | 0 | -1 |
我們用它去檢測一幅圖像的垂直邊緣,原理是什麼呢? 就是類似濾波器,因爲它本身就是垂直邊緣特別明顯,所以當它滑過圖像時,圖像中的哪一部分跟它很相似,則卷積結果值比較大(對應像素同號相加值大),相反,不相似的區域則卷積結果值小。就是通過這樣的方式來檢測垂直邊緣的。類似濾波器 在圖像上濾了一遍讓邊緣部分通過,其他部分不通過。
1.3 更多邊緣檢測內容
Sobel 濾波器 Scharr 濾波器
我們的目的:通過訓練找到更適合的參數矩陣,而不是直接用已有的檢測矩陣。現有的邊緣檢測矩陣只是檢測垂直水平邊緣。通過訓練我們可以找到一個邊緣檢測核可以檢測任何類型的邊緣(傾斜的,或者其他),這用於檢測整個圖片的邊緣。
1.4 padding(填充)
卷積計算矩陣大小公式: 待卷積矩陣 n*n 卷積核 f*f 則卷積後的矩陣 (n - f + 1)* ( n - f + 1)
1.4.1 爲什麼要填充
- 通過上面的卷積計算我們不難發現,每進行一次卷積我們的圖像就變小一次,這樣幾次之後我們的圖像可能就變成了一個像素點。因此需要填充使卷積後的圖像大小不至於急速變小
- 也是重要的一點:觀察不難發現我們圖像的四個角的點只經過了一次卷積,而中間的點卻經過了多次卷積,邊緣上的點經過的卷積次數少於裏面的點,這樣的結果是圖像邊緣的信息提取的太少,導致圖像四周邊緣信息丟失。
1.4.2 怎樣填充邊緣以及常用填充方法
1. 在圖像的四周增加一個單位的像素值0,這時認爲padding值 p =1。如果增加兩圈 則 p = 2
2. 視頻中將的是用0去填充,但是我認爲肯定還有其他填充方式,有待考究。
3 常用的填充方法:Valid 卷積和 Same 卷積
Valid 卷積的含義就是不填充
Same 卷積的含義就是填充後使卷積後的圖像大小不變
1.4.3 填充後的矩陣計算公式
設填充單位爲p=1 :就是圖像四周填充一個單元。則卷積後的矩陣大小爲 (n + 2p - f + 1) * (n + 2p - f + 1)
例如我們前面的例子n爲6 f爲3時,填充 p =1 則卷積後的矩陣大小爲 (6 + 2 *1 -3 +1)* (6 + 2 *1 -3 +1) 即6 *6 卷積後圖像的大小沒變。
1.4.4 卷積核的大小爲什麼是奇數
1 如果想使卷積後的圖像大小不變則填充p的大小爲 (n + 2p - f + 1) = n p=(f -1)/2 從這裏不難看出,f必須爲奇數時p纔有意義
2 卷積核大小爲奇數時 卷積核會有一箇中心點 這對於進行卷積分析有很大的方便
3 國際通用都是奇數 例如 1*1 、3*3、 5*5、7*7 等
1.5 卷積步長
前面的計算公式都已基於卷積核在圖像中每次移動一個像素,即步長爲1.
當步長爲2時我們可以看到向右移動和向下移動都是兩個像素。
1.5.1 加入步長後的計算公式
n*n 待卷積圖像大小 p :填充單位 f *f 卷積核大小 s 步幅大小
(n + 2p -f)/ s + 1
1.5.2 當步幅導致結果不爲整時的處理方式:向下取整(直接去掉小數位)
例如當n =6 f =3 s =2 時,通過演示不難發現卷積核水平卷積時只能滑動兩次,第三次則出界了。但是我們卷積的原則是:卷積核必須全部在被卷積的圖像內,所以當有部分卷積核不在圖像內時,則放棄這次卷積。那麼我們卷積後的矩陣大小爲 2*2
用公式直接計算爲(6 - 3)/ 2 + 1 = 2.5 我們直接向下取整 爲2 則卷積後的矩陣大小爲2*2 跟我們演示實驗的結果一樣。
補充: 爲什麼這裏的卷積不同於數學中的先翻轉再求和
不難看出我們進行的卷積運算是直接拿卷積核去比對圖像進行計算的,而沒有向數學中或者數字信號處理中的那樣先進行翻轉再求和。
因爲跟確切的來說我們這裏的卷積應該叫互相關更好,但是爲了方便,規定仍叫它卷積。所以就是一個更好的說法而已。
1.6 在三維圖像上進行卷積計算
- 圖像三個通道 RGB 大小爲 6*6*3
- 卷積核也是三個通道才能對圖像進行卷積 大小爲 3*3*3
- 卷積後的圖像是一個二維矩陣 爲 4*4*1
卷積步驟:
卷積核的三個卷積面分別對圖像的三個面進行卷積,將(每個卷積面和每個圖像面卷積的結果)再相加得到一個結果。意思好理解:以前是二維的卷積,每次只得到一個值。這裏是三個覈對三個圖,每次得到3個值,再把這三個值相加得到一個最後的值。所以卷積最後的結果是一個二維矩陣。
- 卷積核的通道數必須與圖像的通道數相同才能進行卷積。
1.6.1 三維圖像卷積的用途
- 可以單獨對一個圖像的通道進行處理。例如我們要檢測R通道的邊緣,我們就把對應R通道的卷積核設置爲邊緣檢測核,其他兩個通道的卷積核直接全爲0就行了。
- 還有一個重要的用途。現實中我們要處理的是彩色圖像時不能再用一個卷積核(面)就去對應彩色圖形的三個通道,這是無法對應的,所以就有了卷積核體(3個核面)。
- 我們用一個卷積核體去提取圖像的一個特徵,例如這個卷積核體只檢測圖像的垂直邊緣。另外一個卷積核體去檢測圖像的水平邊緣。這樣我們得到了兩個二維的矩陣分別代表着圖像的垂直和水平邊緣特徵。我們把這兩個二維圖像堆疊,就得到了一個4*4*2 的三維體,這就是圖像的特徵體。
- 不難發現,一個卷積核體計算出一個圖像的特徵,用n個卷積核體就得到了n個二維特徵圖。把這n個二維圖堆疊就得到了一個4*4*n的特徵體。
其實我覺得它這個東西還是前面卷積的擴展罷了。因爲現實中我們要面對的肯定不僅僅是二維灰度圖,更多的肯定是RGB圖,但是思想還是一樣的。
補充:卷積計算的參數與全連接的參數比較
- 這裏需要牢記的一點是:卷積中我們規定了卷積核(體)的個數以及大小,所以這一層的參數個數是一定的。而不管輸入的圖像是100*100 還是10000*10000 我們的參數都是一定的。例如 我們用10個3*3*3的卷積核體來提取十個特徵,那麼我們的參數就是()3*3*3 +1(這個1是每一特徵圖的偏置 就是b))= 280 僅僅需要280個參數!!!
- 加入是全連接 輸入是100*100 隱含層節點數是200 那麼參數就是 200 * 10000個 遠大於 280個!!!!!!
- 這種減少參數的方法稱爲“避免過擬合”
1.7 構建單層卷積網絡
、 這裏講到了一個思想就是:卷積層的輸入不僅僅是圖像。後面的卷積層的輸入就是前面卷積提取的特徵map,所以上面我們說要把n卷積核體計算得到的n個特徵圖構成一個n通道的特徵圖體,原因就是在這呢。後面後面再進行卷積計算就會以前面的n通道特徵圖體爲輸入了,我麼的下層卷積核體的通道數要入輸入通道數匹配。
1.8 簡單卷積網絡示例
這裏給出了三次卷積後圖像的變化以及最後的展開實現分類。
各個數字符號解釋
輸入層 | 第一個卷積核層 | 第一個輸出層 | 第二個卷積核層 | 第二個輸出層 | 第三個卷積核層 | 第三個輸出層 | 全展開 | 輸出 | |
---|---|---|---|---|---|---|---|---|---|
大小 | 39*39*3 | 37*37*10 | 17*17*20 | 7*7*40 | 1960*1 | ||||
步長 | |||||||||
填充 | |||||||||
核體個數 | 10 | 20 | 40 | sigmoid二分類 0.1 | |||||
softmax多分類0,1,2... | |||||||||
高 | |||||||||
寬 | |||||||||
通道數 | |||||||||
表示方法 |
注意地方:
- 因爲輸入的是一個三維圖像,所以每一個核函數體都是三維的,否則無法計算。
指的的核函數的大小即 高=寬=3 核函數體默認都是與前面的輸入維度是相同的。例如
這裏的每一個核函數體都是 5*5*10的,即維度爲10
- 不難看出 我們的圖像的大小是逐漸變小的,從39 到 17 到7,。但是我們的卷積核體的個數是逐漸增加的 從 10 到 20 到40 。這是一種規則、
- 最後我們得到的是一個 7*7*40 的輸出層,爲了最後的分類識別,我們需要將這40個二維矩陣一個一個展開成一個 1960*1 的一維列向量。 最後我們再用一個線性計算計算它的輸出。(就和前面的學習的神經網絡的最後一步相同了)
- 這僅僅是爲了演示所以只包含了卷積層。一般一個卷積神經網絡 包含三種類型的層:卷積層、池化層、全連接層 全連接層就是上面我們說的將7*7*40 變爲1960*1 而池化層就是採樣層
1.9 池化層
縮減模型的大小,提高計算速度。提高所提取特徵的魯棒性
- 池化層的計算步驟,例如如下:我們的池化核爲2*2 的average pooling核 ,步幅爲2,就是平均值池化,取平均值。
1.9.1 多維圖像的池化計算方法
-
假如輸入的是一個 5*5*3 的圖像,我們的池化核的大小爲 2*2*1 則輸出的矩陣大小是 3*3*3
-
從這裏不難看出:池化核是二維的,它並不要求與輸入的通道數相同,但是,它的輸出是與輸入的通道數相同的。也就是它執行了這樣一個過程:在輸入通道的每一個通道上分別執行池化操作,各輸出一個池化結果。
-
這與前面的我們卷積核的通道數要與前面輸入圖像的通道數相同是完全不一樣的!!!池化核無論何時就是一個二維矩陣
1.9.2 池化核參數不需要訓練
- 在後面的視頻裏提到了池化的更明確的概念。:池化層沒有權重和參數。池化核的元素不叫參數或者權重而叫超級參數。
- 關於超級參數的設置:吳恩達的建議是常規是不要自己設置超級參數,而是查看文獻中別人使用了那些超級參數。選一個在別人任務中效果很好的架構,那麼它也有可能適用於你自己的應用程序。
- 池化一般分爲兩種:max pooling 和 average pooling 即最大池化和平均池化。。但是最大池化是神經網絡中應用最廣泛的,一般都用它。
- 一般用的池化核的大小 是 2*2 步幅爲2 不適用padding 這樣池化後 矩陣的高度和寬度會減半。
- 從上面的圖我們不難發現:爲什麼沒有畫出池化核呢?因爲你想想:我們要做的就是一個max pooling的過程,也就是這個規則已經定了。我們的池化核的作用就是取最大值,所以它的參數是已定的,不需要根據輸入改變。所以我們的池化核參數不需要經過梯度下降修改。
- 這個核具體的內容視頻中沒有給出,後續待看。
1.10 卷積神經網絡示例
這裏以著名的lenet-5爲藍本介紹了一個完整的卷積神經網絡的構造。
關於這個我們必須明確一些概念:
- 層的稱呼。因爲池化層的沒有參數或權重,它有的是超級參數。所以有的人更習慣將池化層和與它相連的前一層卷積層合稱爲一層。吳恩達就是這樣的:從圖中不難發現,他將第一個卷積層和第一個池化層稱爲 layer1 。但是有的是分開稱呼它們的,如將第一個卷積層稱爲layer1 第一個池化層稱爲layer2
- 層的稱呼的含義。圖中看出我們是不顯示卷積核層的,我們的CoNV1 的含義就是:卷積後的輸出 同理:Pool1 也是池化後的輸出
- 圖中看出我們卷積-池化結束後的輸出是一個400*1的列向量。FC3是我們的第一層全連接的輸出。它是怎麼來的呢?:類似我們的簡單全連接網絡,此刻我們設置了120個輸出節點,那麼這一層我們需要的參數矩陣就是 120*400
- 同理FC4是我們的第二個全連接輸出層,我們設置84個輸出節點,與前面的120個節點連接,所需參數矩陣大小爲 84*120
- 最後我們經過一個softmax 處理將84個輸出 轉化爲我們的分類標籤。
- 這是由 卷積——池化——卷積——池化——全連接——全連接——softmax 構成的卷積神經網絡。
- 顯示中還有其他類型的結構組合方式 如 連續卷積再池化等。但是上面的lenet-5結構是最常用的。
- 這裏提到了一個思想:我們怎樣選擇超級參數以及網絡架構,吳恩達給出的建議是大量閱讀別人的案例。
這是各個層的大小及參數:
- 卷積層爲什麼是208 呢,因爲卷積層有8 個 5*5 的卷積核 注意了:每一個卷積核都對應一個 偏置b (聯想Python廣播)
- 這裏還有一個隱含的重要的思想:不難發現在卷積層雖然我們的卷積核體也是三維的即 5*5*3 但是它的參數僅僅是5*5個。這也隱含的告訴了我們這樣的思想:這樣一個卷積體我們其實只用它的一層,其他兩層我們不用(直接全爲0)。這樣的緣由是我們的圖像是三層的,這樣我們這一個卷積核體要對圖像做什麼操作時,例如只對R通道處理,這樣我們只需把對應R面的那個卷積面設置一下就行了。下一個卷積體如果只對B通道處理,那麼我們就把它的對應B的核面設置就行了。。這樣方便了很多,要不我們還得指定一個二維的卷積核去對應圖像的哪個通道。
- 這裏還能看出大部分參數都位於全連接層,卷積層倒是有很少參數
- 圖像的大小是逐漸減小的,但是也不能下降的太快,所以採用兩個全連接層。
1.11 爲什麼使用卷積
權值共享
局部連接
1.11.1 和全連接相比卷積的優勢
優勢:所需要的參數大大的減少
- 參數共享和稀疏連接
- 如果一個垂直邊緣檢測器(核)對圖片中的某一部分有效,那麼它也應該對圖片的其他部分有效。所以來了權值共享
- 因爲卷積神經的特性,圖像即便移動幾個像素依然具有非常相似的特徵。
補充:爲什麼一個卷積核只對應一個參數b
看出,右邊所有的每個像素都對應的是同一個卷積核(權值共享),b和參數是一體的,但是對應的也是同一個b