Computer Vision
Computer Vision有兩個具體的問題類型:
- Classification,例如分類圖片中有沒有貓
- Object Detection,例如識別路上的汽車並圈起來
對於這些Computer Vision的問題,神經網絡在處理的時候,最主要的問題是:規模變大。例如一個1000x1000x3,一個圖片就是3M的數據量。那麼對於一箇中間層,假如一箇中間層是1000個neuros,那麼
所以原有的神經網絡就不能這樣使用了,那麼就需要引入卷積層。
邊緣檢測
圖像的邊緣檢測這塊其實就是數字圖像處理的內容了。一些邊緣檢測算子,例如豎直邊緣提取的filter:
水平邊緣提取的filter:
sobel算子和schhar算子
附上一些關於sobel算子和scharr算子的一些額外內容:
https://stackoverflow.com/questions/17078131/why-sobel-operator-looks-that-way
https://blogs.mathworks.com/steve/2006/10/04/separable-convolution/
Valid, Padding and Stride Convolution
Valid:正正常常的
nh×nw 圖像和f×f 進行卷積,輸出結果是(nh−f+1)×(nw−f+1) 。因爲filter的半徑是f−12 ,需要把半徑減掉,兩邊都剪掉就是現在這個結果。Padding:在邊緣進行補足,使得最後輸出結果還是
nh×nw ,那麼就是nw+2p−f+1=nw ,那麼p=f−12 ,其實就是把濾波器的半徑補上,兩邊都補半徑。Stride:就是中間每s個卷積一次,那麼最後輸出的結果尺寸就是
⌊nw+2p−fs+1⌋×⌊nh+2p−fs+1⌋ 。推導過程其實很簡單,對於n×n 來說吧,能用的像素是N=n+2p−f+1 個上邊已經推導了,然後N 如果能夠整除s,那麼就是N/s個,如果不能整除,那麼就是⌊N/s⌋+1 ,所以這兩種最後可以歸併爲⌊(N−1)/s+1⌋ ,
Volume Convolution and Multiple Filters
如圖所示,對於一個RGB的圖像,filter一般都是3通道的,做了element wise multiplication之後總體sum,所以例子中6x6x3卷積上3x3x3之後會得到一個4x4的圖像。當希望用多個filters時,則是列舉好多個filter一起卷積,然後把結果堆疊起來。
One Convolutional Layer
幾個要點:
- RGB圖像作爲
a[0] Z[1] 是類似於全聯通的w[1]a[0] ,然後會加上一個常數項b - 然後加上ReLU作爲
g(⋅) ,得到a[1]=g(z[1])
一個例子是:如果一個卷積層是有10個3x3x3濾波器,那麼這一層的參數值是多少?
答案是:280,因爲10個濾波器是270個參數,加上10個bias/b,一共280。值得注意的是,這一層無論輸入是多大的圖片,無論是64x64還是1000x1000,都是這麼多參數。
Notations / Convetions
ConvNet Example
這個裏邊沒啥特別的。
Pooling layer 池化
Pooling有兩種:
- Max Pooling
- Average Pooling
Max Pooling 用的比較多,其實就相當於極大值濾波(非線性濾波的一種),所以也一樣有
爲啥要用Max Pooling,到目前爲止沒有人能說清楚(Andrew Ng說的),Dr. Ng給出的一個通俗解釋就是:假如在某一層的Max Pooling的輸入是一個4x4的圖像,你可以把它認爲成是某一類特徵在空間上的分佈。這個特徵可以是各種各樣的,比如一個豎的邊緣,又或者是一個貓的眼睛,又或者是貓的鬍鬚等等。一個比較大的數,表示的是某一類特定的特徵檢測到了,而這個比較大的數所在的位置,比方說是右上角,那麼就可以說右上角存在着這個特徵。所以max pooling做的事就是:如果在某一個位置上檢測到了某類特徵,那麼就在這個位置上(或者相對位置,比方說右上角)把這個特徵保留起來;如果在某些區域沒有某類特徵,那麼取了最大值也很小,代表了這個區域上就沒有某一類特徵。
額,上邊是譯文,通俗點說就是,比方說貓的一組特徵是眼睛,眉毛和耳朵,這個眼睛眉毛和耳朵應該在左上角,那麼檢測到眼睛、或者檢測到耳朵了,左上角的某一個值就比較大。取最大值之後就會把左上角的特徵傳遞給下一層(一個大區域縮成一個pixel)。而假如在某個區域啥都沒檢測到,那麼就說明最大的那個值,也很小,那麼就把這個小數傳遞給下一層。
不過Dr. Ng也說,其實人們用max pooling的原因,主要是因爲在實驗中它好用。
Average Pooling
這個很少很少用,不過Dr. Ng說了一個例子,就是當網絡非常非常深的時候,比方說到了一個4x4x1000的層,那麼就把這個層給平均了,得到一個1000的向量。
一個示例(LeNet-5)
可以看到,這個裏邊有很多超參數,一般來說,不要一上來就自己去設置超參數,建議先用已有的結構來做。每一層的output的數值量不要下降的太快,否則性能不好。
爲什麼要用卷積?
- Parameter Sharing: 對於一個特徵提取器(濾波器)在圖像的一個地方管用,那麼一般也會在另一個地方管用。比方說豎直邊緣檢測濾波器。
- Sparsity Connections
其實就每一個卷積計算結果而言,跟它有關的也就是那3x3個數。其他地方的數跟他沒關係。(不過沒講爲啥這樣好。。。)
另外還有就是卷積會帶來平移不變性,shift invariance。也就是卷積會在圖像平移了幾個像素之後,還是帶來相似的特徵。
習題精選
in lecture we talked about “parameter sharing” as a benefit of using convolutional networks. Which of the following statements about parameter sharing in ConvNets are true? (Check all that apply.)
[√] It reduces the total number of parameters, thus reducing overfitting.
[x] It allows gradient descent to set many of the parameters to zero, thus making the connections sparse.
[√] It allows a feature detector to be used in multiple locations throughout the whole input image/input volume.
[x] It allows parameters learned for one task to be shared even for a different task (transfer learning).