天天看點

全連接配接網絡基礎1——MNIST資料集

√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))

           

繼續閱讀