日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

mnist手写数字识别python_基于tensorflow的MNIST手写数字识别(二)--入门篇

發(fā)布時間:2023/12/15 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mnist手写数字识别python_基于tensorflow的MNIST手写数字识别(二)--入门篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、本文的意義

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

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

中文版本:MNIST機器學(xué)習(xí)入門http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html

demo截圖如下,會將放進(jìn)去的圖片預(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)成二進(jìn)制放到了文件里面,

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

[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.

[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代表著黑色。

[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.

[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的向量代表標(biāo)簽,也就是這個數(shù)字到底是幾,舉個例子e數(shù)字1對應(yīng)的矩陣就是[0,1,0,0,0,0,0,0,0,0]

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

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

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

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

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

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

看到這里,如果你跟我一樣不熟悉python,是不是開始方了,沒事,其實python很厲害,自帶的PIL圖片庫一句話就可以搞定img=array(Image.open(filename))?????????//打開然后就被numpy轉(zhuǎn)化了

如果是彩色的圖片,則需要先將它這樣子轉(zhuǎn)換一下(我當(dāng)初并不知道可以轉(zhuǎn)化,傻不垃圾地自己寫了一個轉(zhuǎn)化,所以python還是好好學(xué)習(xí)啊)im=Image.open("test_num3/8_3.png")

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

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

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

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

在這里標(biāo)簽的表示方式有些特殊,它也是使用了一個一維數(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)來看,標(biāo)準(zhǔn)的標(biāo)簽就是表示圖片對應(yīng)數(shù)字的概率為100%,而表示其它數(shù)字的概率為0,舉個例子,0表示[1,0,0,0,0,0,0,0,0,0],可以理解為它表示0的概率為100%,而表示別的數(shù)字的概率為0.

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

P(y=0)=p0,P(y=1)=p1,p(y=2)=p2......P(y=9)=p9.這些表示預(yù)測為數(shù)字i的概率,(跟上面標(biāo)簽的格式正好對應(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ù)呢,可以想象一下,我們先用實際的值在二位坐標(biāo)上畫一條線,然后我們希望我們預(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/mnisthttp://blog.csdn.net/acdreamers/article/details/44663305softmax回歸http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html????MNIST學(xué)習(xí)入門http://blog.csdn.net/u012162613/article/details/44239919交叉熵代價函數(shù)

總結(jié)

以上是生活随笔為你收集整理的mnist手写数字识别python_基于tensorflow的MNIST手写数字识别(二)--入门篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。