mnist 數據集:包含 7 萬張黑底白字手寫數字圖片,其中 55000 張為訓練集,5000 張為驗證集,10000 張為測試集。每張圖片大小為 28*28 像素,圖片中純黑色像素值為 0,純白色像素值為 1。數據集的標簽是長度為 10 的一維數組,數組中每個元素索引號表示對應數字出現的概率。
在將 mnist 數據集作為輸入喂入神經網絡時,需先將數據集中每張圖片變為長度784 一維數組,將該數組作為神經網絡輸入特征喂入神經網絡。
例如:
一張數字手寫體圖片變成長度為 784 的一維數組[0.0.0.0.0.231 0.235 0.459 ……0.219 0.0.0.0.]輸入神經網絡。該圖片對應的標簽為[0.0.0.0.0.0.1.0. 0.0],標簽中索引號為 6 的元素為 1,表示是數字 6 出現的概率為 100%,則該圖片對應的識別結果是 6。
使用 input_data 模塊中的 read_data_sets()函數加載 mnist 數據集:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(’./data/’,one_hot=True)
在 read_data_sets()函數中有兩個參數,第一個參數表示數據集存放路徑,第二個參數表示數據集的存取形式。當第二個參數為 Ture 時,表示以獨熱碼形式存取數據集。read_data_sets()函數運行時,會檢查指定路徑內是否已經有數據集,若指定路徑中沒有數據集,則自動下載,並將 mnist數據集分為訓練集 train、驗證集 validation 和測試集 test 存放。在終端顯示如下內容:
Extracting ./data/train-images-idx3-ubyte.gz
Extracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/tl0k-images-idx3-ubyte.gz
Extracting ./data/ tl0k-labels-idx1-ubyte.gz
返回 mnist 數據集中訓練集 train、驗證集 validation 和測試集 test 樣本數 在 Tensorflow 中用以下函數返回子集樣本數:
①返回訓練集 train 樣本數
print “train data size:”,mnist.train.mun_examples
輸出結果:train data size:55000
②返回驗證集 validation 樣本數
print “validation data size:”,mnist.validation.mun_examples
輸出結果:validation data size:5000
③返回測試集 test 樣本數
print “test data size:”,mnist.test.mun_examples
輸出結果:test data size:10000
使用 train.labels 函數返回 mnist 數據集標簽
例如:
在 mnist 數據集中,若想要查看訓練集中第 0 張圖片的標簽,則使用如下函數
mnist.train.labels[0]
輸出結果:array([0.,0.,0.,0.,0.,0.,1.,0.,0.,0])
使用 train.images 函數返回 mnist 數據集圖片像素值
例如:
在 mnist 數據集中,若想要查看訓練集中第 0 張圖片像素值,則使用如下函數
mnist.train.images[0]
輸出結果:array([0. ,0. ,0. ,
0. ,0. ,0. ,
0. ,0. ,0. ,
… … …])
使用 mnist.train.next_batch()函數將數據輸入神經網絡
例如:
BATCH_SIZE = 200
xs,ys = mnist.train.next_batch(BATCH_SIZE)
print “xs shape:”,xs.shape
print “ys shape:”,ys.shape
輸出結果:xs.shape(200,784)
輸出結果:ys.shape(200,10)
其中,mnist.train.next_batch()函數包含一個參數 BATCH_SIZE,表示隨機從訓練集中抽取 BATCH_SIZE 個樣本輸入神經網絡,並將樣本的像素值和標簽分別賦給 xs 和 ys。在本例中,BATCH_SIZE 設置為 200,
表示一次將 200 個樣本的像素值和標簽分別賦值給 xs 和 ys,故 xs 的形狀為(200,784),對應的 ys 的形狀為(200,10)。
實現“Mnist 數據集手寫數字識別”的常用函數:
①tf.get_collection(“”)函數表示從 collection 集合中取出全部變量生成一個列表。
②tf.add( )函數表示將參數列表中對應元素相加。
例如:
x=tf.constant([[1,2],[1,2]])
y=tf.constant([[1,1],[1,2]])
z=tf.add(x,y)
print z
輸出結果:[[2,3],[2,4]]
③tf.cast(x,dtype)函數表示將參數 x 轉換為指定數據類型。
例如:
A = tf.convert_to_tensor(np.array([[1,1,2,4], [3,4,8,5]]))
print A.dtype
b = tf.cast(A, tf.float32)
print b.dtype
結果輸出:
<dtype: 'int64'>
<dtype: 'float32'>
從輸出結果看出,將矩陣 A 由整數型變為 32 位浮點型。
④tf.equal( )函數表示對比兩個矩陣或者向量的元素。若對應元素相等,則返回 True;若對應元素不相等,則返回 False。
回 True;若對應元素不相等,則返回 False。
例如:
A = [[1,3,4,5,6]]
B = [[1,3,4,3,2]]
with tf.Session( ) as sess:
print(sess.run(tf.equal(A, B)))
輸出結果:[[ True True True False False]]
在矩陣 A 和 B 中,第 1、2、3 個元素相等,第 4、5 個元素不等,故輸出結果中,
第 1、2、3 個元素取值為 True,第 4、5 個元素取值為 False。
⑤tf.reduce_mean(x,axis)函數表示求取矩陣或張量指定維度的平均值。若不
指定第二個參數,則在所有元素中取平均值;若指定第二個參數為 0,則在第一
維元素上取平均值,即每一列求平均值;若指定第二個參數為 1,則在第二維元
素上取平均值,即每一行求平均值。
例如:
x = [[1., 1.]
[2., 2.]]
print(tf.reduce_mean(x))
輸出結果:1.5
print(tf.reduce_mean(x, 0))
輸出結果:[1.5, 1.5]
print(tf.reduce_mean(x, 1))
輸出結果:[1., 1.]
⑥tf.argmax(x,axis)函數表示返回指定維度 axis 下,參數 x 中最大值索引號。
例如:
在 tf.argmax([1,0,0],1)函數中,axis 為 1,參數 x 為[1,0,0],表示在參數 x的第一個維度取最大值對應的索引號,故返回 0。
⑦os.path.join()函數表示把參數字符串按照路徑命名規則拼接。
例如:
import os
os.path.join('/hello/','good/boy/','doiido')
輸出結果:'/hello/good/boy/doiido'
⑧字符串.split( )函數表示按照指定“拆分符”對字符串拆分,返回拆分列表。
例如:
'./model/mnist_model-1001'.split('/')[-1].split('-')[-1]
在該例子中,共進行兩次拆分。第一個拆分符為‘/’,返回拆分列表,並提取列表中索引為-1 的元素即倒數第一個元素;第二個拆分符為‘-’,返回拆分列表,並提取列表中索引為-1 的元素即倒數第一個元素,故函數返回值為 1001。
⑨tf.Graph( ).as_default( )函數表示將當前圖設置成為默認圖,並返回一個上下文管理器。該函數一般與 with 關鍵字搭配使用,應用於將已經定義好的神經網絡在計算圖中復現。
例如:
with tf.Graph().as_default() as g,表示將在 Graph()內定義的節點加入到計算圖 g 中。
神經網絡模型的保存
在反向傳播過程中,一般會間隔一定輪數保存一次神經網絡模型,並產生三個文件(保存當前圖結構的.meta 文件、保存當前參數名的.index 文件、保存當前參數的.data 文件),
在 Tensorflow 中如下表示:
saver = tf.train.Saver()
with tf.Session() as sess:
for i in range(STEPS):
if i % 輪數 == 0:
saver.save(sess, os.path.join(MODEL_SAVE_PATH,
MODEL_NAME), global_step=global_step)
其中,tf.train.Saver()用來實例化 saver 對象。上述代碼表示,神經網絡每循環規定的輪數,將神經網絡模型中所有的參數等信息保存到指定的路徑中,並在存放網絡模型的文件夾名稱中注明保存模型時的訓練輪數。
神經網絡模型的加載
在測試網絡效果時,需要將訓練好的神經網絡模型加載,在 Tensorflow 中這樣表示:
with tf.Session() as sess:
ckpt = tf.train.get_checkpoint_state(存儲路徑)
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
在 with 結構中進行加載保存的神經網絡模型,若 ckpt 和保存的模型在指定路徑中存在,則將保存的神經網絡模型加載到當前會話中。
加載模型中參數的滑動平均值
在保存模型時,若模型中采用滑動平均,則參數的滑動平均值會保存在相應文件中。通過實例化 saver 對象,實現參數滑動平均值的加載,在 Tensorflow 中如下表示:
ema = tf.train.ExponentialMovingAverage(滑動平均基數)
ema_restore = ema.variables_to_restore()
saver = tf.train.Saver(ema_restore)
神經網絡模型准確率評估方法在網絡評估時,一般通過計算在一組數據上的識別准確率,評估神經網絡的效果。在 Tensorflow 中這樣表示:
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
在上述中,y 表示在一組數據(即 batch_size 個數據)上神經網絡模型的預測結果,y 的形狀為[batch_size,10],每一行表示一張圖片的識別結果。通過tf.argmax()函數取出每張圖片對應向量中最大值元素對應的索引值,組成長度為輸入數據 batch_size 個的一維數組。通過 tf.equal()函數判斷預測結果張量和實際標簽張量的每個維度是否相等,若相等則返回 True,不 相等則返回 False。通過 tf.cast() 函數將得到的布 爾 型 數 值 轉 化 為 實 數 型 , 再通過tf.reduce_mean()函數求平均值,最終得到神經網絡模型在本組數據上的准確率。
本文參考:
慕課APP中人工智能實踐-Tensorflow筆記;北京大學曹健老師的課程