吳恩達.深度學習系列-C4卷積神經網絡-W1卷積神經網絡基礎

學習目標

  • Understand the convolution operation
  • Understand the pooling operation
  • Remember the vocabulary used in convolutional neural network (padding, stride, filter, …)
  • Build a convolutional neural network for image multi-class classification

1.計算機視覺

應用方式:
- Image Classification
- Object detection
- Neural Style Transfer
在大圖片上進行深度學習。普通學習圖片可以達到1000*1000*3(通道數)的級別。將是一個有3,000,000(3 million)特徵數的輸入。

2.邊緣檢測示例

這裏寫圖片描述
垂直邊緣檢測,在課堂的實例中其實是使用了一個Prewitt的filter(filter過濾器,【圖像處理】濾波器模板,神經網絡的卷積核kernel指的都是一個意思)。參考本筆記12.2。

數學裏,星號是卷積的標準符號,×是乘號。但是一般編程語言裏星號 表示乘法。卷積操作是矩陣求內積。

Horizontal[111000111]Vertical:[101101101]

3.其他邊緣檢測

這裏寫圖片描述
如上圖上下所示。
顏色由深變淺,產生正邊緣。顏色由淺入深,產生負邊緣。
更據filter的不同數值填入,檢測器會具備一些獨特的邊緣檢測,除了水平、垂直檢測,還有可能45度檢測,75度檢測,72度檢測等等等等。

卷積神經網絡的獨特之處:將filter中的元素當作參數去學習,並通過反向傳播讓模型自己去學習該設置什麼值。而這將生成更加善於捕捉你的數據的統計學特徵的過濾器。並且很有可能超過CV專業人員精心設計的filter數值。簡而言之,訓練CNN在相當意義上是在訓練每一個卷積層的濾波器。讓這些濾波器組對特定的模式有高的激活,以達到CNN網絡的分類/檢測等目的。

這裏寫圖片描述

在單層卷積後,通常能提取出橫向、縱向、斜向的邊緣這樣的簡單特徵。經過多次卷積後,filter能通過學習提取出複雜的組合特徵。例如眼睛、鼻子等等由多種線條組合而成的圖形,這些高維特徵是一系列低維特徵的組合。在一些論文中有將這些卷積後的圖片顯示出來供研究人員觀察,觀察卷積網絡學習到的是些什麼圖像。“反捲積”是不是這種應用的定義?

4.Padding

不padding的情況下:(n×n)的圖片,用(f×f)的filter卷積,產生的輸出大小(n-f+1)×(n-f+1)

不進行padding的缺點:

  • 輸入圖片的邊緣像素,因爲不處於對稱中心點,被卷積遍歷運算引用的次數比圖像中心區域的像素點少的多。即我們會丟失圖像靠近邊界的信息。
  • 每一次卷積圖片都會縮小,多次卷積圖片將變得非常的小。

所以,有必要進行padding(補白)。比如輸入圖片是(6×6)padding成(8×8)的圖片後,再進行kernel=(3×3)的卷積,輸出將還是一個(6×6)的圖像。

Padding/Not Cool
“Valid” convolution no Padding 會忽略圖像邊緣的信息
“Same” convolution Pad so that output size is the same as the input size. 單側padding的像素個數p=(f-1)/2時
輸出圖片與輸入圖片同樣大小

5.卷積步長 strided convolution

就是filter每次移動的步長。通常情況下,步長=1。如果設定步長=2,前後兩次filter的起始位置相距2個像素(水平方向移動是相距2個像素,換行時也是下降兩像素)。下圖示例就是strided=2的情形。
這裏寫圖片描述
filter大小是(f×f),加上Strided(s)、padding(p是單側補上的像素寬度)後,輸入圖片(n×n)與輸出圖片大小間的關係是:

:h=w=n+2pfs+1
,即向下取整floor()

互相關(cross-correlation)與卷積

在數學教材書籍上,卷積操作需要對卷積核先做水平與垂直翻轉,再求卷積。這會產生一種性質:(A卷積B)* 卷積C = A卷積 *(B卷積C) ,這一性質在數學上叫結合率(associativity),這一性質在信號處理領域很有用 但對深度神經網絡而言,它並不重要 。從數學定義上,我們現在進行的“無翻轉卷積核”操作最好稱之爲交叉相關。

但在機器學習的約定中, 我們通常忽略掉翻轉的操作,並將這稱之爲卷積。

6.在三維圖像(RGB)上進行卷積

在二維(W×H)圖像上的卷積示意圖:
這裏寫圖片描述
Convolutions over Volume
這裏寫圖片描述
對於一個多通道圖片,以RGB圖片舉例是3通道,要建立一個對等通道數的filter,即RGB圖片要3個filter。這3個filter分別與原始圖片的三個通道進行卷積操作。合計求和成一個值填入輸出圖像上。
所以雖然輸入圖像有3層,但輸出圖像是單層的。
如何在應用中應用多個過濾器
這裏寫圖片描述
應用兩個過濾器,那麼輸出就是兩層。這兩層也是下一層的輸入。實際上你可以在同一層應用很多個filter來捕捉原始圖片上各種各樣的特徵。
summary:
n×n×ncfilter(f×f×nc)(nf+1)×(nf+1)×nc
nc ,是下一層的nc ,等於應用過濾器的數量

7.單層式卷積網絡one Layer of a Convolution Network

這裏寫圖片描述
如上圖所示,一層完整卷積層,包括

  1. 使用n個filter進行卷積,
  2. 每個filter輸出的卷積結果加上各自的偏置量,得出Z(一個卷積核共享一個b)
  3. 對這個Z進行激活操作,比如relu。
  4. 最終的輸出結果有n層(depth=n)

卷積網絡的參數數量計算
If you have 10 filters that are 3×3×3 in one layer of a neural network,how many parameters does that layer have?
NumberParameters=kernel+1×filter=[(3×3×3)+1]×10=280

優點:無論輸入層多大(輸入的圖片多大),參數量恆定。相比普通神經網絡輸入有多少個特徵就至少有n0n1 個參數,尤其針對比如2000*2000這樣大型的圖片輸入,這的確會大大減少了參數數量,這便是卷積層的“權值共享”特性,能使得卷積神經網絡更不容易過擬合。

標註說明:
f[l] ,表示第l層filter的size
p[l] ,表示第l層padding的單側像素寬度
s[l] ,表示第l層的stride
nc[l]=f[l] ,輸出圖像的深度
輸入圖像的H!=W時:

nH[l]=nH[l1]+2p[l]f[l]s[l]+1nW[l]=nW[l1]+2p[l]f[l]s[l]+1

8.簡單型卷積網絡示例

1)登記好輸入層a[0] 的shape,記錄將要進行的卷積的filter size,stride,padding num,filter num。
2)計算輸出的shape,a[1]
3)登記下一個卷積的filter size,stride,padding num,filter num
4)計算輸出的shape,a[2]
5) ……
6) 比如最後的卷積輸出shape是,(7×7×40)有40個特徵層,將(7×7×40)扁平化爲一個1960向量,連接softmax進行分類判斷。
一個典型的卷積神經網絡的層次結構如下圖:
這裏寫圖片描述

9.池化層 Pooling Layers

相對於卷積層對filter進行求內積,池化層是對filter size內的輸入數據,求最大值(max pooling)或求平均值(average pooling)。無論是最大值還是平均值,相當於對輸入數據指定區域進行一次“關鍵特徵的提取”,經過pooling後,圖片的大小會縮小,所以也被稱爲降採樣(down-sampling)操作。另一方面,匯合也看成是一個用p範數(p-norm)作爲非線性映射的“卷積”操作,特別的,當p 趨近正無窮時就是最常見的最大值匯合。
匯合層具備如下三種功效:

  1. 特徵不變性(feature invariant)。匯合操作使模型更關注是否存在某些特徵而不是特徵具體的位置。可看作是一種很強的先驗,使特徵學習包含某種程度自由度,能容忍一些特徵微小的位移。
  2. 特徵降維。由於匯合操作的降採樣作用,匯合結果中的一個元素對應於原輸入數據的一個子區域(sub-region),因此匯合相當於在空間範圍內做了維度約減(spatially dimension reduction),從而使模型可以抽取更廣範圍的特徵。同時減小了下一層輸入大小,進而減小計算量和參數個數。
  3. 在一定程度防止過擬合(overfitting),更方便優化。【注:減少參數,被認爲是能減少過擬合】

    卷積與池化操作的對比如下:

- 卷積操作 池化操作
計算 對filter求內積 對filter取max/average
參數 filter(卷積核)的參數學習
需指定filter size
需指定stride
padding
是否需學習參數 否(只需指定超參數,沒有要學習的參數)
輸出的層數(depth,channel) 等於filter的個數 等於輸入的層數,不改變輸入的depth

10.卷積神經網絡示例(CNN Example)

這裏寫圖片描述
池化層是否被計算爲1層?課程認爲,沒有需要學習的參數的層不被單獨計算爲一層,所以,本課程將遵循,將卷積+池化共同計爲一層的方式。
各層的特徵個數,與參數數量:
這裏寫圖片描述
可以看到參數的大部分在全連接層上。

網絡中每一層的特徵個數,應該要逐漸下降,減少的太快通常認爲不利於網絡的性能

下圖是AlexNet網絡結構。AlexNet在當時被認爲是劃時代的網絡模型。但是神經網絡發展太快,現在比它先進的多的網絡模型不斷涌現。但是AlexNet當時的設計思路,和許多特點還是能給予借鑑。
這裏寫圖片描述

11.爲何要用卷積?

加入卷積層後的優點:
1. 參數共享(或稱權值共享,weight sharing,Parameter sharing): 參考第7.小節中關於優點“權值共享”的描述。
2. 稀疏式連接(Sparsity of connections):卷積輸出的單個值,只是跟少數輸入數據相關。而不像全連接神經網絡,每個輸出值都與所有輸入單元相關。這就是稀疏式連接
3. 平移不變性(translation invariant):卷積幫助網絡在輸入圖片上下左右移動主要識別物體後,如“貓”,能夠獲得相同的識別結果。

12.practic

What do you think applying this filter to a grayscale image will do?

[0110133113310110]

答:這個卷積核是進行垂直邊緣檢測

You have an input volume that is 32x32x16, and apply max pooling with a stride of 2 and a filter size of 2. What is the output volume?
答:使用pooling層輸出大小計算公式nfs+1

Because pooling layers do not have parameters, they do not affect the backpropagation (derivatives) calculation.
答:不對。方向傳播中,pooling層要按max(只傳遞給最大值),或 average(傳遞給filter覆蓋的所有值)方式規則將梯度反向傳給前一層。因此不能說它不影響計算。

13.番外,卷積核的數學意義

參考:《解析卷積神經網絡》-魏秀參
深度學習的一個重要思想即“端到端”的學習方式(end-to-end manner),屬
表示學習(representation learning )的一種。
在深度學習時代之前,樣本表示基本都使用人工特徵(hand-crafted),但“巧婦難爲無米之炊”,實際上人工特徵的優劣往往很大程度決定了最終的任務精度。這樣便催生了一種特殊的機器學習分支——特徵工程(feature engineering)。[“A Performance Evaluation of Local Descriptors”系統性的解釋不同局部特徵描述子的作用,2013年深度學習巨頭Yoshua Bengio就認爲,深度學習將替代特徵工程]而在深度學習普及之後,人工特徵已逐漸被表示學習根據任務自動需求“學到”的特徵表示所取代。
這裏寫圖片描述

13.1.拉普拉斯算子(卷積核)

參考:《數字圖像處理》-岡薩雷斯
卷積核在數字圖像處理領域叫“算子”,是對圖像不同軸向求微分近似值,從而達到提取圖像邊緣信息的一種方法。
原圖與不同算子卷積後的效果圖。
這裏寫圖片描述

整體邊緣濾波器
拉普拉斯算子
橫向邊緣濾波器
sobel橫向算子
縱向邊緣濾波器
sobel縱向算子
[0404164040] [121000121] [101202101]
這裏寫圖片描述 這裏寫圖片描述 這裏寫圖片描述

對於一維函數f(x),其一階微分的基本定義是差值:

fx=f(x+1)f(x)

二階微分是如下的差分:
2f2x=(f(x+1)f(x))(f(x)f(x1))

=f(x+1)+f(x1)2f(x)

而對於二維圖像函數f(x,y) ,就是沿着兩個空間軸分別處理偏微分。
對於灰度過度的斜坡,其一階微分不是零,二階微分是零。這樣導致圖像的一階微分會產生較粗的邊緣,因爲沿着斜坡的微分非零。二階微分可以通過卷積來獲得,這樣在操作上也比一階微分計算簡單。所以在尋找圖像邊緣上使用二階微分。
這裏寫圖片描述
而在圖片邊緣提取的操作,基本上是由定義一個二階微分的離散公式,然後構建一個基於該公式的濾波器模板組成。拉普拉斯算子是個各向同性微分算子。一個二維圖象函數f(x,y) 的拉普拉斯算子定義爲:
2f=2f2x+2f2y

x2f2x=f(x+1,y)+f(x1,y)2f(x,y)

y2f2y=f(x,y+1)+f(x,y1)2f(x,y)

組合以上可以得到離散拉普拉斯算子:
2f(x,y)=$f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)

樓上公式是x,y兩個方向求二階微分,還可以增加兩個對角線上求二階微分。增加兩對角線後,總共應該減去 8f(x,y)
這裏寫圖片描述
圖a:標準負中心,兩軸拉普拉斯濾波器模板
圖b:標準負中心,兩軸加對角拉普拉斯濾波器模板
圖c:正中心,兩軸拉普拉斯濾波器模板
圖d:正中心,兩軸加對角拉普拉斯濾波器模板

13.2從Robert,Prewitt算子到sobel算子

Sobel算子主要用作邊緣檢測,是檢測圖像灰度變化一階導數的應用。在圖像f的(x,y)位置處尋找邊緣的強度和方向,選擇的工具是梯度,並用向量來定義梯度f

f(x,y)=[gxgy]=[fxfy]

向量f 的大小(長度)計算公式爲:
G=gx2+gy2

這也是檢測結果輸出圖上,該點的灰度值。另外還能得到梯度向量的法向量(正交)。
α(x,y)=actan[gygx]

要計算每個像素點位置的偏導數:gx=f(x,y)x=f(x+1,y)f(x,y) ,
gy=f(x,y)y=f(x,y+1)f(x,y) 。要計算這兩個公式,可以使用一維模板對f(x,y) 的濾波來實現。模板如下圖:
這裏寫圖片描述
這樣的一維模板及它的改進型Roberts交叉梯度算子2*2模板(檢測對角線方向邊緣),沒有中心點對稱。而有中心點對稱最小得是3*3模板。那麼用3*3的模板來近似偏導數的最簡單的數字近似如下公式:(z 1~9是九宮格的順序位置)
gx=f(x,y)x=(z7+z8+z9)(z1+z2+z3)
gy=f(x,y)y=(z3+z6+z9)(z1+z4+z7) 其對應的濾波器模板是Prewitt。
這裏寫圖片描述
因爲考慮了對稱因素,Prewitt算子要比Robert算子得到的近似更準確。而在中心位置增加權重就得到了Sobel算子。
Sobel算子根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對噪聲具有平滑作用,提供較爲精確的邊緣方向信息,但邊緣定位精度不夠高(它會在灰度的分界線左右兩側各產生一條邊緣,即sobel畫出的邊緣比較粗)。當對精度要求不是很高時,是一種較爲常用的邊緣檢測方法。
實際應用中因爲求平方再開根的運算開銷大,會使用如下絕對值方式來近似梯度。
G=gx2+gy2|gx|+|gy|

這裏寫圖片描述
【詳細的還是看書吧,書上已經說的夠明白了,不知道要怎樣才能簡化摘錄出來。】

14.編程題

卷積過程相關代碼

Z1 = tf.nn.conv2d(X,W1, strides = [1,1,1,1], padding = ‘SAME’)

**Notation:**CONV2D: stride of 1, padding ‘SAME’
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

name參數用以指定該操作的name

第一個參數,input:指需要做卷積的輸入圖像,它要求是一個Tensor,具有[batch, in_height, in_width, in_channels]這樣的shape,具體含義是[訓練時一個batch的圖片數量, 圖片高度, 圖片寬度, 圖像通道數],注意這是一個4維的Tensor,要求類型爲float32和float64其中之一。圖像通道數可以是輸入圖像RGB的3通道,也可以是經過n個filter卷積後的n通道。

第二個參數,filter:相當於CNN中的卷積核,它要求是一個Tensor,具有[filter_height, filter_width, in_channels, out_channels]這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,圖像通道數,卷積核個數],要求類型與參數input相同,有一個地方需要注意,第三維in_channels,就是參數input的第四維

第三個參數,strides:卷積時在圖像每一維的步長,這是一個一維的向量,長度4。通常input的第一維是樣本數m,第四維是channel,所以1,4維通常stride=1。strides=[1,s,s,1],s是在圖像中卷積的步長。

第四個參數,padding:string類型的量,只能是”SAME”,”VALID”其中之一。”SAME”=padding,並且輸出圖像h*w等於輸入圖像h*w,”VALID”=no padding

第五個參數,use_cudnn_on_gpu:bool類型,是否使用cudnn加速,默認爲true。

A1 = tf.nn.relu(Z1)

tf.nn.relu(features, name = None)
這個函數的作用是計算激活函數 relu,即 max(features, 0)。即將矩陣中每行的非最大值置0。

P1 = tf.nn.max_pool(A1, ksize = [1,8,8,1], strides = [1,8,8,1], padding = ‘SAME’)

**Notation:**MAXPOOL: window 8x8, sride 8, padding ‘SAME’
tf.nn.max_pool(value, ksize, strides, padding, name=None)
參數是四個,和卷積很類似:
第一個參數value:需要池化的輸入,對應conv2d的input,一般池化層接在卷積層後面,所以輸入通常是feature map,依然是[batch, height, width, channels]這樣的shape

第二個參數ksize:池化窗口的大小,取一個四維向量,一般是[1, height, width, 1],因爲我們不想在batch和channels上做池化,所以這兩個維度設爲了1

第三個參數strides:和卷積類似,窗口在每一個維度上滑動的步長,一般也是[1, stride,stride, 1]

第四個參數padding:和卷積類似,可以取’VALID’ 或者’SAME’

返回一個Tensor,類型不變,shape仍然是[batch, height, width, channels]這種形式

P2 = tf.contrib.layers.flatten(P2)

tf.contrib.layers.flatten(P)這個函數就是把P保留第一個維度,把第一個維度包含的每一子張量展開成一個行向量,返回張量是一個二維的, shape=(batch_size,….),一般用於卷積神經網絡全鏈接層前的預處理

Z3 = tf.contrib.layers.fully_connected(P2, 6,activation_fn=None)

tf.contrib.layers.fully_connected(
inputs, num_outputs, activation_fn=tf.nn.relu, normalizer_fn=None, normalizer_params=None,
weights_initializer=initializers.xavier_initializer(), weights_regularizer=None,
biases_initializer=tf.zeros_initializer(), biases_regularizer=None,
reuse=None, variables_collections=None, outputs_collections=None,
trainable=True, scope=None)常用參數就3個
tf.contrib.layers.fully_connection(F,num_output,activation_fn)這個函數就是全鏈接成層
全連接實際上是完成一個 g(W*X+b),權重乘輸入加偏置量再激活的過程。對應的w初始化由tensorflow自動完成,無需指定。
F是輸入,num_output是下一層單元的個數,activation_fn是激活函數

  • inputs: A tensor of at least rank 2 and static value for the last dimension; i.e. [batch_size, depth], [None, None, None, channels]
  • num_outputs: Integer or long, the number of output units in the layer.
  • activation_fn: Activation function. The default value is a ReLU function. Explicitly set it to None to skip it and maintain a linear activation.
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = Z3, labels = Y))

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
除去name參數用以指定該操作的name,與方法有關的一共兩個參數:
第一個參數,logits:就是神經網絡最後一層的輸出,如果有batch的話,它的大小就是[batchsize,num_classes],單樣本的話,大小就是num_classes
第二個參數,labels:實際的標籤,大小同上
tf交叉熵函數有4個:

  • tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)
  • tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
  • tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)
  • tf.nn.weighted_cross_entropy_with_logits(labels, logits, pos_weight, name=None)

tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
參數1–input_tensor:待求值的tensor。
參數2–reduction_indices:在哪一維上求解。
參數(3)(4)可忽略

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

此函數是Adam優化算法:是一個尋找全局最優點的優化算法,引入了二次方梯度校正。
相比於基礎SGD算法,1.不容易陷於局部優點。2.速度更快

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章