CNN(卷積神經網絡)原理講解及簡單代碼


一、原理講解

1. 卷積神經網絡的應用

  • 分類(分類預測)
  • 檢索(檢索出該物體的類別)
  • 檢測(檢測出圖像中的物體,並標注)
  • 分割(將圖像分割出來)
  • 人臉識別
  • 圖像生成(生成不同狀態的圖像)
  • 自動駕駛
  • 等等。。。

 

2. 傳統神經網絡與卷積神經網絡比較

傳統神經網絡采用的是全連接神經網絡,權重矩陣的參數太多,導致速度減慢,也會產生過擬合。

卷積神經網絡通過卷積核,大大降低了參數個數。實現局部關聯,參數共享的效果。

 

3. 卷積神經網絡基本結構

  • 卷積層
  • 激活層(ReLu)
  • 池化層
  • 全連接層

 

3.1 卷積層(Convolutional Layer)

卷積是對兩個實變函數的一種數學操作,也就是求內積。

在圖像處理中,圖像是以二維矩陣的形式輸入到神經網絡的,因此我們需要二維卷積。

 

圖3-1

 

圖3-2

 

 

 

 

圖3-3

 

圖3-1、圖3-2、圖3-3很好地展示了卷積過程,名稱注釋如下:

input:輸入層,即圖像的矩陣向量

kernel:卷積核或稱濾波器,可以定義卷積核的大小,圖3-1中卷積核的大小為2*2

output:輸出,即特征圖feature map,通過卷積計算出來的結果。計算公式為input(圖3-1中為4*3)•kernel(圖3-1中為2*2),兩個向量求內積。

stride:步長,即卷積核向右滑動的長度。圖3-1中步長為1。

padding:填充,當卷積時,卷積核滑動到最右側發現無法形成與自己單元一致的向量時,需要在四周用0填充,確保卷積核能完成計算過程。如圖3-4所示。

depth/channel:深度,即當前卷積層中卷積核的個數。如圖3-4為2層。

 

圖3-4

卷積是從輸入圖像中提取特征的第一層,Conv層的目標是提取輸入數據的特征。 卷積通過使用小方塊輸入數據學習圖像特征來保持像素之間的關系。

 

輸出的特征圖(feature map)大小:

圖3-5

未加padding時:

(N-F)/stride + 1

加padding時:

(N-F+padding*2)/stride + 1

 

例子:

input:32*32

filter:10, 5*5

stride:1

padding:2

輸出:?  (32-5+2*2)/1+1=32 ,即 32*32*10

參數:?  (5*5+1)*10

 

代碼實現:

1 # 定義卷積核,10個卷積核,卷積核大小是5,用Relu激活
2 conv0 = tf.layers.conv2d(datas, 10, 5, activation=tf.nn.relu)

3.2 池化層(Pooling Layer)

特征:

保留了主要特征的同事減少參數和計算量,防止過擬合,提高模型泛化能力。

它一般處在卷積層和卷積層之間,全連接層和全連接層之間。

類型划分:

max pooling:最大化池化,如圖3-6和圖3-7所示

average pooling:平均池化,如圖3-7所示

圖3-6

 

圖3-7

 

 

3.3 全連接層(Fully Connected Layer)

  • 兩層之間所有神經元都有權重連接
  • 通常全連接才呢過在卷積神經網絡尾部
  • 全連接層參數量通常最大

 

二、代碼實戰

 1 # 定義卷積層, 20個卷積核,卷積核大小為5, 用Relu激活
 2 conv0 = tf.layers.conv2d(datas, 20, 5, activation=tf.nn.relu)
 3 # 定義max-pooling層,pooling窗口為2*2,步長為2*2
 4 pool0 = tf.layers.max_pooling2d(conv0, [2, 2], [2, 2])
 5 
 6 # 定義卷積層,40個卷積核,卷積核大小為4, 用Relu激活
 7 conv1 = tf.layers.conv2d(pool0, 40, 4, activation=tf.nn.relu)
 8 # 定義max-pooling層,pooling窗口為2*2,步長為2*2
 9 pool1 = rf.layers.max_pooling2d(conv1, [2, 2], [2, 2])
10 
11 # 將3維特征裝換為1維向量
12 flatten = tf.layers.flatten(pool1)
13 
14 # 全連接層,轉換為長度為400的特征向量
15 fc = tf.layers.dense(flatten, 400, activation=tf.nn.relu)
16 
17 # 加上DropOut,防止過擬合
18 dropput_fc = tf.layers.dropout(fc, dropout_placeholdr)
19 
20 # 未激活的輸出層
21 # num_classes:分類數
22 logits = tf.layers.dense(dropout_fc, num_classes)
23 
24 predicted_labels = tf.arg_max(ligits, 1)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM