1. 程式人生 > >TensorFlow學習筆記(7) 卷積神經網路簡介

TensorFlow學習筆記(7) 卷積神經網路簡介

前面所提到的MNIST是一個相對簡單的資料集,而在其他更復雜的影象識別資料集上,卷積神經網路有更好的表現。比如Cifar資料集和ImageNet資料集。Cifar分為Cifar-10和Cifar-100兩個問題,都是32*32的彩色圖片,Cifar-10問題收集了來自10個不同種類的60000張圖片。而ImageNet資料集中的解析度更高,影象也更加複雜。

在之前所提到的神經網路每兩層之間的所有結點都是有邊相連的,所以成為全連線神經網路。而卷積神經網路與之相比有所差異,相鄰兩層之間只有部分節點相連,為了展示每一層神經元的維度,一般會將每一層卷積層的節點組織成一個三維矩陣。兩種神經網路的訓練流程沒有任何區別,唯一的區別就在於神經網路中相鄰兩層的連結方式。

一個卷積網路具體由以下五種結構組成:

  • 輸入層:輸入層一般代表了一個圖片的三維矩陣,其中長和寬代表了影象的大小,深度代表了影象的彩色通道。比如黑白圖片的深度為1,RGB彩色圖片的深度為三。在神經網路種,每一層的三維矩陣都會轉化為下一層的三維矩陣,直到最後的全連線層。
  • 卷積層:卷積層中每一個節點的輸入只是上一層神經網路的小塊,常用的大小有5*5或3*3。卷積層試圖將神經網路種每一小塊進行更加深入的剖析。一般來說,經過卷積層處理過的節點矩陣會變得更深。
  • 池化層:該層不會改變三維矩陣的深度,但會縮小矩陣的大小,達到減少整個神經網路的引數的目的。
  • 全連線層:卷積神經網路最後一般會是由1到2個全連線層來給出最後的分類結果,通過卷積層和池化層對影象特徵的提取,利用全連線層實現對影象的分分類。
  • Softmax層:主要用於分類問題,通過該層可以得到當前樣例屬於不同種類的概率分佈。


卷積層:

卷積層中最重要的部分成為過濾器或者核心,可以將當前神經網路上的一個子節點矩陣轉化為下一層神經網路上的一個單位節點矩陣(長寬為1,深度不限)。過濾器的尺寸一般為3*3或5*5,需要人工指定,成為過濾器尺寸;處理得到的單位節點的深度也需要人工指定,稱為為過濾器的深度。在卷積神經網路中,每一個卷積層中使用的過濾器的引數都是一樣的。

在TF中可以實現一個卷積層的前向傳播:

mport tensorflow as tf

#建立過濾器的權重變數和偏置項變數
#卷積層的引數個數只與過濾器的尺寸、深度以及當前層節點矩陣的深度有關,因此宣告的引數變數為四維矩陣
#前兩個維度代表了過濾器尺寸,第三個代表當前層的深度,第四個代表過濾器的深度
filter_weight = tf.get_variable('weights', [5, 3, 3, 16], initializar=tf.truncated_normal_initializer(stddev=0.1))
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))

#tf.nn.conv2d可以實現卷積層前向傳播的演算法
#該函式第一個輸入為當前層的節點矩陣,該矩陣為四維矩陣,第一個引數代表第n個圖片,後三個代表一個節點矩陣
#第二個輸入代表卷積層的權重
#第三個輸入為不同維度上的步長從,該矩陣為四維矩陣,但第一個和第四個引數一定為1,中間兩個代表在長和寬上的步長
#第四個輸入為填充padding的方法,其中SAME表示全0填充,VALID表示不填充
conv = tf.nn.conv2d(input, filter_weight, strides=[1,1,1,1], padding='SAME')

#給每一個節點加上偏置項
bias = tf.nn.bias_add(conv, biases)

#通過啟用函式去線性化
actived_conv = tf.nn.relu(bias)


池化層:

池化層可以非常有效的縮短矩陣的尺寸,從而減少最後全連線層中的引數。使用池化層可以加快計算速度也有防止過擬合問題的作用。池化層過濾器的計算不是節點的加權和,而是採用更加簡單的最大值或者平均值運算,稱之為最大池化層或者平均池化層。池化層與卷積層過濾器引數的設定移動的方式都是一樣的。池化層過濾器除了在長和寬兩個維度移動之外,它還需要再深度這個維度移動。

下面的TF程式實現了最大池化層的前向傳播演算法:

#tf.nn.max_pool可以實現最大池化層的前向傳播的演算法
#該函式第一個輸入為卷積層得到的結果
#第二個輸入代表過濾器的尺寸ksize,該矩陣為四維矩陣,但第一個和第四個引數一定為1,中間兩個代表過濾器的長和寬
#第三個輸入為不同維度上的步長從,該矩陣為四維矩陣,但第一個和第四個引數一定為1,中間兩個代表在長和寬上的步長
#第四個輸入為填充padding的方法,其中SAME表示全0填充,VALID表示不填充
pool = tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1], strides=[1,2,2,1], padding='SAME')

#平均池化層
pool = tf.nn.avg_pool(actived_conv, ksize=[1, 3, 3, 1], strides=[1,2,2,1], padding='SAME')

源自:Tensorflow 實戰Google深度學習框架_鄭澤宇