目錄正則表達式
MNIST是一個很是有名的手寫體數字識別數據集,在不少資料中,這個數據集都會被用做深度學習的入門樣例。MNIST數據集是NIST數據集的一個子集,它包含了60000張圖片做爲訓練數據,10000張圖片做爲測試數據。如下代碼是使用TensorFlow讀取MNIST數據集,若是本地不存在則自動下載到本地指定的目錄,並打印數據集的訓練集、驗證集和測試集的維度大小。工具
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("./MNIST_data/", one_hot=True) print ("Training data size: ", mnist.train.num_examples) print ("Validating data size: ", mnist.validation.num_examples) print ("Testing data size: ", mnist.test.num_examples)
運行結果:學習
Extracting ./MNIST_data/train-images-idx3-ubyte.gz Extracting ./MNIST_data/train-labels-idx1-ubyte.gz Extracting ./MNIST_data/t10k-images-idx3-ubyte.gz Extracting ./MNIST_data/t10k-labels-idx1-ubyte.gz Training data size: 55000 Validating data size: 5000 Testing data size: 10000
TensorFlow提供了經過變量名稱來建立或者獲取一個變量的機制。經過這個機制,在不一樣函數中能夠直接經過變量名稱來建立或者獲取一個變量的機制。經過這個機制,在不一樣的函數中能夠直接經過變量的名字來使用變量,而不須要將變量經過參數的形式處處傳遞。TensorFlow中經過變量名稱獲取變量的機制主要是經過tf.get_variable和tf.variable_scope函數來實現,還能夠同規格tf.Variable函數來建立變量。測試
經過tf.variable_scope函數能夠控制tf.get_variable函數的語義。當tf.variable_scope函數使用參數reuse=True生成上下文管理器時,這個上下文管理器內全部的tf.get_variable函數會直接獲取已經建立的變臉。若是變量不存在,則tf.get_variable函數將報錯;相反,若是tf.variable_scope函數使用參數reuse=None或者reuse=False建立上下文管理器,tf.get_variable操做將建立新的變量。若是同名變量已經存在,則tf.get_variable函數將報錯。如下代碼示例說明了經過variable_scope來管理變量:編碼
import tensorflow as tf v1 = tf.get_variable("v", [1]) print (v1.name) with tf.variable_scope("foo"): v2 = tf.get_variable("v", [1]) print (v2.name) with tf.variable_scope("foo"): with tf.variable_scope("bar"): v3 = tf.get_variable("v", [1]) print (v3.name) v4 = tf.get_variable("v1", [1]) print (v4.name)
運行結果:spa
v:0 foo/v:0 foo/bar/v:0 v1:0
TensorFlow提供了一個很是簡單的API來保存和還原一個神經網絡模型。這個API就是tf.train.Saver類。下面代碼給出了保存和加載計算圖的方法:rest
import tensorflow as tf v1 = tf.Variable(tf.random_normal([1], stddev=1, seed=1)) v2 = tf.Variable(tf.random_normal([1], stddev=1, seed=1)) result = v1 + v2 init_op = tf.global_variables_initializer() saver = tf.train.Saver() with tf.Session() as sess: sess.run(init_op) saver.save(sess, "./Saved_model/model.ckpt")
運行結果:
加載保存的模型:
ith tf.Session() as sess: saver.restore(sess, "./Saved_model/model.ckpt") print (sess.run(result))
運行結果:
INFO:tensorflow:Restoring parameters from ./Saved_model/model.ckpt [-1.6226364]
全鏈接神經網絡處理圖像的最大問題在於全鏈接層的參數太多,參數增多除了致使計算速度減慢,還很容易致使過擬合問題。因此須要一個更合理的神經網絡結構來有效地減小神經網絡中參數個數,卷積神經網絡就能夠達到這個目的。
卷積神經網絡主要由5種結構組成:輸出層、卷積層、池化層、全鏈接層和Softmax層。
輸入層:輸入層是整個神經網絡的輸入,在處理圖像的卷積神經網絡中,它通常表明了一張圖片的像素矩陣。
卷積層:從名字能夠看出。卷積層是一個卷積神經網絡中最爲重要的部分。和傳統全鏈接層不一樣,卷積層中每個節點的輸入只是上一層神經網絡的一小塊,這個小塊經常使用的大小有3*3或者5*5。卷積層試圖將神經網絡中的每一小塊進行更加深刻地分析從而獲得抽象程度更高的特徵。通常來講,經過卷積層處理過的節點矩陣會變得更深。
池化層:池化層神經網絡不會改變三維矩陣的深度,可是它能夠縮小矩陣的大小。池化操做能夠認爲是將一張分辨率較高的圖片轉化爲分辨率較低的圖片。經過池化層,能夠進一步縮小最後全鏈接層中節點的個數,從而達到減小整個神經網絡中參數的目的。
全鏈接層:我能夠將卷積層和池化層當作自動圖像特徵提取的過程。在特徵提取完成以後,仍然須要使用全鏈接層來完成分類任務。
Softmax層:Softmax層主要用於分類問題,經過Softmax層能夠獲得當前樣例屬於不一樣種類的機率分佈狀況。
卷積層神經網絡結構中最重要的部分,稱之爲過濾器(filter)或者內核(kernel)。過濾器能夠將當前層神經網絡上的一個子節點矩陣轉化爲下一層神經網絡上的一個單位節點矩陣。單位節點矩陣指的是一個長和寬都爲1,但深度不限的節點矩陣。子節點矩陣的尺寸也被稱之爲過濾器的尺寸,經常使用的過濾器尺寸有3*3或5*5。由於過濾器處理的矩陣深度和當前層神經網絡節點矩陣的深度是一致的,因此雖然節點矩陣是三維的,但過濾器的尺寸只須要指定兩個維度。過濾器中另一個須要人工指定的設置是處理獲得的單位節點矩陣的深度,這個設置稱之爲過濾器的深度。
卷積層的參數個數要遠遠小於全鏈接層,並且卷積層的參數個數和圖片的大小無關,它只和過濾器的尺寸、深度以及當前層節點矩陣的深度有關,這使得卷積神經網絡能夠很好地擴展到更大的圖像數據上。
在卷積層之間每每會加上一個池化層,池化層能夠很是有效地縮小矩陣的尺寸,從而減小最後全鏈接層中的參數。使用池化層能夠加快計算速度,也有防止過擬合問題的做用。池化層前向傳播過程也是經過移動一個相似過濾器的結構完成的,不過池化層過濾器中的計算不是節點的加權和,而實採用更加簡單的最大值或者平均值計算。
卷積層和池化層中過濾器移動的方式是類似的,惟一的區別在於卷積層使用的過濾器是橫跨整個深度的,而池化層使用的過濾器隻影響一個深度上的節點。因此池化層的過濾器除了在長和寬兩個維度移動,它還須要在深度這個維度上移動。
如下正則表達式公式總結了一些經典的用於圖片分類問題的卷積神經網絡結構:
輸入層—>(卷積層+—>池化層?) +—>全鏈接層+
在以上公式中,「卷積層+」表示一層或者多層卷積層,大部分卷積神經網絡中通常最多連續使用三層卷積層。「池化層?」表示沒有或者一層池化層。池化層雖然能夠起到減小參數防止過擬合問題,可是在部分論文中也發現能夠直接經過調整卷積步長來完成。在多輪卷積層和池化層後,卷積神經網絡在輸出以前通常會通過1~2個全鏈接層。好比LeNet-5模型就能夠表示爲如下結構:
輸入層—>卷積層—>池化層—>卷積層—>池化層—>全鏈接層—>全鏈接層—>輸出層
Inception結構是一種和LeNet-5結構徹底不一樣的卷積神經網絡結構。在LeNet-5模型中,不一樣卷積層經過串聯的方式鏈接在一塊兒,而Inception-v3模型中的Inception結構是將不一樣的卷積層經過並聯的方式結合在一塊兒。Inception模塊中通常會使用不一樣尺寸的過濾器處理輸入矩陣,經過使用全零填充且步長爲1,那麼前向傳播獲得的結果矩陣的長和寬都與輸入矩陣一致。這樣通過不一樣過濾器處理的結果矩陣能夠拼接成一個更深的矩陣。通常推薦使用TensorFlow-Slim工具來更加簡潔地實現一個卷積層。例如:
net = slim.conv2d(input, 32, [3, 3])
TensorFlow提供了一種統一的格式來存儲數據,這個格式就是TFRecord。
通常圖像的原始輸入數據是直接使用圖像原始的像素矩陣,可是能夠經過對圖像的預處理,能夠儘可能避免受到無關因素的影響。TensorFlow提供了幾類圖像處理函數,分別爲圖像編碼處理、圖像大小調整、圖像翻轉、圖像色彩調整和處理標註框。