TensorFlow 學習(3)——MNIST機器學習入門

經過對MNIST的學習,對TensorFlow和機器學習快速上手。python

MNIST:手寫數字識別數據集算法

 

MNIST數據集數組

60000行的訓練數據集 和 10000行測試集機器學習

每張圖片是一個28*28的像素圖。用一個數字數組來表示這張圖片。這裏把這個數組展開成一個向量,長度爲28*28=784。(其實展平圖片丟失了許多關鍵的二維結構信息,但這裏他這麼作了)ide

訓練集包括兩部分:索引圖片集[60000,784],標籤集[60000,10]函數

標籤機使用的是 one-hot vectors。一個one-hot向量除了某一位數字是1之外其餘都是0.因此在此教程中,數字n將表示成一個只有在第n維度數字是1的10維變量。例如標籤0標位[1,0,0,0,0,0,0,0,0,0]性能

 

Softmax迴歸學習

softmax模型能夠用來給不一樣的對象分配機率。測試

通常分爲兩步。優化

第一步:

尋找證據(evidense):須要找到數據中證實該圖片是某標籤的證據,或者不是某標籤的證據。以本圖爲例,若是某個像素具備很強的證聽說明這張圖片不屬於該類,則相應的權值爲負數;反之若是這個像素擁有有力的證據支持這張圖片屬於這個類,則權值爲正數。最後再對這些像素值進行加權求和。持外,咱們也須要加入一個額外的偏置量(bias),由於輸入每每帶有一些無關的干擾量。所以對於給定的輸入圖片x它表明的是數字i的證據能夠表示爲

其中Wi表示權重,bi表示數字i的偏置量,j表示給定圖片x的像素索引用於像素求和。而後用softmax函數能夠把這些evidence轉化爲機率

 

這裏softmax能夠看作一個激勵函數(activation)或者link函數,將咱們定義的線性函數的輸出轉換爲咱們想要的機率形式。所以,給定一個圖片,他對於每一個數字的吻合度能夠被softmax轉化爲一個機率值。一個典型的softmax函數爲:

 

展開右邊的式子,有:

 但更多時候把softmax模型函數定義爲前一種形式:把輸入值當成冪指數求值,再正則化這些結果值。這個冪運算表示,更大的證據對應更大的假設模型裏面的乘數權重值。反之,擁有更少的證據意味着在假設模型裏面擁有更小的乘數係數。假設模型裏的權值不能夠是0值或者負值。Softmax而後會正則化這些權重值,使他們的總和等於1,以此構造一個有效的機率分佈。

     

實現迴歸模型

  爲了用python實現高效的數值計算,通常會使用Numpy這樣的函數庫,會把相似於矩陣乘法這樣的複雜運算使用其餘的外部語言實現。然而頻繁於python和外部語言切換是一筆很大的開銷。

TensorFlow也吧複雜運算放在python外部完成,可是爲了不這些開銷,它作了進一步完善。這裏就是咱們說的先構造圖在運算,而不是進行單一的複雜運算。

#!/usr/bin/env python

import os
os.environ['TF_CPP_MIN_LOG+LEVEL'] = '2'
import tensorflow as tf

x = tf.placeholder(tf.float32,[None,784])
#這裏x是一個佔位符,咱們不但願直接所有讀入全部的圖,而是在運行計算時動態的讀入這些圖

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#Variable 表示一個能夠修改的張量。它們能夠用於計算輸入值,也能夠在計算中被修改。

y = tf.nn.softmax(tf.matmul(x,W) + b)
#tf.matmul(x,W)表示x乘以W(注意是矩陣相乘)

 

訓練模型

  爲了訓練咱們的模型,咱們首先須要定義一個損失函數,而後儘可能最小化這個指標。一個比較經典的成本函數是交叉熵

                     

  y是咱們預測的機率分佈,y‘是實際的分佈(咱們輸入的 one-hot vector)。比較粗糙的理解是,交叉熵し用來衡量咱們預測用於描述用於描述真相的低效性。

y_ = tf.placeholder('float',[None,10])
#用來存儲正確的值

cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#這裏交叉熵不只僅用來衡量單一的一對預測和真實值,而是全部100幅圖片的交叉熵的總和。對於100個數據點的預測表現び對單一數據點的表現能更好地描述咱們的模型的性能

#TensorFlow擁有一張描述你各個計算單元的圖,它能夠自動地使用反向傳播算法來有效的肯定你的變量是如和影響你要最小化的那個成本值的。而後,TensorFlow會用你選擇的優化算法來不斷的修改變量下降成本
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#這裏要求TensorFlow使用梯度降低算法以0.01的學習速率最小化交叉熵。固然TensorFlow還集成了許多其餘優化算法。
#TensorFlow在這裏實際上作的是,在後臺給描述你的計算的那張圖裏加上一系列新的計算操做單元用於實現反向傳播算法和梯度降低算法。而後它返回給你的只是一個單一的操做,當運行這個操做時,タ用梯度降低算法訓練你的模型,微調你的變量,不斷減小成本

init = tf.initialize_all_variables()

with tf.Session() as sess:
sess.run(init)
for i in range(1000):#讓模型循環訓練1000次
batch_xs,batch_ys = mnist.train.next_batch(100)#隨機抓取訓練數據中的100個批處理數據點
sess.run(train_step,feed_dict = {x:batch_xs,y: batch_ys})

 

評估模型

如何評估咱們的模型?

首先找出那些預測正確的標籤。tf.argmax是一個很是有用的函數。它能給出某個tensor對象在某一位上的其數據最大值所在的索引值。因爲標籤向量是由0,1組成,所以最大值1所在的索引位置急速類別標籤,好比tf.argmax(y,1)返回的是模型對於任意輸入x預測到的標籤值,而tf.argmin(y_,1),咱們能夠用tf.equal來檢測咱們的預測值是否正確。

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

這行代碼會給咱們一組布爾值。爲了求出預測準確率,咱們將布爾值轉化爲1和0,在將其相加求平均值

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

最後,咱們計算所學習到的模型在測試數據集上的正確率

print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
相關文章
相關標籤/搜索