TensorFlow 学习(3)——MNIST机器学习入门
通過對MNIST的學習,對TensorFlow和機器學習快速上手。
MNIST:手寫數字識別數據集
?
MNIST數據集
60000行的訓練數據集 和 10000行測試集
每張圖片是一個28*28的像素圖。用一個數字數組來表示這張圖片。這里把這個數組展開成一個向量,長度為28*28=784。(其實展平圖片丟失了許多關鍵的二維結構信息,但這里他這么做了)
訓練集包括兩部分:索引圖片集[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 pythonimport 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})?
轉載于:https://www.cnblogs.com/zodiac7/p/9304015.html
總結
以上是生活随笔為你收集整理的TensorFlow 学习(3)——MNIST机器学习入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1236 Network o
- 下一篇: 数据结构(java版)学习笔记(序章)