一、原理講解
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)