Tensorflow下的Mnist識別

MNIST解析

MNIST是深度學(xué)習(xí)的經(jīng)典入門demo,他是由6萬張訓(xùn)練圖片和1萬張測試圖片構(gòu)成的,每張圖片都是28*28大小,白底黑字(如下圖),而且都是黑白色構(gòu)成(這里的黑色是一個0-1的浮點數(shù),黑色越深表示數(shù)值越靠近1),這些圖片是采集的不同的人手寫從0到9的數(shù)字。TensorFlow將這個數(shù)據(jù)集和相關(guān)操作封裝到了庫中,下面我們來一步步解讀深度學(xué)習(xí)MNIST的過程。

這里使用了一個28*28=784列的數(shù)據(jù)來表示一個圖片的構(gòu)成,也就是說,每一個點都是這個圖片的一個特征,這個其實比較好理解,因為每一個點都會對圖片的樣子和表達的含義有影響,只是影響的大小不同而已。至于為什么要將28*28的矩陣攤平成為一個1行784列的一維數(shù)組,我猜測可能是因為這樣做會更加簡單直觀。


這個程序參考自極客學(xué)院。

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

# MNIST數(shù)據(jù)存放的路徑

file = "./MNIST"

# 導(dǎo)入數(shù)據(jù)

mnist = input_data.read_data_sets(file, one_hot=True)

# 模型的輸入和輸出

x = tf.placeholder(tf.float32, shape=[None, 784])

y_ = tf.placeholder(tf.float32, shape=[None, 10])

# 模型的權(quán)重和偏移量

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

# 創(chuàng)建Session

sess = tf.InteractiveSession()

# 初始化權(quán)重變量

sess.run(tf.global_variables_initializer())

y = tf.nn.softmax(tf.matmul(x, W) + b)

# 交叉熵

cross_entropy = -tf.reduce_sum(y_*tf.log(y))

# 訓(xùn)練

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

for i in range(1000):

? ? batch = mnist.train.next_batch(50)

? ? train_step.run(feed_dict={x: batch[0], y_: batch[1]})

# 測試

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))


注釋:

# MNIST數(shù)據(jù)存放的路徑

file = "./MNIST"

# 導(dǎo)入數(shù)據(jù)

mnist = input_data.read_data_sets(file, one_hot=True)


將下載MNIST數(shù)據(jù)到./MNIST/文件夾下,此過程可能會由于網(wǎng)絡(luò)問題而出錯。建議自己從MNIST官網(wǎng)下載。將下載好的文件放到上述路徑下即可。input_data.read_data_sets()函數(shù)可以自動檢測指定目錄下是否存在MNIST數(shù)據(jù),如果存在,就不會下載了。

# 模型的輸入和輸出

x = tf.placeholder(tf.float32, shape=[None, 784])

y_ = tf.placeholder(tf.float32, shape=[None, 10])


這里x和y不是特定的值。它們是表示輸入和輸出的占位符,可以在進行計算的時候進行賦值。

模型的輸入x是一個22維的浮點數(shù)張量。它的大小為shape=[None, 784],其中784784是一張展平的MNIST圖片的維度。None表示其值不固定。輸出y_也是一個22維張量,它的每一行都是一個1010維的one-hot向量,用來表示對應(yīng)的MNIST圖片的類別。

# 模型的權(quán)重和偏移量

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))


變量W和b是線性模型的參數(shù),這個線性模型用如下表達式表示:

y_=x?W+b

y_=x?W+b

其中,y_y_和xx分別表示上述模型的輸入和輸出。W是一個784?10784?10的矩陣,因為輸入有784784個特征,同時有1010個輸出值。b是一個1010維的向量,是因為輸出有1010個分類。

# 創(chuàng)建Session

sess = tf.InteractiveSession()

# 初始化權(quán)重變量

# 以前版本的初始化代碼是

# sess.run(tf.initialize_all_variables())

sess.run(tf.global_variables_initializer())


變量需要經(jīng)過初始化才可以在Session中使用。

# 構(gòu)建回歸模型

y = tf.nn.softmax(tf.matmul(x, W) + b)


把向量化后的圖片x和權(quán)重矩陣W相乘,加上偏移量b,然后計算每個分類的softmax概率值。

# 交叉熵

cross_entropy = -tf.reduce_sum(y_*tf.log(y))


為訓(xùn)練過程指定損失函數(shù),損失函數(shù)是用來評估模型一次預(yù)測的好與壞的。在這里使用目標(biāo)類別和預(yù)測類別之間的交叉熵作為我們的損失函數(shù)。交叉熵定義如下:

L(y_,y)=?∑iy_ilog(yi)

L(y_,y)=?∑iy_ilog(yi)

其中y_y_表示目標(biāo)類別,也就是真實值。yy是預(yù)測類別,就是模型的輸出值。

# 訓(xùn)練

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

for i in range(1000):

? ? batch = mnist.train.next_batch(50)

? ? train_step.run(feed_dict={x: batch[0], y_: batch[1]})


這里我們使用TensorFlow內(nèi)置的梯度下降來進行優(yōu)化,即讓損失函數(shù)的值下降,步長為0.010.01。然后通過循環(huán),不斷地訓(xùn)練模型。每次循環(huán),都會從訓(xùn)練集中加載5050個樣本。

# 測試

# 這里返回一個布爾數(shù)組,形如[True, False, True]

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

# 將布爾數(shù)組轉(zhuǎn)換為浮點數(shù),并取平均值,如上布爾數(shù)組可以轉(zhuǎn)換為[1, 0, 1],計算平均值為0.667

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 計算在測試數(shù)據(jù)上的準(zhǔn)確率

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))


模型到這里就構(gòu)建完成了,但這個模型到底好不好,我們并不知道。所以需要在測試集上驗證模型的泛化能力。

參考文章:https://blog.csdn.net/u010858605/article/details/69830657

報錯處理:

1.NameError: name 'global_variables_initializer' is not defined

#init_op = tf.initialize_all_variables()

init_op = tf.global_variables_initializer()

2.tensorflow/core/framework/op_kernel.cc:1273] OP_REQUIRES failed at save_restore_v2_ops.cc:109 : Not found: Failed to create a directory: ; No such file or directory

#save_path = saver.save(sess, "model.ckpt")

save_path = saver.save(sess, "./model.ckpt")


tensorflow錯誤提示:

\src\github\tensorflow\tensorflow\core\framework\op_kernel.cc:1318] OP_REQUIRES failed at whole_file_read_ops.cc:114 : Invalid argument: NewRandomAccessFile failed to Create/Open: D:/dataset/kaggle/cat_or_dog/train/train/cat.2626.jpg

從錯誤中可以看出:

Invalid argument: NewRandomAccessFile failed to Create/Open: D:/dataset/kaggle/cat_or_dog/train/train/cat.2626.jpg

上面這一句的提示最重要,表示打開文件的路徑有問題

解決辦法:

1、仔細(xì)檢查文件的路徑是否存在

2、檢查路徑中是否含有其他的非法字符(中文等)

3、將路徑中的"\"替換為"/"

---------------------

MNIST整個庫的下載鏈接為:http://pan.baidu.com/s/1pLcpsk7

有人提取出了?train-images.idx3-ubyte 中的圖像,格式為bmp ,一起分享給大家,便于單張測試 鏈接為 ?https://pan.baidu.com/s/1c1GXdJi

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容