matlab朴素贝叶斯手写数字识别_TensorFlow手写数字识别(一)
本篇文章通過TensorFlow搭建最基礎(chǔ)的全連接網(wǎng)絡(luò),使用MNIST數(shù)據(jù)集實現(xiàn)基礎(chǔ)的模型訓(xùn)練和測試。
MNIST數(shù)據(jù)集
MNIST數(shù)據(jù)集?:包含7萬張黑底白字手寫數(shù)字圖片,其中55000張為訓(xùn)練集,5000張為驗證集,10000張為測試集。
每張圖片大小為28X28像素,圖片中純黑色像素值為0,純白色像素值為1。數(shù)據(jù)集的標簽是長度為10的一維數(shù)組,數(shù)組中每個元素索引號表示對應(yīng)數(shù)字出現(xiàn)的概率 。
在將MNIST數(shù)據(jù)集作為輸入喂入神經(jīng)網(wǎng)絡(luò)時,需先將數(shù)據(jù)集中每張圖片變?yōu)殚L度784 一維數(shù)組,將該數(shù)組作為神經(jīng)網(wǎng)絡(luò)輸入特征喂入神經(jīng)網(wǎng)絡(luò)。
例如:
一張數(shù)字手寫體圖片變成長度為 784 的一維數(shù)組[0.0.0.0.0.231 0.235 0.459……0.219 0.0.0.0.]輸入神經(jīng)網(wǎng)絡(luò)。該圖片對應(yīng)的標簽為[0.0.0.0.0.0.1.0.0.0],標簽中索引號為 6 的元素為 1,表示是數(shù)字 6 出現(xiàn)的概率為 100%,則該圖片對應(yīng)的識別結(jié)果是 6。
使用input_data 模塊中的read_data_sets()函數(shù)加載MNIST數(shù)據(jù)集:
from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("./data/", one_hot=True)輸出:
Extracting ./data/train-images-idx3-ubyte.gzExtracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/t10k-images-idx3-ubyte.gz
Extracting ./data/t10k-labels-idx1-ubyte.gz
在?read_data_sets()函數(shù)中有兩個參數(shù),第一個參數(shù)表示數(shù)據(jù)集存放路徑,第二個參數(shù)表示數(shù)據(jù)集的存取形式。當?shù)诙€參數(shù)為 Ture 時,表示以獨熱碼形式存取數(shù)據(jù)集。read_data_sets()函數(shù)運行時,會檢查指定路徑內(nèi)是否已經(jīng)有數(shù)據(jù)集,若指定路徑中沒有數(shù)據(jù)集,則自動下載,并將MNIST數(shù)據(jù)集分為訓(xùn)練集train、驗證集validation和測試集test存放。
MNIST數(shù)據(jù)集結(jié)構(gòu)
在 Tensorflow中用以下函數(shù)返回子集樣本數(shù):
① 返回訓(xùn)練集train樣本數(shù)
print("train data size:",mnist.train.num_examples)② 返回驗證集validation樣本數(shù)
print("validation data size:",mnist.validation.num_examples)輸出:
validation data size: 5000③ 返回測試集test樣本數(shù)
print("test data size:",mnist.test.num_examples)輸出:
test data size: 10000數(shù)據(jù)集標簽
例如:在MNIST數(shù)據(jù)集中,若想要查看訓(xùn)練集中第0張圖片的標簽,則使用如下函數(shù):
mnist.train.labels[0]輸出:
array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.])MNIST數(shù)據(jù)集圖片像素值
例如:在MNIST數(shù)據(jù)集中,若想要查看訓(xùn)練集中第0張圖片像素值,則使用如下函數(shù):
mnist.train.images[0]輸出:
array([0. , 0. , 0. , 0. , 0. ,0. , 0. , 0. , 0. , 0. ,
...略去中間部分,太多了
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0.34901962, 0.9843138 , 0.9450981 ,
0.3372549 , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0.01960784,
0.8078432 , 0.96470594, 0.6156863 , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0.01568628, 0.45882356, 0.27058825,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. ], dtype=float32)
將數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò)
例如:
BATCH_SIZE = 200xs,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()函數(shù)包含一個參數(shù)BATCH_SIZE,表示隨機從訓(xùn)練集中抽取BATCH_SIZE個樣本輸入神經(jīng)網(wǎng)絡(luò),并將樣本的像素值和標簽分別賦給xs和ys。在本例中,BATCH_SIZE設(shè)置為200,表示一次將200個樣本的像素值和標簽分別賦值給xs和ys,故xs的形狀為(200,784),對應(yīng)的ys的形狀為(200,10)。
TensorFlow模型搭建基礎(chǔ)
實現(xiàn)“MNIST數(shù)據(jù)集手寫數(shù)字識別 ”的常用函數(shù)
①?tf.get_collection("")?函數(shù)表示從collection集合中取出全部變量生成一個列表 。
②?tf.add()函數(shù)表示將參數(shù)列表中對應(yīng)元素相加 。例如:
import tensorflow as tfx=tf.constant([[1,2],[1,2]])y=tf.constant([[1,1],[1,2]])z=tf.add(x,y)with tf.Session( ) as sess:print(sess.run(z))輸出:
[[2 3][2 4]]
③?tf.cast(x,dtype)函數(shù)表示將參數(shù)x轉(zhuǎn)換為指定數(shù)據(jù)類型
import numpy as npA = 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)輸出:
從輸出結(jié)果看出,將矩陣A由整數(shù)型變?yōu)?2位浮點型。
④?tf.equal()函數(shù)表示對比兩個矩陣或者向量的元素。若對應(yīng)元素相等,則返回True,若對應(yīng)元素不相等,則返回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個元素不等,故輸出結(jié)果中,第1、2、3個元素取值為 True,第4、5個元素取值為 False。
⑤tf.reduce_mean(x,axis)函數(shù)表示求取矩陣或張量指定維度的平均值。
若不指定第二個參數(shù),則在所有元素中取平均值
若指定第二個參數(shù)為0,則在第一維元素上取平均值,即每一列求平均值
若指定第二個參數(shù)為1,則在第二維元素上取平均值,即每一行求平均值
例如:
x = [[1., 1.],[2., 2.]]with tf.Session() as sess:print(sess.run(tf.reduce_mean(x)))print(sess.run(tf.reduce_mean(x,0)))print(sess.run(tf.reduce_mean(x,1)))輸出:
1.5[1.5 1.5]
[1. 2.]
⑥?tf.argmax(x,axis)函數(shù)表示返回指定維度axis下,參數(shù)x中最大值索引號。
例如:
在tf.argmax([1,0,0],1)函數(shù)中,axis為1,參數(shù)x為[1,0,0],表示在參數(shù)x的第一個維度取最大值對應(yīng)的索引號,故返回 0。
⑦?os.path.join()函數(shù)表示把參數(shù)字符串按照路徑命名規(guī)則拼接。
例如:
import osos.path.join('/hello/','good/boy/','doiido')輸出:
'/hello/good/boy/doiido'⑧?字符串.split()函數(shù)表示定按照指定“拆分符”對字符串拆分,返回拆分列表。
例如:'./model/mnist_model-1001'.split('/')[-1].split('-')[-1]在該例子中,共進行兩次拆分。
拆分符為/,返回拆分列表,并提取列表中索引為-1 的元素即倒數(shù)第一個元素;
拆分符為-,返回拆分列表,并提取列表中索引為-1 的元素即倒數(shù)第一個元素,故函數(shù)返回值為 1001。
⑨?tf.Graph( ).as_default( )函數(shù)表示將當前圖設(shè)置成為默認圖,并返回一個上下文管理器。
該函數(shù)一般與with關(guān)鍵字搭配使用,應(yīng)用于將已經(jīng)定義好的神經(jīng)網(wǎng)絡(luò)在計算圖中復(fù)現(xiàn)。
例如:with tf.Graph().as_default() as g,表示將在Graph()內(nèi)定義的節(jié)點加入到計算圖g中。
神經(jīng)網(wǎng)絡(luò)模型的保存
在反向傳播過程中,一般會間隔一定輪數(shù)保存一次神經(jīng)網(wǎng)絡(luò)模型,并產(chǎn)生三個文件:
保存當前圖結(jié)構(gòu)的.meta文件
保存當前參數(shù)名的.index文件
保存當前參數(shù)的.data文件
在Tensorflow中如下表示:
saver = tf.train.Saver()with tf.Session() as sess:for i in range(STEPS):if i % 輪數(shù) == 0:saver.save(sess, os.path.join(MODEL_SAVE_PATH,MODEL_NAME), global_step=global_step)其中,tf.train.Saver()用來實例化saver對象。上述代碼表示,神經(jīng)網(wǎng)絡(luò)每循環(huán)規(guī)定的輪數(shù),將神經(jīng)網(wǎng)絡(luò)模型中所有的參數(shù)等信息保存到指定的路徑中,并在存放網(wǎng)絡(luò)模型的文件夾名稱中注明保存模型時的訓(xùn)練輪數(shù)。
神經(jīng)網(wǎng)絡(luò)模型的加載
在測試網(wǎng)絡(luò)效果時,需要將訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型加載,在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結(jié)構(gòu)中進行加載保存的神經(jīng)網(wǎng)絡(luò)模型,若ckpt和保存的模型在指定路徑中存在,則將保存的神經(jīng)網(wǎng)絡(luò)模型加載到當前會話中。
加載模型中參數(shù)的滑動平均值
在保存模型時,若模型中采用滑動平均,則參數(shù)的滑動平均值會保存在相應(yīng)文件中。通過實例化saver對象,實現(xiàn)參數(shù)滑動平均值的加載,在TensorFlow中如下表示:
ema = tf.train.ExponentialMovingAverage(滑動平均基數(shù))ema_restore = ema.variables_to_restore()saver = tf.train.Saver(ema_restore)神經(jīng)網(wǎng)絡(luò)模型準確率評估方法
在網(wǎng)絡(luò)評估時,一般通過計算在一組數(shù)據(jù)上的識別準確率,評估神經(jīng)網(wǎng)絡(luò)的效果。在TensorFlow 中這樣表示:
correct_prediction = tf.equal(tf.argmax(y, 1),tf.argmax(y_, 1))accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))y:表示在一組數(shù)據(jù)(即batch_size個數(shù)據(jù))上神經(jīng)網(wǎng)絡(luò)模型的預(yù)測結(jié)果,y的形狀為[batch_size,10],每一行表示一張圖片的識別結(jié)果。
tf.argmax():取出每張圖片對應(yīng)向量中最大值元素對應(yīng)的索引值,組成長度為輸入數(shù)據(jù)batch_size個的一維數(shù)組。
tf.equal():判斷預(yù)測結(jié)果張量和實際標簽張量的每個維度是否相等,若相等則返回 True,不相等則返回 False。
tf.cast():將得到的布爾型數(shù)值轉(zhuǎn)化為實數(shù)型,再通過tf.reduce_mean()函數(shù)求平均值,最終得到神經(jīng)網(wǎng)絡(luò)模型在本組數(shù)據(jù)上的準確率。
網(wǎng)絡(luò)模型分析
神經(jīng)網(wǎng)絡(luò)包括前向傳播過程和反向傳播過程。
反向傳播過程中用到的正則化、指數(shù)衰減學習率、滑動平均方法的設(shè)置、以及測試模塊。
前向傳播過程(forward.py )
前向傳播過程完成神經(jīng)網(wǎng)絡(luò)的搭建,結(jié)構(gòu)如下:
def forward(x, regularizer):w=b=y=return ydef get_weight(shape, regularizer):def get_bias(shape):前向傳播過程中,需要定義神經(jīng)網(wǎng)絡(luò)中的參數(shù)w和偏置b,定義由輸入到輸出的網(wǎng)絡(luò)結(jié)構(gòu)。
通過定義函數(shù)get_weight()實現(xiàn)對參數(shù)w的設(shè)置,包括參數(shù)w的形狀和是否正則化的標志。同樣,通過定義函數(shù)get_bias()實現(xiàn)對偏置b的設(shè)置。
反向傳播過程( back word.py )
反向傳播過程完成網(wǎng)絡(luò)參數(shù)的訓(xùn)練,結(jié)構(gòu)如下:
def backward( mnist ):x = tf.placeholder(dtype,shape)y_ = tf.placeholder(dtype,shape)#定義前向傳播函數(shù)y = forward()global_step =loss =train_step = tf.train .GradientDescentOptimizer( learning_rate).minimize(loss, global_step=global_step)#實例化saver對象saver = tf.train.Saver()with tf.Session() as sess:#初始化所有模型參數(shù)tf.initialize_all_variables().run()#訓(xùn)練模型for i in range(STEPS):sess.run(train_step, feed_dict={x: , y_: })if i % 輪數(shù) == 0:printsaver.save( )反向傳播過程中:
tf.placeholder(dtype, shape):實現(xiàn)訓(xùn)練樣本x和樣本標簽y_占位
參數(shù)dtype表示數(shù)據(jù)的類型
參數(shù)shape表示數(shù)據(jù)的形狀
y:定義的前向傳播函數(shù) forward
loss:定義的損失函數(shù),一般為預(yù)測值與樣本標簽的交叉熵(或均方誤差)與正則化損失之和
train_step:利用優(yōu)化算法對模型參數(shù)進行優(yōu)化
常用優(yōu)化算法有GradientDescentOptimizer、AdamOptimizer、MomentumOptimizer,在上述代碼中使用的GradientDescentOptimizer優(yōu)化算法。
接著實例化saver對象:
tf.initialize_all_variables().run():實例化所有參數(shù)模型
sess.run( ):實現(xiàn)模型的訓(xùn)練優(yōu)化過程,并每間隔一定輪數(shù)保存一次模型
正則化、指數(shù)衰減學習率、滑動平均方法的設(shè)置
① 正則化項 regularization
當在前向傳播過程中即forward.py文件中,設(shè)置正則化參數(shù)regularization為1 時,則表明在反向傳播過程中優(yōu)化模型參數(shù)時,需要在損失函數(shù)中加入正則化項。結(jié)構(gòu)如下:
首先,需要在前向傳播過程即forward.py文件中加入
if regularizer != None: tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))其次,需要在反向傳播過程即byackword.py文件中加入
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_, 1))cem = tf.reduce_mean(ce)loss = cem + tf.add_n(tf.get_collection('losses'))tf.nn.sparse_softmax_cross_entropy_with_logits():表示softmax()函數(shù)與交叉熵一起使用。
②指數(shù)衰減學習率
在訓(xùn)練模型時,使用指數(shù)衰減學習率可以使模型在訓(xùn)練的前期快速收斂接近較優(yōu)解,又可以保證模型在訓(xùn)練后期不會有太大波動。
運用指數(shù)衰減學習率,需要在反向傳播過程即backword.py文件中加入:
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE,global_step,LEARNING_RATE_STEP, LEARNING_RATE_DECAY,staircase=True)③ 滑動平均
在模型訓(xùn)練時引入滑動平均可以使模型在測試數(shù)據(jù)上表現(xiàn)的更加健壯。
需要在反向傳播過程即backword.py文件中加入:
ema = tf.train .ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)ema_op = ema.apply(tf.trainable_variables())with tf.control_dependencies([train_step, ema_op]):train_op = tf.no_op(name='train')測試過程( test .py )
當神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練完成后,便可用于測試數(shù)據(jù)集,驗證神經(jīng)網(wǎng)絡(luò)的性能。結(jié)構(gòu)如下:
首先,制定模型測試函數(shù)test()
def test( mnist ):with tf.Graph( ).as_default( ) as g:#給x y_ 占位x = tf.placeholder( dtype, , shape) )y_ = tf.placeholder( dtype, , shape) )#前向傳播得到預(yù)測結(jié)果yy = mnist_forward.forward(x, None )#實例化可還原滑動平均的saverema = 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))while True:with tf.Session() as sess:#加載訓(xùn)練好的模型ckpt = tf.train.get_checkpoint_state( 存儲路徑) )#如果已有ckpt模型則恢復(fù)if ckpt and ckpt.model_checkpoint_path:#恢復(fù)會話saver.restore(sess, ckpt.model_checkpoint_path)#恢復(fù)輪數(shù)global_ste = = ckpt.model_checkpoint_path.split('/')[-1].split('- ')[-1]#計算準確率accuracy_score = sess.run(accuracy, feed_dict={x: 測試數(shù)據(jù) , y_: 測試數(shù)據(jù)標簽 })#打印提示print("After %s training step(s), test accuracy=%g" % (global_step, accuracy_score ))#如果沒有模型else:print('No checkpoint file found') # # 模型不存在 提示return其次,制定main()函數(shù)
def main():#加載測試數(shù)據(jù)集mnist = input_data.read_data_sets ("./data/", one_hot=True)#調(diào)用定義好的測試函數(shù)test ()test(mnist)if __name__ == '__main__':main()通過對測試數(shù)據(jù)的預(yù)測得到準確率,從而判斷出訓(xùn)練出的神經(jīng)網(wǎng)絡(luò)模型的性能好壞。
當準確率低時,可能原因有模型需要改進,或者是訓(xùn)練數(shù)據(jù)量太少導(dǎo)致過擬合。
網(wǎng)絡(luò)模型搭建與測試
實現(xiàn)手寫體MNIST數(shù)據(jù)集的識別任務(wù),共分為三個模塊文件,分別是:
描述網(wǎng)絡(luò)結(jié)構(gòu)的前向傳播過程文件(mnist_forward.py)
描述網(wǎng)絡(luò)參數(shù)優(yōu)化方法的反向傳播過程文件(mnist_backward.py)、
驗證模型準確率的測試過程文件(mnist_test.py )。
前向傳播過程文件( mnist_forward.py )
在前向傳播過程中,需要定義網(wǎng)絡(luò)模型輸入層個數(shù)、隱藏層節(jié)點數(shù)、輸出層個數(shù),定義網(wǎng)絡(luò)參數(shù) w、偏置 b,定義由輸入到輸出的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
實現(xiàn)手寫體MNIST數(shù)據(jù)集的識別任務(wù)前向傳播過程如下:
import tensorflow as tfINPUT_NODE = 784OUTPUT_NODE = 10LAYER1_NODE = 500def get_weight(shape, regularizer):w = tf.Variable(tf.truncated_normal(shape,stddev=0.1))if regularizer != None: tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))return wdef get_bias(shape): b = tf.Variable(tf.zeros(shape)) return bdef forward(x, regularizer):w1 = get_weight([INPUT_NODE, LAYER1_NODE], regularizer)b1 = get_bias([LAYER1_NODE])y1 = tf.nn.relu(tf.matmul(x, w1) + b1)w2 = get_weight([LAYER1_NODE, OUTPUT_NODE], regularizer)b2 = get_bias([OUTPUT_NODE])y = tf.matmul(y1, w2) + b2return y由上述代碼可知,在前向傳播過程中,規(guī)定網(wǎng)絡(luò):
輸入結(jié)點:784個(代表每張輸入圖片的像素個數(shù))
隱藏層節(jié)點:500 個
輸出節(jié)點:10個(表示輸出為數(shù)字 0-9的十分類)
w1:由輸入層到隱藏層的參數(shù),形狀為[784,500]
w2:由隱藏層到輸出層的參數(shù),形狀為[500,10]
(參數(shù)滿足截斷正態(tài)分布,并使用正則化,將每個參數(shù)的正則化損失加到總損失中)
b1:由輸入層到隱藏層的偏置,形狀為長度為 500的一維數(shù)組
b2:由隱藏層到輸出層的偏置,形狀為長度為10的一維數(shù)組,初始化值為全 0。
y1:隱藏層輸出,由前向傳播結(jié)構(gòu)第一層為輸入x與參數(shù)w1矩陣相乘加上偏置b1,再經(jīng)過relu函數(shù)得到
y:輸出,由前向傳播結(jié)構(gòu)第二層為隱藏層輸出y1與參數(shù)w2矩陣相乘加上偏置b2得到
(由于輸出y要經(jīng)過softmax函數(shù),使其符合概率分布,故輸出y不經(jīng)過relu函數(shù))
反向傳播過程文件(mnist_backward.py )
反向傳播過程實現(xiàn)利用訓(xùn)練數(shù)據(jù)集對神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練,通過降低損失函數(shù)值,實現(xiàn)網(wǎng)絡(luò)模型參數(shù)的優(yōu)化,從而得到準確率高且泛化能力強的神經(jīng)網(wǎng)絡(luò)模型。
實現(xiàn)手寫體MNIST數(shù)據(jù)集的識別任務(wù)反向傳播過程如下:
import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataimport mnist_forwardimport osBATCH_SIZE = 200LEARNING_RATE_BASE = 0.1LEARNING_RATE_DECAY = 0.99REGULARIZER = 0.0001STEPS = 500 #50000MOVING_AVERAGE_DECAY = 0.99MODEL_SAVE_PATH="./model/"MODEL_NAME="mnist_model"def backward(mnist):x = tf.placeholder(tf.float32, [None, mnist_forward.INPUT_NODE])y_ = tf.placeholder(tf.float32, [None, mnist_forward.OUTPUT_NODE])y = mnist_forward.forward(x, REGULARIZER)global_step = tf.Variable(0, trainable=False)ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))cem = tf.reduce_mean(ce)loss = cem + tf.add_n(tf.get_collection('losses'))learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE,global_step,mnist.train.num_examples / BATCH_SIZE, LEARNING_RATE_DECAY,staircase=True)train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)ema_op = ema.apply(tf.trainable_variables())with tf.control_dependencies([train_step, ema_op]):train_op = tf.no_op(name='train')saver = tf.train.Saver()with tf.Session() as sess:init_op = tf.global_variables_initializer()sess.run(init_op)for i in range(STEPS):xs, ys = mnist.train.next_batch(BATCH_SIZE)_, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: xs, y_: ys})if i % 1000 == 0:print("After %d training step(s), loss on training batch is %g." % (step, loss_value))saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)def main():mnist = input_data.read_data_sets("./data/", one_hot=True)backward(mnist)if __name__ == '__main__':main()輸出:
Extracting ./data/train-images-idx3-ubyte.gzExtracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/t10k-images-idx3-ubyte.gz
Extracting ./data/t10k-labels-idx1-ubyte.gz
After 1 training step(s), loss on training batch is 3.47547.
After 1001 training step(s), loss on training batch is 0.283958.
After 2001 training step(s), loss on training batch is 0.304716.
After 3001 training step(s), loss on training batch is 0.266811.
...省略
After 47001 training step(s), loss on training batch is 0.128592.
After 48001 training step(s), loss on training batch is 0.125534.
After 49001 training step(s), loss on training batch is 0.123577.
由上述代碼可知,在反向傳播過程中:
引入tensorflow、input_data、前向傳播mnist_forward?和os模塊
定義每輪喂入神經(jīng)網(wǎng)絡(luò)的圖片數(shù)、初始學習率、學習率衰減率、正則化系數(shù)、訓(xùn)練輪數(shù)、模型保存路徑以及模型保存名稱等相關(guān)信息
反向傳播函數(shù)backword中:
讀入mnist,用placeholder給**訓(xùn)練數(shù)據(jù)**x和**標簽**y_占位
調(diào)用mnist_forward文件中的前向傳播過程forword()函數(shù),并設(shè)置正則化,計算訓(xùn)練數(shù)據(jù)集上的**預(yù)測結(jié)果**y
并給當前計算輪數(shù)計數(shù)器賦值,設(shè)定為不可訓(xùn)練類型
調(diào)用包含所有參數(shù)正則化損失的損失函數(shù)loss,并設(shè)定指數(shù)衰減學習率learning_rate
使用梯度衰減算法對模型優(yōu)化,降低損失函數(shù),并定義參數(shù)的滑動平均
在with結(jié)構(gòu)中:
實現(xiàn)所有參數(shù)初始化
每次喂入batch_size組(即 200 組)訓(xùn)練數(shù)據(jù)和對應(yīng)標簽,循環(huán)迭代steps輪
并每隔 1000 輪打印出一次損失函數(shù)值信息,并將當前會話加載到指定路徑
通過主函數(shù)main(),加載指定路徑下的訓(xùn)練數(shù)據(jù)集,并調(diào)用規(guī)定的backward()函數(shù)訓(xùn)練模型
測試過程文件(mnist_ test .py )
當訓(xùn)練完模型后,給神經(jīng)網(wǎng)絡(luò)模型輸入測試集驗證網(wǎng)絡(luò)的準確性和泛化性。注意,所用的測試集和訓(xùn)練集是相互獨立的。
實現(xiàn)手寫體MNIST數(shù)據(jù)集的識別任務(wù)測試傳播過程如下:
#coding:utf-8import timeimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataimport mnist_forwardimport mnist_backwardTEST_INTERVAL_SECS = 5def test(mnist):with tf.Graph().as_default() as g:x = tf.placeholder(tf.float32, [None, mnist_forward.INPUT_NODE])y_ = tf.placeholder(tf.float32, [None, mnist_forward.OUTPUT_NODE])y = mnist_forward.forward(x, None)ema = tf.train.ExponentialMovingAverage(mnist_backward.MOVING_AVERAGE_DECAY)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))while True:with tf.Session() as sess:ckpt = tf.train.get_checkpoint_state(mnist_backward.MODEL_SAVE_PATH)if ckpt and ckpt.model_checkpoint_path:saver.restore(sess, ckpt.model_checkpoint_path)global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]accuracy_score = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})print("After %s training step(s), test accuracy = %g" % (global_step, accuracy_score))returnelse:print('No checkpoint file found')returntime.sleep(TEST_INTERVAL_SECS)def main():mnist = input_data.read_data_sets("./data/", one_hot=True)test(mnist)if __name__ == '__main__':main()輸出:
Extracting ./data/train-images-idx3-ubyte.gzExtracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/t10k-images-idx3-ubyte.gz
Extracting ./data/t10k-labels-idx1-ubyte.gz
After 49001 training step(s), test accuracy = 0.98
在上述代碼中,
引入time模塊、tensorflow、input_data、前向傳播mnist_forward、反向傳播 mnist_backward 模塊和 os 模塊
規(guī)定程序 5 秒的循環(huán)間隔時間
定義測試函數(shù)test(),讀入mnist數(shù)據(jù)集:
利用tf.Graph()復(fù)現(xiàn)之前定義的計算圖
利用placeholder給訓(xùn)練數(shù)據(jù)x和標簽y_占位
調(diào)用mnist_forward文件中的前向傳播過程forword()函數(shù),計算訓(xùn)練數(shù)據(jù)集上的預(yù)測結(jié)果y
實例化具有滑動平均的saver對象,從而在會話被加載時模型中的所有參數(shù)被賦值為各自的滑動平均值,增強模型的穩(wěn)定性
計算模型在測試集上的準確率
在with結(jié)構(gòu)中,加載指定路徑下的ckpt:
若模型存在,則加載出模型到當前對話,在測試數(shù)據(jù)集上進行準確率驗證,并打印出當前輪數(shù)下的準確率
若模型不存在,則打印出模型不存在的提示,從而test()函數(shù)完成
通過主函數(shù)main(),加載指定路徑下的測試數(shù)據(jù)集,并調(diào)用規(guī)定的test函數(shù),進行模型在測試集上的準確率驗證
從上面的運行結(jié)果可以看出,最終在測試集上的準確率在98%,模型訓(xùn)練mnist_backward.py與模型測試mnist_test.py可同時執(zhí)行,這里可以更加直觀看出:隨著訓(xùn)練輪數(shù)的增加,網(wǎng)絡(luò)模型的損失函數(shù)值在不斷降低,并且在測試集上的準確率在不斷提升,有較好的泛化能力。
參考:人工智能實踐:Tensorflow筆記
總結(jié)
以上是生活随笔為你收集整理的matlab朴素贝叶斯手写数字识别_TensorFlow手写数字识别(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空调外机会不会从房顶掉落啊?
- 下一篇: 大连小平岛房价为什么那么高