基于tensorflow的MNIST手寫數(shù)字識別(二)--入門篇

基于tensorflow的MNIST手寫字識別(一)--白話卷積神經(jīng)網(wǎng)絡(luò)模型

基于tensorflow的MNIST手寫數(shù)字識別(二)--入門篇

基于tensorflow的MNIST手寫數(shù)字識別(三)--神經(jīng)網(wǎng)絡(luò)篇

一贮庞、本文的意義

? ? ? ? ?因為谷歌官方其實已經(jīng)寫了MNIST入門和深入兩篇教程了,那我寫這些文章又是為什么呢究西,只是抄襲窗慎?那倒并不是,更準確的說應(yīng)該是筆記吧卤材,然后用更通俗的語言來解釋粘秆,并且補充更多毫蚓,官方文章中沒有詳細展開的一些知識點悴灵,不過建議與官方文章結(jié)合著閱讀丹泉。

? ? ? ? ? ?另外是代碼部分的改動,官方的demo只提供了驗證精確度帆精,我將它改造成了能輸入并預(yù)測輸出結(jié)果的代碼也就是說是一個從準備待測圖片到最終是別的一個完整demo

中文版本:MNIST機器學習入門

http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html

demo截圖如下较屿,會將放進去的圖片預(yù)測,然后輸出結(jié)果卓练,代碼說明請看github的readme(最底下)

二隘蝎、MNIST簡介

官網(wǎng):http://yann.lecun.com/exdb/mnist/

這個MNIST數(shù)據(jù)庫是一個手寫數(shù)字的數(shù)據(jù)庫,它提供了六萬的訓(xùn)練集和一萬的測試集襟企。

它的圖片是被規(guī)范處理過的嘱么,是一張被放在中間部位的28px*28px的灰度圖

總共4個文件:

train-images-idx3-ubyte: training set images

train-labels-idx1-ubyte: training set labels

t10k-images-idx3-ubyte:? test set images

t10k-labels-idx1-ubyte:? test set labels

圖片都被轉(zhuǎn)成二進制放到了文件里面,

所以顽悼,每一個文件頭部幾個字節(jié)都記錄著這些圖片的信息曼振,然后才是儲存的圖片信息

TRAINING SET LABEL FILE (train-labels-idx1-ubyte):

[offset] [type]????????? [value]????????? [description]

0000???? 32 bit integer? 0x00000801(2049) magic number (MSB first)

0004???? 32 bit integer? 60000??????????? number of items

0008???? unsigned byte?? ???????????????? label

0009???? unsigned byte?? ???????????????? label

........

xxxx???? unsigned byte?? ???????????????? label

The labels values are 0 to 9.

TRAINING SET IMAGE FILE (train-images-idx3-ubyte):

[offset] [type]????????? [value]????????? [description]

0000???? 32 bit integer? 0x00000803(2051) magic number

0004???? 32 bit integer? 60000??????????? number of images

0008???? 32 bit integer? 28?????????????? number of rows

0012???? 32 bit integer? 28?????????????? number of columns

0016???? unsigned byte?? ???????????????? pixel

0017???? unsigned byte?? ???????????????? pixel

........

xxxx???? unsigned byte?? ???????????????? pixel

每個像素被轉(zhuǎn)成了0-255,0代表著白色几迄,255代表著黑色。

TEST SET LABEL FILE (t10k-labels-idx1-ubyte):

[offset] [type]????????? [value]????????? [description]

0000???? 32 bit integer? 0x00000801(2049) magic number (MSB first)

0004???? 32 bit integer? 10000??????????? number of items

0008???? unsigned byte?? ???????????????? label

0009???? unsigned byte?? ???????????????? label

........

xxxx???? unsigned byte?? ???????????????? label

The labels values are 0 to 9.

TEST SET IMAGE FILE (t10k-images-idx3-ubyte):

[offset] [type]????????? [value]????????? [description]

0000???? 32 bit integer? 0x00000803(2051) magic number

0004???? 32 bit integer? 10000??????????? number of images

0008???? 32 bit integer? 28?????????????? number of rows

0012???? 32 bit integer? 28?????????????? number of columns

0016???? unsigned byte?? ???????????????? pixel

0017???? unsigned byte?? ???????????????? pixel

........

xxxx???? unsigned byte?? ???????????????? pixel

每個像素被轉(zhuǎn)成了0-255,0代表著白色冰评,255代表著黑色映胁。

三、tensorflow手寫數(shù)字識別的大致步驟

1集索、將要識別的圖片轉(zhuǎn)為灰度圖屿愚,并且轉(zhuǎn)化為28*28矩陣(單通道汇跨,每個像素范圍0-255务荆,0為黑色,255為白色穷遂,這一點與MNIST中的正好相反)

2函匕、將28*28的矩陣轉(zhuǎn)換成1維矩陣(也就是把第2,3,4,5....行矩陣紛紛接入到第一行的后面)

3、用一個1*10的向量代表標簽蚪黑,也就是這個數(shù)字到底是幾盅惜,舉個例子e數(shù)字1對應(yīng)的矩陣就是[0,1,0,0,0,0,0,0,0,0]

4、softmax回歸預(yù)測圖片是哪個數(shù)字的概率

5忌穿、用交叉熵和梯度下降法訓(xùn)練參數(shù)

四抒寂、過程講解

4.1 準備要識別的圖片

這個部分其實是比較重要的,因為如果處理不得當可能并不一定會有很好的結(jié)果掠剑,所以按照mnist的標準規(guī)范需要將待測圖片轉(zhuǎn)為28×28且文字居中的灰度圖(其實彩色的也可以屈芜,不過就是最后代碼需要改一下),目前介紹兩種獲得待測圖片的方法:

1朴译、自己用ps或者真的手寫一些數(shù)字

2井佑、將MNIST數(shù)據(jù)庫中的二進制轉(zhuǎn)化成圖片,然后用來做測試

ps:圖片解析 ?點擊進入

4.2 將待測圖片轉(zhuǎn)換為矩陣

如圖所示眠寿,根據(jù)黑色部分的濃淡將其轉(zhuǎn)化成微一個浮點數(shù)的數(shù)組躬翁,(白色0,黑色1)

看到這里,如果你跟我一樣不熟悉python盯拱,是不是開始方了盒发,沒事,其實python很厲害狡逢,自帶的PIL圖片庫一句話就可以搞定

img=array(Image.open(filename))?????????//打開然后就被numpy轉(zhuǎn)化了

如果是彩色的圖片迹辐,則需要先將它這樣子轉(zhuǎn)換一下(我當初并不知道可以轉(zhuǎn)化,傻不垃圾地自己寫了一個轉(zhuǎn)化甚侣,所以python還是好好學習懊鞣浴)

?im=Image.open("test_num3/8_3.png")

Lim??=?img=array(im.convert("L"))?

4.3將矩陣轉(zhuǎn)化為一維矩陣,以及標簽的介紹

? ? ? 轉(zhuǎn)化為一維的矩陣其實并不難,用python的reshape就能搞定殷费,還是要講一下標簽的表示方法印荔,這個曾經(jīng)令隊友疑惑不久低葫,直到我把這個數(shù)組打印出來

4.3.1標簽的來歷--有監(jiān)督學習 和 無監(jiān)督學習

監(jiān)督學習:利用一組已知類別的樣本調(diào)整分類器的參數(shù),使其達到所要求性能的過程仍律,也稱為監(jiān)督訓(xùn)練或有教師學習舉個例子嘿悬,MNIST自帶了訓(xùn)練圖片和訓(xùn)練標簽,每張圖片都有一個對應(yīng)的標簽水泉,比如這張圖片是1善涨,標簽也就是1,用他們訓(xùn)練程序,之后程序也就能識別測試集中的圖片了草则,比如給定一張2的圖片钢拧,它能預(yù)測出他是2

無監(jiān)督學習:其中很重要的一類叫聚類舉個例子,如果MNIST中只有訓(xùn)練圖片炕横,沒有標簽源内,我們的程序能夠根據(jù)圖片的不同特征,將他們分類份殿,但是并不知道他們具體是幾膜钓,這個其實就是“聚類”

4.3.2 標簽的表示

? ? ? ? ? 在這里標簽的表示方式有些特殊,它也是使用了一個一維數(shù)組卿嘲,而不是單純的數(shù)字颂斜,上面也說了,他是一個一位數(shù)組拾枣,0表示方法[1,0,0,0,0,0,0,0,0,0],1表示[0,1,0,0,0,0,0,0,0,0],.........沃疮,

? ? ? ? ? ?主要原因其實是這樣的,因為softmax回歸處理后會生成一個1*10的數(shù)組放前,數(shù)組[0,0]的數(shù)字表示預(yù)測的這張圖片是0的概率忿磅,[0,1]則表示這張圖片表示是1的概率......以此類推,這個數(shù)組表示的就是這張圖片是哪個數(shù)字的概率(已經(jīng)歸一化)凭语,

? ? ? ? ? ? ?因此葱她,實際上,概率最大的那個數(shù)字就是我們所預(yù)測的值似扔。兩者對應(yīng)來看吨些,標準的標簽就是表示圖片對應(yīng)數(shù)字的概率為100%,而表示其它數(shù)字的概率為0炒辉,舉個例子豪墅,0表示[1,0,0,0,0,0,0,0,0,0],可以理解為它表示0的概率為100%黔寇,而表示別的數(shù)字的概率為0.

4.4 softmax回歸

? ? ? ?這是一個分類器偶器,可以認為是Logistic回歸的擴展,Logistic大家應(yīng)該都聽說過,就是生物學上的S型曲線屏轰,它只能分兩類颊郎,用0和1表示,這個用來表示答題對錯之類只有兩種狀態(tài)的問題時足夠了霎苗,但是像這里的MNIST要把它分成10類姆吭,就必須用softmax來進行分類了。

? ? ? ?P(y=0)=p0,P(y=1)=p1,p(y=2)=p2......P(y=9)=p9.這些表示預(yù)測為數(shù)字i的概率唁盏,(跟上面標簽的格式正好對應(yīng)起來了),它們的和為1内狸,即?∑(pi)=1。

? ? ? ?tensorflow實現(xiàn)了這個函數(shù)厘擂,我們直接調(diào)用這個softmax函數(shù)即可昆淡,對于原理,可以參考下面的引文驴党,這里只說一下我們這個MNIST demo要用softmax做什么瘪撇。

(注:每一個神經(jīng)元都可以接收來自網(wǎng)絡(luò)中其他神經(jīng)元的一個或多個輸入信號获茬,神經(jīng)元與神經(jīng)元之間都對應(yīng)著連接權(quán)值港庄,所有的輸入加權(quán)和決定該神經(jīng)元是處于激活還是抑制狀態(tài)。感知器網(wǎng)絡(luò)的輸出只能取值0或1恕曲,不具備可導(dǎo)性鹏氧。而基于敏感度的訓(xùn)練算法要求其輸出函數(shù)必須處處可導(dǎo),于是引入了常見的S型可導(dǎo)函數(shù)佩谣,即在每個神經(jīng)元的輸出之前先經(jīng)過S型激活函數(shù)的處理把还。)

4.5 交叉熵

? ? ? ?通俗一點就是,方差大家都知道吧茸俭,用它可以衡量預(yù)測值和實際值的相差程度吊履,交叉熵其實也是一樣的作用,那為什么不用方差呢调鬓,因為看sigmoid函數(shù)的圖像就會發(fā)現(xiàn)艇炎,它的兩側(cè)幾乎就是平的,導(dǎo)致它的方差在大部分情況下很小腾窝,這樣在訓(xùn)練參數(shù)的時候收斂地就會很慢缀踪,交叉熵就是用來解決這個問題的,它的公式是

,其中虹脯,y是我們預(yù)測的概率分布,y'是實際的分布驴娃。

4.6 梯度下降

? ? ? ? 上面那步也說了,有個交叉熵循集,根據(jù)大伙對方差的理解唇敞,值越小,自然就越好,因此我們也要訓(xùn)練使得交叉熵最小的參數(shù)疆柔,這里梯度下降法就派上用場了蕉世,這個解釋見上一篇系列文章吧,什么叫訓(xùn)練參數(shù)呢婆硬,可以想象一下狠轻,我們先用實際的值在二位坐標上畫一條線,然后我們希望我們預(yù)測出來的那些值要盡可能地貼近這條線彬犯,我們假設(shè)生成我們這條線的公式ax+ax^2+bx^3+.....向楼,我們需要生成這些系數(shù),要求得這些系數(shù)谐区,我們就需要各種點代入湖蜕,然后才能求出,所以其實訓(xùn)練參數(shù)跟求參數(shù)是個類似的過程宋列。

4.7 預(yù)測

? ? ? ? 訓(xùn)練結(jié)束以后我們就可以用這個模型去預(yù)測新的圖片了昭抒,就像我們已經(jīng)求出來了方程,以后只要隨意輸入一個x炼杖,就能求出對應(yīng)的y灭返。

5 代碼

https://github.com/wlmnzf/tensorflow-train/tree/master/mnist

6 參考文章

http://blog.csdn.net/acdreamers/article/details/44663305softmax回歸

http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html????MNIST學習入門

http://blog.csdn.net/u012162613/article/details/44239919交叉熵代價函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坤邪,隨后出現(xiàn)的幾起案子熙含,更是在濱河造成了極大的恐慌,老刑警劉巖艇纺,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怎静,死亡現(xiàn)場離奇詭異,居然都是意外死亡黔衡,警方通過查閱死者的電腦和手機蚓聘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盟劫,“玉大人夜牡,你說我怎么就攤上這事±谈撸” “怎么了氯材?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硝岗。 經(jīng)常有香客問我氢哮,道長,這世上最難降的妖魔是什么型檀? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任冗尤,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裂七。我一直安慰自己皆看,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布背零。 她就那樣靜靜地躺著腰吟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徙瓶。 梳的紋絲不亂的頭發(fā)上毛雇,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音侦镇,去河邊找鬼灵疮。 笑死,一個胖子當著我的面吹牛壳繁,可吹牛的內(nèi)容都是我干的震捣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼闹炉,長吁一口氣:“原來是場噩夢啊……” “哼蒿赢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剩胁,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤诉植,失蹤者是張志新(化名)和其女友劉穎祥国,沒想到半個月后昵观,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡舌稀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年啊犬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁查。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡觉至,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睡腿,到底是詐尸還是另有隱情语御,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布席怪,位于F島的核電站应闯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挂捻。R本人自食惡果不足惜碉纺,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骨田,春花似錦耿导、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悠汽,卻和暖如春狮荔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背介粘。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工殖氏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姻采。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓雅采,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慨亲。 傳聞我的和親對象是個殘疾皇子婚瓜,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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