√mnist 資料集 :包含 7 7 萬張 黑底白字手寫數字 圖檔, 其中 0 55000 張為訓練集 ,
5000 張為驗證集,10 0000 張 為測試集 。每張圖檔大小為 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 tensorflo w.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 、驗證集 n validation 和測試集 test 樣本數
在 Tensorflow 中用以下函數傳回子集樣本數:
① 傳回 訓練集 train 樣本數
print “train data size:”,mnist.train.mun_examples
輸出結果:
train data size:55000
②傳回 驗證集 validation 樣本數
print “ va lidation d ata 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 。
例如:
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 0 ,則 在 第一
維元素 上 取平均值,即每一列求平均值 ;若 指定第二個參數為 1 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)
函數表示 傳回 指定次元 asxis 下,參數 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( ) )
函數表示将目前圖設定成為預設圖,并傳回一
個上下文管理器 。 該函數 一般與 w wh ith 關鍵字 搭配使用 ,應用于将 已經定義好
的 神經網絡在計算圖中複現。
例如:
with tf.Graph().as_default() as g
,表示将在
Graph()
内定義的節點加入到
計算圖 g 中。
√ 神經網絡模型的儲存
在 反向傳播過程中,一般會間隔一定輪數儲存一次神經網絡模型, 并産生三個
檔案( 儲存目前圖結構 的
.meta
檔案 、 儲存目前參數名 的
.index
檔案 、 儲存當
前參數 的
.data
檔案 ) ,在
T ensorflow
中如下表示:
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 對象。上述代碼表示,神經網絡每循
環規定的輪數,将神經網絡模型中所有的參數等資訊儲存到指定的路徑中,并在
存放網絡模型的檔案夾名稱中注明儲存模型時的訓練輪數。
√ 神經網絡模型的加載
在測試網絡效果時,需要将訓練好的神經網絡模型加載 ,在 T ensorflow 中 這
樣 表示:
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)
ema = tf.train.ExponentialMovingAverage( ( 滑動平均基數) )
ema_restore = ema.variables_to_restore()
saver = tf.train.Saver(ema_restore)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean( tf.cast(correct_prediction, tf.float32))