TensorFlow 学习(3)——MNIST机器学习入门
通過對(duì)MNIST的學(xué)習(xí),對(duì)TensorFlow和機(jī)器學(xué)習(xí)快速上手。
MNIST:手寫數(shù)字識(shí)別數(shù)據(jù)集
?
MNIST數(shù)據(jù)集
60000行的訓(xùn)練數(shù)據(jù)集 和 10000行測(cè)試集
每張圖片是一個(gè)28*28的像素圖。用一個(gè)數(shù)字?jǐn)?shù)組來表示這張圖片。這里把這個(gè)數(shù)組展開成一個(gè)向量,長度為28*28=784。(其實(shí)展平圖片丟失了許多關(guān)鍵的二維結(jié)構(gòu)信息,但這里他這么做了)
訓(xùn)練集包括兩部分:索引圖片集[60000,784],標(biāo)簽集[60000,10]
標(biāo)簽機(jī)使用的是 one-hot vectors。一個(gè)one-hot向量除了某一位數(shù)字是1以外其他都是0.所以在此教程中,數(shù)字n將表示成一個(gè)只有在第n維度數(shù)字是1的10維變量。例如標(biāo)簽0標(biāo)位[1,0,0,0,0,0,0,0,0,0]
?
Softmax回歸
softmax模型可以用來給不同的對(duì)象分配概率。
一般分為兩步。
第一步:
尋找證據(jù)(evidense):需要找到數(shù)據(jù)中證明該圖片是某標(biāo)簽的證據(jù),或者不是某標(biāo)簽的證據(jù)。以本圖為例,如果某個(gè)像素具有很強(qiáng)的證據(jù)說明這張圖片不屬于該類,則相應(yīng)的權(quán)值為負(fù)數(shù);反之如果這個(gè)像素?fù)碛杏辛Φ淖C據(jù)支持這張圖片屬于這個(gè)類,則權(quán)值為正數(shù)。最后再對(duì)這些像素值進(jìn)行加權(quán)求和。持外,我們也需要加入一個(gè)額外的偏置量(bias),因?yàn)檩斎胪鶐в幸恍o關(guān)的干擾量。因此對(duì)于給定的輸入圖片x它代表的是數(shù)字i的證據(jù)可以表示為
其中Wi表示權(quán)重,bi表示數(shù)字i的偏置量,j表示給定圖片x的像素索引用于像素求和。然后用softmax函數(shù)可以把這些evidence轉(zhuǎn)化為概率
?
這里softmax可以看做一個(gè)激勵(lì)函數(shù)(activation)或者link函數(shù),將我們定義的線性函數(shù)的輸出轉(zhuǎn)換為我們想要的概率形式。因此,給定一個(gè)圖片,他對(duì)于每個(gè)數(shù)字的吻合度可以被softmax轉(zhuǎn)化為一個(gè)概率值。一個(gè)典型的softmax函數(shù)為:
?
展開右邊的式子,有:
?但更多時(shí)候把softmax模型函數(shù)定義為前一種形式:把輸入值當(dāng)成冪指數(shù)求值,再正則化這些結(jié)果值。這個(gè)冪運(yùn)算表示,更大的證據(jù)對(duì)應(yīng)更大的假設(shè)模型里面的乘數(shù)權(quán)重值。反之,擁有更少的證據(jù)意味著在假設(shè)模型里面擁有更小的乘數(shù)系數(shù)。假設(shè)模型里的權(quán)值不可以是0值或者負(fù)值。Softmax然后會(huì)正則化這些權(quán)重值,使他們的總和等于1,以此構(gòu)造一個(gè)有效的概率分布。
?????
實(shí)現(xiàn)回歸模型
? 為了用python實(shí)現(xiàn)高效的數(shù)值計(jì)算,一般會(huì)使用Numpy這樣的函數(shù)庫,會(huì)把類似于矩陣乘法這樣的復(fù)雜運(yùn)算使用其他的外部語言實(shí)現(xiàn)。然而頻繁于python和外部語言切換是一筆很大的開銷。
TensorFlow也吧復(fù)雜運(yùn)算放在python外部完成,但是為了避免這些開銷,它做了進(jìn)一步完善。這里就是我們說的先構(gòu)造圖在運(yùn)算,而不是進(jìn)行單一的復(fù)雜運(yùn)算。
#!/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是一個(gè)占位符,我們不希望直接全部讀入所有的圖,而是在運(yùn)行計(jì)算時(shí)動(dòng)態(tài)的讀入這些圖
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#Variable 表示一個(gè)可以修改的張量。它們可以用于計(jì)算輸入值,也可以在計(jì)算中被修改。
y = tf.nn.softmax(tf.matmul(x,W) + b)
#tf.matmul(x,W)表示x乘以W(注意是矩陣相乘)
?
訓(xùn)練模型
為了訓(xùn)練我們的模型,我們首先需要定義一個(gè)損失函數(shù),然后盡量最小化這個(gè)指標(biāo)。一個(gè)比較經(jīng)典的成本函數(shù)是交叉熵
?????????????????????
y是我們預(yù)測(cè)的概率分布,y‘是實(shí)際的分布(我們輸入的 one-hot vector)。比較粗糙的理解是,交叉熵し用來衡量我們預(yù)測(cè)用于描述用于描述真相的低效性。
y_ = tf.placeholder('float',[None,10])#用來存儲(chǔ)正確的值
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#這里交叉熵不僅僅用來衡量單一的一對(duì)預(yù)測(cè)和真實(shí)值,而是所有100幅圖片的交叉熵的總和。對(duì)于100個(gè)數(shù)據(jù)點(diǎn)的預(yù)測(cè)表現(xiàn)び對(duì)單一數(shù)據(jù)點(diǎn)的表現(xiàn)能更好地描述我們的模型的性能
#TensorFlow擁有一張描述你各個(gè)計(jì)算單元的圖,它可以自動(dòng)地使用反向傳播算法來有效的確定你的變量是如和影響你要最小化的那個(gè)成本值的。然后,TensorFlow會(huì)用你選擇的優(yōu)化算法來不斷的修改變量降低成本
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#這里要求TensorFlow使用梯度下降算法以0.01的學(xué)習(xí)速率最小化交叉熵。當(dāng)然TensorFlow還集成了許多其他優(yōu)化算法。
#TensorFlow在這里實(shí)際上做的是,在后臺(tái)給描述你的計(jì)算的那張圖里加上一系列新的計(jì)算操作單元用于實(shí)現(xiàn)反向傳播算法和梯度下降算法。然后它返回給你的只是一個(gè)單一的操作,當(dāng)運(yùn)行這個(gè)操作時(shí),タ用梯度下降算法訓(xùn)練你的模型,微調(diào)你的變量,不斷減少成本
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(1000):#讓模型循環(huán)訓(xùn)練1000次
batch_xs,batch_ys = mnist.train.next_batch(100)#隨機(jī)抓取訓(xùn)練數(shù)據(jù)中的100個(gè)批處理數(shù)據(jù)點(diǎn)
sess.run(train_step,feed_dict = {x:batch_xs,y: batch_ys})
?
評(píng)估模型
如何評(píng)估我們的模型?
首先找出那些預(yù)測(cè)正確的標(biāo)簽。tf.argmax是一個(gè)非常有用的函數(shù)。它能給出某個(gè)tensor對(duì)象在某一位上的其數(shù)據(jù)最大值所在的索引值。由于標(biāo)簽向量是由0,1組成,因此最大值1所在的索引位置急速類別標(biāo)簽,比如tf.argmax(y,1)返回的是模型對(duì)于任意輸入x預(yù)測(cè)到的標(biāo)簽值,而tf.argmin(y_,1),我們可以用tf.equal來檢測(cè)我們的預(yù)測(cè)值是否正確。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))這行代碼會(huì)給我們一組布爾值。為了求出預(yù)測(cè)準(zhǔn)確率,我們將布爾值轉(zhuǎn)化為1和0,在將其相加求平均值
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})?
轉(zhuǎn)載于:https://www.cnblogs.com/zodiac7/p/9304015.html
總結(jié)
以上是生活随笔為你收集整理的TensorFlow 学习(3)——MNIST机器学习入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1236 Network o
- 下一篇: 数据结构(java版)学习笔记(序章)