MNIST數(shù)據(jù)集下的Softmax回歸模型實(shí)驗(yàn)—我的第一個(gè)機(jī)器學(xué)習(xí)程序(包括MNIST數(shù)據(jù)集下載,Softmax介紹和源碼)

MNIST數(shù)據(jù)集是一個(gè)入門級(jí)的計(jì)算機(jī)視覺(jué)數(shù)據(jù)集鸠澈,它包含各種手寫數(shù)字照片柱告,它也包含每一張圖片對(duì)應(yīng)的標(biāo)簽,告訴我們這是數(shù)字幾款侵。

例如這幅圖的標(biāo)簽分別是5末荐、0、4新锈、1甲脏。

數(shù)據(jù)集被分成兩部分:60000 行的訓(xùn)練數(shù)據(jù)集(mnist.train)和10000行的測(cè)試數(shù)據(jù)集(mnist.test)。其中:60000 行的訓(xùn)練

部分拆為 55000 行的訓(xùn)練集和 5000 行的驗(yàn)證集。

接下來(lái)我將介紹一個(gè)簡(jiǎn)單的機(jī)器學(xué)習(xí)模型—CNN块请,來(lái)預(yù)測(cè)圖片里面的數(shù)字娜氏。

首先介紹一下如何下載MNIST數(shù)據(jù)集

Tensorflow里面可以用如下代碼導(dǎo)入MNIST數(shù)據(jù)集:

from ?tensorflow.examples.tutorials.mnist ? import ? input_data

mnist ?= ?input_data.read_data_sets ( "MNIST_data/", ?one_hot=True )

成功獲取MNIST數(shù)據(jù)集后,發(fā)現(xiàn)本地已經(jīng)下載了4個(gè)壓縮文件:

#訓(xùn)練集的壓縮文件墩新,?9912422 ?bytes

Extracting MNIST_data / train-images-idx3-ubyte.gz

#訓(xùn)練集標(biāo)簽的壓縮文件贸弥,28881?bytes

Extracting MNIST_data / train-labels-idx1-ubyte.gz

#測(cè)試集的壓縮文件,1648877?bytes

Extracting MNIST_data / t10k-images-idx3-ubyte.gz

#測(cè)試集的壓縮文件海渊,4542?bytes

Extracting MNIST_data / t10k-labels-idx1-ubyte.gz

我們可以在終端打印數(shù)據(jù)集的張量情況:

print ( mnist.train.images.shape ) ? #訓(xùn)練集的張量

print ( mnist.train.labels.shape ) #訓(xùn)練集標(biāo)簽的張量

print ( mnist.validation.images.shape )#驗(yàn)證集的張量

print ( mnist.validation.labels.shape ) #驗(yàn)證集標(biāo)簽的張量

print ( mnist.test.images.shape ) #測(cè)試集的張量

print ( mnist.test.labels.shape ) #測(cè)試集標(biāo)簽的張量

我們發(fā)現(xiàn):

1绵疲、MNIST數(shù)據(jù)集包含 55000 行訓(xùn)練集、5000 行驗(yàn)證集和10000 行測(cè)試集

2臣疑、每一張圖片展開(kāi)成一個(gè) 28X?28 = 784 維的向量盔憨,展開(kāi)的順序可以隨意的,只要保證每張圖片的展開(kāi)順序一致即可

3讯沈、每一張圖片的標(biāo)簽被初始化成 一個(gè) 10 維的“one-hot”向量

數(shù)據(jù)集下載完之后就要進(jìn)入構(gòu)建模型階段了

Softmax回歸模型

當(dāng)我們?cè)跀?shù)據(jù)集上進(jìn)行訓(xùn)練的時(shí)候郁岩,模型判定一張圖片是幾往往依靠一個(gè)概率比如80%的概率為5,20%的概率為2缺狠,那么最終將會(huì)判定這個(gè)數(shù)字為5问慎。

為了得到這個(gè)概率,我們使用Softmax模型挤茄,這個(gè)模型分為兩步

第一步

為了得到一張給定圖片屬于某個(gè)特定數(shù)字類的證據(jù)(evidence),我們對(duì)圖片像素值進(jìn)行加權(quán)求和如叼。如果這個(gè)像素具有很強(qiáng)的證據(jù)證明這張圖片不屬于該類,那么相應(yīng)的權(quán)值為負(fù)數(shù),相反如果這個(gè)像素?fù)碛杏欣淖C據(jù)支持這張圖片屬于這個(gè)類,那么權(quán)值是正數(shù)。我們也需要加入一個(gè)額外的偏置量(bias),因?yàn)檩斎胪鶗?huì)帶有一些無(wú)關(guān)的干擾量驮樊。因此對(duì)于給定的輸入圖片x

它代表的是數(shù)字 i 的證據(jù)可以表示為

其中bi代表數(shù)字 i 類的偏置量,j代表給定圖片 x 的像素索引用于像素求和薇正。然后用softmax函數(shù)可以把這些證據(jù)轉(zhuǎn)換成概率 y :

這里的softmax可以看成是一個(gè)激勵(lì)(activation)函數(shù)或者鏈接(link)函數(shù),把我們定義的線性函數(shù)的輸出轉(zhuǎn)換成我們想要的格式,也就是關(guān)于10個(gè)數(shù)字類的概率分布。因此,給定一張圖片,它對(duì)于每一個(gè)數(shù)字的吻合度可以被softmax函數(shù)轉(zhuǎn)換成為一個(gè)概率值囚衔。

softmax函數(shù)可以定義為:

展開(kāi)后可得

但是更多的時(shí)候把softmax模型函數(shù)定義為前一種形式:把輸入值當(dāng)成冪指數(shù)求值,再正則化這些結(jié)果值挖腰。這個(gè)冪運(yùn)算表示,更大的證據(jù)對(duì)應(yīng)更大的假設(shè)模型(hypothesis)里面的乘數(shù)權(quán)重值。反之,擁有更少的證據(jù)意味著在假設(shè)模型里面擁有更小的乘數(shù)系數(shù)练湿。假設(shè)模型里的權(quán)值不可以是0值或者負(fù)值猴仑。Softmax然后會(huì)正則化這些權(quán)重值,使它們的總和等于1,以此構(gòu)造一個(gè)有效的概率分布。

更進(jìn)一步我們把Softmax模型寫為

接下來(lái)我們來(lái)實(shí)現(xiàn)模型

首先我們?cè)谑褂肨ensorflow時(shí)需要先導(dǎo)入:

import tensorflowas tf

然后設(shè)置一個(gè)占位符x肥哎,作為Tensorflow計(jì)算時(shí)的輸入辽俗,允許輸入任意數(shù)量圖像,并且將其張開(kāi)為784維向量我們用2維的浮點(diǎn)數(shù)張量來(lái)表示這些圖,這個(gè)張量的形狀是 [None,784 ] 篡诽。(這里的 None 表示此張量的第一個(gè)維度可以是任何長(zhǎng)度的崖飘。)

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

我們的模型也需要權(quán)重值和偏置量,當(dāng)然我們可以把它們當(dāng)做是另外的輸入(使用占位符),但TensorFlow有一個(gè)更好的方法來(lái)表示它們: Variable 。它們可以用于計(jì)算輸入值,也可以在計(jì)算中被修改杈女。對(duì)于各種機(jī)器學(xué)習(xí)應(yīng)用,一般都會(huì)有模型參數(shù),可以用 Variable 表示朱浴。

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

我們賦予 tf.Variable 不同的初值來(lái)創(chuàng)建不同的 Variable :在這里,我們都用全為零的張量來(lái)初始化 W 和b 吊圾。因?yàn)槲覀円獙W(xué)習(xí) W 和b 的值,它們的初值可以隨意設(shè)置。

注意, W 的維度是[784,10],因?yàn)槲覀兿胍?84維的圖片向量乘以它以得到一個(gè)10維的證據(jù)值向量,每一位對(duì)應(yīng)不同數(shù)字類翰蠢。 b 的形狀是[10],所以我們可以直接把它加到輸出上面项乒。

現(xiàn)在,我們可以實(shí)現(xiàn)我們的模型

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

模型至此已經(jīng)寫完了,接下來(lái)就要訓(xùn)練我們的模型

在機(jī)器學(xué)習(xí)中衡量一個(gè)模型好壞的因素梁沧,往往要通過(guò)損失(loss)或者是成本(cost)檀何,然后盡量最小化這兩種指標(biāo)來(lái)獲取更好的模型,但從本質(zhì)上來(lái)說(shuō)兩種方法取得的是一樣的結(jié)果廷支。

一個(gè)非常常見(jiàn)的成本函數(shù)是“交叉熵”(cross-entropy)频鉴,今天我們也采用這個(gè)函數(shù)來(lái)訓(xùn)練我們的模型,它的定義如下:

y 是我們預(yù)測(cè)的概率分布, y' 是實(shí)際的分布(我們輸入的one-hot vector)酥泞。比較粗糙的理解是,交叉熵是用來(lái)衡量我們的預(yù)測(cè)用于描述真相的低效性砚殿。

為了計(jì)算交叉熵,我們首先需要添加一個(gè)新的占位符用于輸入正確值:

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

然后我們可以用

來(lái)計(jì)算交叉熵

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

TensorFlow擁有一張描述你各個(gè)計(jì)算單元的圖,它可以自動(dòng)地使用反向傳播算法(backpropagation

algorithm)來(lái)有效地確定你的變量是如何影響你想要最小化的那個(gè)成本值的啃憎。然后,TensorFlow會(huì)用你選擇的優(yōu)化算法來(lái)不斷地修改變量以降低成本芝囤。

在這里,我們要求TensorFlow用梯度下降算法(gradient

descent algorithm)以0.01的學(xué)習(xí)速率最小化交叉熵。梯度下降算法(gradient descent

algorithm)是一個(gè)簡(jiǎn)單的學(xué)習(xí)過(guò)程,TensorFlow只需將每個(gè)變量一點(diǎn)點(diǎn)地往使成本不斷降低的方向移動(dòng)在這里,我們要求TensorFlow用梯度下降算法(gradient

descent algorithm)以0.01的學(xué)習(xí)速率最小化交叉熵辛萍。梯度下降算法(gradient descent

algorithm)是一個(gè)簡(jiǎn)單的學(xué)習(xí)過(guò)程,TensorFlow只需將每個(gè)變量一點(diǎn)點(diǎn)地往使成本不斷降低的方向移動(dòng)悯姊。

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

現(xiàn)在,我們已經(jīng)設(shè)置好了我們的模型。

Tensorflow依賴于一個(gè)高效的C++后端來(lái)進(jìn)行計(jì)算贩毕。與后端的這個(gè)連接叫做session悯许。一般而言,使用TensorFlow程序的流程是先創(chuàng)建一個(gè)圖,然后在session中啟動(dòng)它。

這里,我們使用更加方便的

InteractiveSession

類辉阶。通過(guò)它,你可以更加靈活地構(gòu)建你的代碼先壕。它能讓你在運(yùn)行圖的時(shí)候,插入一些計(jì)算圖,這些計(jì)算圖是由某些操作(operations)構(gòu)成的。這對(duì)于工作在交互式環(huán)境中的人們來(lái)說(shuō)非常便利,比如使用IPython谆甜。如果你沒(méi)有使用

InteractiveSession ,那么你需要在啟動(dòng)session之前構(gòu)建整個(gè)計(jì)算圖,然后啟動(dòng)該計(jì)算圖垃僚。

sess= tf.InteractiveSession()

變量 需要通過(guò)seesion初始化后,才能在session中使用。這一初始化步驟為,為初始值指定具體值(本例當(dāng)中是全為零),并將其分配給每個(gè) 變量 ,可以一次性為所有 變量 完成此操作规辱。

sess.run(tf.initialize_all_variables())

然后開(kāi)始訓(xùn)練模型,這里我們讓模型循環(huán)訓(xùn)練1000次!

for iin range(1000):? ? batch= mnist.train.next_batch(50)? ? train_step.run(feed_dict={x: batch[0], y_: batch[1]})

該循環(huán)的每個(gè)步驟中,我們都會(huì)隨機(jī)抓取訓(xùn)練數(shù)據(jù)中的100個(gè)批處理數(shù)據(jù)點(diǎn),然后我們用這些數(shù)據(jù)點(diǎn)作為參數(shù)替換

之前的占位符來(lái)運(yùn)行 train_step 谆棺。

使用一小部分的隨機(jī)數(shù)據(jù)來(lái)進(jìn)行訓(xùn)練被稱為隨機(jī)訓(xùn)練(stochastic training)- 在這里更確切的說(shuō)是隨機(jī)梯度下降訓(xùn)練。在理想情況

下,我們希望用我們所有的數(shù)據(jù)來(lái)進(jìn)行每一步的訓(xùn)練,因?yàn)檫@能給我們更好的訓(xùn)練結(jié)果,但顯然這需要很大的計(jì)算開(kāi)銷罕袋。所以,每一次

訓(xùn)練我們可以使用不同的數(shù)據(jù)子集,這樣做既可以減少計(jì)算開(kāi)銷,又可以最大化地學(xué)習(xí)到數(shù)據(jù)集的總體特性改淑。

最后就是評(píng)估我們的模型

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.argmax(y_,1) 代表正確的標(biāo)簽,我們可以用

tf.equal 來(lái)檢測(cè)我們的預(yù)測(cè)是否真實(shí)標(biāo)簽匹配(索引位置一樣表示匹配)浴讯。

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

最后,我們計(jì)算所學(xué)習(xí)到的模型在測(cè)試數(shù)據(jù)集上面的正確率

accuracy= tf.reduce_mean(tf.cast(correct_prediction, "float"))print accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})

到這里Softmax模型就全部完成了朵夏,正確率在91%左右。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榆纽,一起剝皮案震驚了整個(gè)濱河市仰猖,隨后出現(xiàn)的幾起案子询吴,更是在濱河造成了極大的恐慌,老刑警劉巖亮元,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猛计,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爆捞,警方通過(guò)查閱死者的電腦和手機(jī)奉瘤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)煮甥,“玉大人盗温,你說(shuō)我怎么就攤上這事〕芍猓” “怎么了卖局?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)双霍。 經(jīng)常有香客問(wèn)我砚偶,道長(zhǎng),這世上最難降的妖魔是什么洒闸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任染坯,我火速辦了婚禮,結(jié)果婚禮上丘逸,老公的妹妹穿的比我還像新娘单鹿。我一直安慰自己,他們只是感情好深纲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布仲锄。 她就那樣靜靜地躺著,像睡著了一般湃鹊。 火紅的嫁衣襯著肌膚如雪儒喊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天涛舍,我揣著相機(jī)與錄音澄惊,去河邊找鬼。 笑死富雅,一個(gè)胖子當(dāng)著我的面吹牛掸驱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播没佑,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼毕贼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蛤奢?” 一聲冷哼從身側(cè)響起鬼癣,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陶贼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后待秃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拜秧,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年章郁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枉氮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暖庄,死狀恐怖聊替,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情培廓,我是刑警寧澤惹悄,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站肩钠,受9級(jí)特大地震影響泣港,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔬将,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一爷速、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霞怀,春花似錦、人聲如沸莉给。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颓遏。三九已至徐矩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叁幢,已是汗流浹背滤灯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曼玩,地道東北人鳞骤。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黍判,于是被迫代替她去往敵國(guó)和親豫尽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容