一、mnist手寫識(shí)別代碼運(yùn)行過程
1 下載數(shù)據(jù)庫
在http://yann./exdb/mnist/下載上面提到的4個(gè)gz文件,放到本地目錄如 /tmp/mnist
2 下載input_data.py,放在/home/tmp/test目錄下
https://tensorflow./tensorflow/+/master/tensorflow/g3doc/tutorials/mnist/input_data.py
3 在/home/tmp/test目錄下創(chuàng)建文件test_tensorflow_mnist.py,,內(nèi)容如下:
!/usr/bin/env python
import input_data
import tensorflow as tf
mnist = input_data.read_data_sets(“/tmp/mnist”, one_hot=True)
x = tf.placeholder(“float”, [None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
y_ = tf.placeholder(“float”, [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, “float”))
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
4 運(yùn)行,。大概之需要幾秒鐘時(shí)間,,輸出結(jié)果是91%左右,。
二,、數(shù)據(jù)集
1,、數(shù)據(jù)
60000行的訓(xùn)練數(shù)據(jù)集(mnist.train)和10000行的測(cè)試數(shù)據(jù)集(mnist.test)。這樣的切分很重要,,在機(jī)器學(xué)習(xí)模型設(shè)計(jì)時(shí)必須有一個(gè)單獨(dú)的測(cè)試數(shù)據(jù)集不用于訓(xùn)練而是用來評(píng)估這個(gè)模型的性能,,從而更加容易把設(shè)計(jì)的模型推廣到其他數(shù)據(jù)集上(泛化)。
2,、輸入X
因此,,在MNIST訓(xùn)練數(shù)據(jù)集中,mnist.train.images 是一個(gè)形狀為 [60000, 784] 的張量,,第一個(gè)維度數(shù)字用來索引圖片,,第二個(gè)維度數(shù)字用來索引每張圖片中的像素點(diǎn)。在此張量里的每一個(gè)元素,,都表示某張圖片里的某個(gè)像素的強(qiáng)度值,,值介于0和1之間。
3,、輸出y
相對(duì)應(yīng)的MNIST數(shù)據(jù)集的標(biāo)簽是介于0到9的數(shù)字,,用來描述給定圖片里表示的數(shù)字。為了用于這個(gè)教程,,我們使標(biāo)簽數(shù)據(jù)是”one-hot vectors”,。 一個(gè)one-hot向量除了某一位的數(shù)字是1以外其余各維度數(shù)字都是0。所以在此教程中,,數(shù)字n將表示成一個(gè)只有在第n維度(從0開始)數(shù)字為1的10維向量,。比如,標(biāo)簽0將表示成([1,0,0,0,0,0,0,0,0,0,0]),。因此,, mnist.train.labels 是一個(gè) [60000, 10] 的數(shù)字矩陣。
三,、思路方法
1,、實(shí)現(xiàn)回歸模型
x = tf.placeholder(tf.float32,[None,784])
x不是一個(gè)特定的值,而是一個(gè)占位符placeholder,,我們?cè)赥ensorFlow運(yùn)行計(jì)算時(shí)輸入這個(gè)值,。我們希望能夠輸入任意數(shù)量的MNIST圖像,每一張圖展平成784維的向量,。我們用2維的浮點(diǎn)數(shù)張量來表示這些圖,,這個(gè)張量的形狀是[None,784 ]。(這里的None表示此張量的第一個(gè)維度可以是任何長(zhǎng)度的,。)
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
實(shí)現(xiàn) y=W*x+b
2,、訓(xùn)練模型
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
一個(gè)非常常見的,非常漂亮的成本函數(shù)是“交叉熵”(cross-entropy),。交叉熵產(chǎn)生于信息論里面的信息壓縮編碼技術(shù),,但是它后來演變成為從博弈論到機(jī)器學(xué)習(xí)等其他領(lǐng)域里的重要技術(shù)手段。
首先,,用 tf.log 計(jì)算 y 的每個(gè)元素的對(duì)數(shù),。接下來,我們把 y_ 的每一個(gè)元素和 tf.log(y) 的對(duì)應(yīng)元素相乘,。最后,,用 tf.reduce_sum 計(jì)算張量的所有元素的總和。(注意,,這里的交叉熵不僅僅用來衡量單一的一對(duì)預(yù)測(cè)和真實(shí)值,,而是所有100幅圖片的交叉熵的總和。對(duì)于100個(gè)數(shù)據(jù)點(diǎn)的預(yù)測(cè)表現(xiàn)比單一數(shù)據(jù)點(diǎn)的表現(xiàn)能更好地描述我們的模型的性能,。
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
在這里,,我們要求TensorFlow用梯度下降算法(gradient descent algorithm)以0.01的學(xué)習(xí)速率最小化交叉熵。梯度下降算法(gradient descent algorithm)是一個(gè)簡(jiǎn)單的學(xué)習(xí)過程,,TensorFlow只需將每個(gè)變量一點(diǎn)點(diǎn)地往使成本不斷降低的方向移動(dòng),。當(dāng)然TensorFlow也提供了其他許多優(yōu)化算法:只要簡(jiǎn)單地調(diào)整一行代碼就可以使用其他的算法。
TensorFlow在這里實(shí)際上所做的是,,它會(huì)在后臺(tái)給描述你的計(jì)算的那張圖里面增加一系列新的計(jì)算操作單元用于實(shí)現(xiàn)反向傳播算法和梯度下降算法,。然后,它返回給你的只是一個(gè)單一的操作,,當(dāng)運(yùn)行這個(gè)操作時(shí),,它用梯度下降算法訓(xùn)練你的模型,微調(diào)你的變量,,不斷減少成本,。
sess = tf.Session()
sess.run(init)
初始化所有參數(shù)。
for i in range(1000):
batch_xs,batch_ys = mnist.train.next_batch(100)
sess.run(train_step,feed_dict={x:batch_xs,y_:batch_ys})
循環(huán)1000次,。該循環(huán)的每個(gè)步驟中,,我們都會(huì)隨機(jī)抓取訓(xùn)練數(shù)據(jù)中的100個(gè)批處理數(shù)據(jù)點(diǎn),然后我們用這些數(shù)據(jù)點(diǎn)作為參數(shù)替換之前的占位符來運(yùn)行train_step,。
使用一小部分的隨機(jī)數(shù)據(jù)來進(jìn)行訓(xùn)練被稱為隨機(jī)訓(xùn)練(stochastic training)- 在這里更確切的說是隨機(jī)梯度下降訓(xùn)練,。在理想情況下,我們希望用我們所有的數(shù)據(jù)來進(jìn)行每一步的訓(xùn)練,,因?yàn)檫@能給我們更好的訓(xùn)練結(jié)果,,但顯然這需要很大的計(jì)算開銷,。所以,每一次訓(xùn)練我們可以使用不同的數(shù)據(jù)子集,,這樣做既可以減少計(jì)算開銷,,又可以最大化地學(xué)習(xí)到數(shù)據(jù)集的總體特性。
3,、評(píng)估我們的模型
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
這行代碼會(huì)給我們一組布爾值,。為了確定正確預(yù)測(cè)項(xiàng)的比例,,我們可以把布爾值轉(zhuǎn)換成浮點(diǎn)數(shù),,然后取平均值。例如,,[True, False, True, True] 會(huì)變成 [1,0,1,1] ,,取平均值后得到 0.75.
accuracy = tf.reduce_mean(tf.cast(correct_prediction,”float”))
最后,我們計(jì)算所學(xué)習(xí)到的模型在測(cè)試數(shù)據(jù)集上面的正確率,。
print sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels})
輸出這個(gè)最終結(jié)果值應(yīng)該大約是91%,。
|