基于tensorflow的MNIST手寫字識別(一)--白話卷積神經(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(最底下)
官網(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代表著黑色映胁。
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ù)
這個部分其實是比較重要的,因為如果處理不得當可能并不一定會有很好的結(jié)果掠剑,所以按照mnist的標準規(guī)范需要將待測圖片轉(zhuǎn)為28×28且文字居中的灰度圖(其實彩色的也可以屈芜,不過就是最后代碼需要改一下),目前介紹兩種獲得待測圖片的方法:
1朴译、自己用ps或者真的手寫一些數(shù)字
2井佑、將MNIST數(shù)據(jù)庫中的二進制轉(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"))?
? ? ? 轉(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ù)圖片的不同特征,將他們分類份殿,但是并不知道他們具體是幾膜钓,這個其實就是“聚類”
? ? ? ? ? 在這里標簽的表示方式有些特殊,它也是使用了一個一維數(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.
? ? ? ?這是一個分類器偶器,可以認為是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ù)的處理把还。)
? ? ? ?通俗一點就是,方差大家都知道吧茸俭,用它可以衡量預(yù)測值和實際值的相差程度吊履,交叉熵其實也是一樣的作用,那為什么不用方差呢调鬓,因為看sigmoid函數(shù)的圖像就會發(fā)現(xiàn)艇炎,它的兩側(cè)幾乎就是平的,導(dǎo)致它的方差在大部分情況下很小腾窝,這樣在訓(xùn)練參數(shù)的時候收斂地就會很慢缀踪,交叉熵就是用來解決這個問題的,它的公式是
,其中虹脯,y是我們預(yù)測的概率分布,y'是實際的分布驴娃。
? ? ? ? 上面那步也說了,有個交叉熵循集,根據(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灭返。
https://github.com/wlmnzf/tensorflow-train/tree/master/mnist
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ù)