[譯]與TensorFlow的第一次接觸(四)之單層神經(jīng)網(wǎng)絡(luò)

? ? ?后面會(huì)在微信公眾號(hào)中推送后續(xù)的翻譯章節(jié),與TensorFlow的第一次接觸系列已整理成pdf,關(guān)注公眾號(hào)后回復(fù):tensorflow即可下載~~公眾號(hào):源碼之心


源碼之心

?在前言中,已經(jīng)提到經(jīng)常使用深度學(xué)習(xí)的領(lǐng)域就是模式識(shí)別。編程初學(xué)者都是從打印“Hello World”開始,深度學(xué)習(xí)中我們則是從識(shí)別手寫數(shù)字開始。

? ? ? 本章中,我會(huì)講解如何在TensorFlow中一步步建立單層神經(jīng)網(wǎng)絡(luò),這個(gè)建立的神經(jīng)網(wǎng)絡(luò)用來識(shí)別手寫數(shù)字,它是基于TensorFlow官方新手指南中的一個(gè)例子改變而來。

? ? ? 根據(jù)本書的風(fēng)格,在本例子中會(huì)簡化一些概念與理論證明。

? ? ? 如果讀者在讀完本章后,有興趣研究例子中相關(guān)的理論概念,建議讀者去閱讀神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)一書,該書同樣可在網(wǎng)上獲得,該書闡述了本例子中的一些深度理論概念。

The MNIST data-set

? ? ? ?MNIST data-set由一些黑白照片集合組成,每張照片包含手寫的數(shù)字。集合中60000張照片用來訓(xùn)練模型,10000張照片用來測試模型。MNIST data-set可通過網(wǎng)絡(luò)在MNIST數(shù)據(jù)庫中獲得。

? ? ? ?對(duì)于剛開始基于真實(shí)樣例學(xué)習(xí)模式識(shí)別確沒有時(shí)間進(jìn)行數(shù)據(jù)預(yù)處理或歸一化的同學(xué),這個(gè)數(shù)據(jù)集十分理想,因?yàn)閿?shù)據(jù)預(yù)處理與歸一化是非常重要且花時(shí)間的兩個(gè)步驟。

? ? ? ?這些黑白照片已經(jīng)規(guī)則化成20*20像素,并保留了寬高比。對(duì)于本例子,我們發(fā)現(xiàn)由于歸一化算法(圖片的分辨率降為其中最低水平之一)中使用了抗鋸齒,圖片中包含了很多灰色像素。通過計(jì)算質(zhì)心,并將照片移至28*28像素方框的正中間。照片如下圖所示:

? ? ? ?本例子中使用的學(xué)習(xí)算法同樣為監(jiān)督學(xué)習(xí),照片已經(jīng)用它們代表的數(shù)據(jù)進(jìn)行標(biāo)注。這是一種非常常見機(jī)器學(xué)習(xí)算法。

? ? ? ?我們首先收集很大的包含數(shù)字的照片集合,每一張照片用它代表的數(shù)字進(jìn)行標(biāo)注。在訓(xùn)練過程中,模型輸入一張照片,輸出得分?jǐn)?shù)組,每一個(gè)得分代表了一個(gè)分類。我們希望想要的那個(gè)分類在所有分類中擁有最大的得分,但在訓(xùn)練模型之前這是不太可能發(fā)生的。

? ? ? ?通過計(jì)算一個(gè)對(duì)象函數(shù)來度量錯(cuò)誤值,這個(gè)錯(cuò)誤值代表了輸出得分與目標(biāo)模式得分的差別。模型會(huì)修改內(nèi)部的可調(diào)參數(shù)(也叫權(quán)重)來降低這個(gè)錯(cuò)誤值。在一個(gè)典型的深度學(xué)習(xí)系統(tǒng)中,可能會(huì)有成百上千的可調(diào)參數(shù),成百上千的標(biāo)注數(shù)據(jù)為訓(xùn)練模型。我們會(huì)通過一個(gè)較小的例子來幫助講解這種類型的模型是如何工作的。

? ? ? ?為方便下載數(shù)據(jù),你可以使用input_data.py腳本,該文件也已放在github上。當(dāng)在TensorFlow中編程實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)時(shí),可直接通過這個(gè)腳本下載數(shù)據(jù)到當(dāng)前目錄下。在你的應(yīng)用程序中,只需要導(dǎo)入并調(diào)用如下代碼:

? ? ? ?當(dāng)執(zhí)行完這兩行命令后,mnist.train會(huì)包含了全部的訓(xùn)練數(shù)據(jù),mnist.test包含了全部的測試數(shù)據(jù)集。正如我之前所說的,每一個(gè)元素都由一張照片組成,用”xs”來表示,它的標(biāo)注用“ys”表示,這可以很方便的表示處理代碼。請(qǐng)記住,所有數(shù)據(jù)集,訓(xùn)練集與測試集都包含了“xs”與“ys”;同時(shí),mnist.train.images表示訓(xùn)練照片,mnist.train.labels表示訓(xùn)練標(biāo)簽。

? ? ? ?正如之前所說,圖像被格式成28*28像素,并可表示成一個(gè)數(shù)值矩陣。例如,數(shù)字1的照片可表示為:

? ? ? ?每一個(gè)位置代表了每一個(gè)像素灰的程序,取值0到1。這個(gè)矩陣可表示為一個(gè)28*28=784的數(shù)組。實(shí)際上,照片已經(jīng)變換成784維向量空間中一系列的點(diǎn)。需要說明的是,當(dāng)我們將結(jié)構(gòu)降到2維后,我們會(huì)失去部分信息,對(duì)于一些計(jì)算圖像算法,這會(huì)帶來不利影響,但在本例子中使用的算法來說,這沒有任何影響。

? ? ? ?總結(jié)一下,我們有了mnitst.train.images 2D tensor,當(dāng)調(diào)用get_shape()時(shí)顯示的結(jié)果為:

TensorShape([Dimension(60000),Dimension(784)])

? ? ? ?第一維度索引了每一張照片,第二維索引了照片中每一像素。Tensor中每一元素是該像素強(qiáng)度值,該值介于0到1之間。

? ? ? ?標(biāo)簽都是數(shù)字0到9的格式,表明圖片代表哪一個(gè)數(shù)字。本例子中,每個(gè)標(biāo)簽表示為10個(gè)元素的向量,圖片代表的數(shù)字相應(yīng)的位置為1,其余位置為0。所以mnist.train.labelses是一個(gè)shape為([Dimension(6000),Dimension(10)]的tensor。

人造神經(jīng)元

? ? ? 雖然本書不會(huì)主要講神經(jīng)網(wǎng)絡(luò)的理論概念,但是簡短直觀的介紹神經(jīng)網(wǎng)絡(luò)如何學(xué)習(xí)訓(xùn)練數(shù)據(jù)會(huì)幫助讀者理解神經(jīng)網(wǎng)絡(luò)做了什么。已經(jīng)非常了解神經(jīng)網(wǎng)絡(luò)理論,只是如何學(xué)習(xí)使用TensorFlow的同學(xué),可以跳過本小節(jié)。

? ? ? 我們可以看一個(gè)簡單但又很有代表性的例子來說明神經(jīng)元如何學(xué)習(xí)。假設(shè)一個(gè)平面中有一個(gè)點(diǎn)的集合,分別被標(biāo)記為“square”與“circle”。給一個(gè)新的點(diǎn)“X”,我們想知道這新點(diǎn)會(huì)被標(biāo)記為哪個(gè)標(biāo)簽:

? ? ? 一個(gè)通用的方法是畫一條直線作為分類器,將點(diǎn)分成兩組:


? ? ? 在這種情形下,輸入數(shù)據(jù)表示為shape為(x,y)的vectors,代表了2維空間中的坐標(biāo),我們的函數(shù)返回0或1(直線之上或之下)來代表將該點(diǎn)分類為“square”還是“circle”。通過線性回歸那一小節(jié)學(xué)到的,從數(shù)學(xué)上,這條直線(分類器)可表示為y=W*x+b。

? ? ? 一般來說,神經(jīng)元一定要學(xué)到一個(gè)權(quán)重W(與輸入數(shù)據(jù)X有同樣的維度)與偏移b(神經(jīng)網(wǎng)絡(luò)中叫bias)來學(xué)會(huì)將如何分類這些值。根據(jù)W和b,神經(jīng)元會(huì)對(duì)輸入計(jì)算一個(gè)加權(quán)和,并加上偏移b;最后神經(jīng)元會(huì)應(yīng)用激活非線性函數(shù)來產(chǎn)生結(jié)果0或1。神經(jīng)元的函數(shù)可形式化表示為:

? ? ? 為神經(jīng)元定義了這個(gè)函數(shù)后,我們想了解神經(jīng)元是如何通過這些標(biāo)注數(shù)據(jù)(squares與circles)來學(xué)得參數(shù)W和b,并用來分類新點(diǎn)X。

? ? ? 第一個(gè)嘗試的方法類似之前提到的線性回歸,對(duì)神經(jīng)元輸入已知的標(biāo)注數(shù)據(jù),并比較計(jì)算結(jié)果與真實(shí)結(jié)果。在迭代時(shí),通過調(diào)整參數(shù)W和b來最小化錯(cuò)誤值,正像第二章中線性回歸所做的那樣。

? ? ? 一旦有了參數(shù)W和b后,就可以計(jì)算加權(quán)和,現(xiàn)在我們需要一個(gè)函數(shù)來將結(jié)果轉(zhuǎn)化成0或1。有幾個(gè)激活函數(shù)可以做到這樣,在本例子中,我們使用一個(gè)很流行的函數(shù)叫sigmoid來返回一個(gè)0到1之間的真實(shí)值:

? ? ? 通過公式我們可以看到,它會(huì)返回一個(gè)非常接近0或1的值。如果輸入z是正值且足夠大,e的-z次冪為0,然后y為1。如果輸入z是負(fù)值且足夠大,e的-z次冪為無窮大,分母為無窮大,然后y為0。如果用圖表畫出該函數(shù),大約如下圖所示:

? ? ? 到現(xiàn)在為止我們已經(jīng)講解了如何描述一個(gè)神經(jīng)元,但神經(jīng)網(wǎng)絡(luò)是由很多神經(jīng)元組成,神經(jīng)元間以不同方式連接并使用不同的激活函數(shù)。本書范圍內(nèi)不會(huì)討論神經(jīng)網(wǎng)絡(luò)的很多擴(kuò)展細(xì)節(jié),但向你保證,神經(jīng)網(wǎng)絡(luò)是非常有趣的。

? ? ? 需要提一下,現(xiàn)在有具體的神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)方式(第五章中會(huì)使用),神經(jīng)元以層的方式來組織,輸入層接受輸入,最頂層(輸出層)產(chǎn)生響應(yīng)結(jié)果。神經(jīng)網(wǎng)絡(luò)可以有很多中間層,叫隱藏層。用圖畫出神經(jīng)網(wǎng)絡(luò)如下所示:

? ? ? 神經(jīng)網(wǎng)絡(luò)中,某一層的神經(jīng)元與前一層的神經(jīng)元通信來獲得該層的輸入信息,然后將結(jié)果輸出給下一層的神經(jīng)元。

? ? ? 正如之前所說的,除了sigmoid之外,還有很多的激活函數(shù),每個(gè)激活函數(shù)都有不同的屬性。例如,如果我們?cè)谳敵鰧酉雽?shù)據(jù)分到多于2類中,需要使用softmax激活函數(shù),是sigmoid函數(shù)的通用版。Softmax計(jì)算屬于每一個(gè)分類的概率,概率總和為1,最有可能的結(jié)果是概率最大的那一個(gè)。

簡單例子開始:Softmax

? ? ? 還記的我們的需要解決的問題是,輸入一張圖片,得到這張圖片屬于某一數(shù)字的概率。例如,我們的模型可以預(yù)測一張圖片為9的概率為80%,為8的概率為5%,同樣其它數(shù)字的概率也很低。識(shí)別手寫數(shù)字有一定的不確定性,我們做不到100%的正確性來識(shí)別數(shù)字。在本例子中,概率分布使得我們可以明白有多大的正確性來預(yù)測。

? ? ? 所以,我們會(huì)得到向量,它包含了不同輸出標(biāo)簽的概率分布,它們之間互斥。也就是說,一個(gè)向量帶有10個(gè)概率值,每一個(gè)概率值對(duì)應(yīng)了數(shù)字0到9,所有概率之和為1。

? ? ? 如之前所說,我們通過在輸出層使用softmax激活函數(shù)來達(dá)到這個(gè)目的。神經(jīng)元中softmax的輸出結(jié)果依賴于本層中其它神經(jīng)元的輸出,因?yàn)楸仨毐WC輸出結(jié)果之和為1。

? ? ? Softmax函數(shù)有兩個(gè)主要步驟:1.計(jì)算一張圖片屬于某一標(biāo)簽的“證據(jù)”;2.將“證據(jù)”轉(zhuǎn)換成屬于每一個(gè)可能標(biāo)簽的概率。

屬于某類的“證據(jù)”

? ? ? 如何度量一張圖片屬于某一分類/標(biāo)簽的證據(jù)?一個(gè)常用的方法是計(jì)算像素強(qiáng)度的加權(quán)和。像素的權(quán)重為負(fù)說明像素有很高的強(qiáng)度表明不屬于該類,為正時(shí)表明屬于該類。

? ? ? 接下來看一個(gè)圖形例子:假如一個(gè)對(duì)于數(shù)字0學(xué)習(xí)完的模型(稍后我們會(huì)看到模型是如何得到的)。這次,我們將模型定義為包含一些信息來推斷一個(gè)數(shù)字是否屬于某一分類。在本例子中,我們選擇一個(gè)如下所示的模型,紅色(或b/n版本中的亮灰色)代表負(fù)樣本(這些像素不屬于0),藍(lán)色(或b/n版本中的深灰)代表了正樣本:


? ? ? 想像在28*28像素的一張白紙下畫一個(gè)0。一般來說,0會(huì)被畫在藍(lán)色區(qū)域(我們?cè)?0*20畫的區(qū)域周邊預(yù)留一些空間,用來將它居中)。

? ? ? 非常明顯當(dāng)我們畫的穿過紅色區(qū)域時(shí),很有可能我們畫的不是0。所以,穿過藍(lán)色區(qū)域?qū)ο袼丶訖?quán),紅色區(qū)域會(huì)像素懲罰的機(jī)制是合理的。

? ? ? 現(xiàn)在來看3:很明顯模型中對(duì)于0的紅色區(qū)域會(huì)懲罰它屬于0的概率。但是如果相關(guān)模型是哪下所示,一般生成3的像素會(huì)在藍(lán)色區(qū)域;同時(shí)畫0時(shí)也會(huì)進(jìn)入到紅色區(qū)域。

? ? ? 希望讀者通過這兩個(gè)例子能理解這種方法是如何來預(yù)估哪個(gè)數(shù)字表示了這些圖。

? ? ? 下面的這些圖片顯示了從MNIST數(shù)據(jù)集中學(xué)到的10個(gè)不同標(biāo)簽/分類。記住紅色(亮灰)代表負(fù)權(quán)重,藍(lán)色(暗灰)代表正權(quán)重:

? ? ? ?用公式表達(dá)的話,輸入X屬于類別i的證據(jù)可表示為:

? ? ? ?i代表分類(本例子中為0到9),j是輸入照片求和的索引,wi代表了前面描述的權(quán)重。

? ? ? 一般來說,模型中也會(huì)包含一個(gè)額外的參數(shù),表示為bias,用來增加一些不確定性。本例子中,公式如下所示:

? ? ? 對(duì)于第一個(gè)i(0到9),我們有一個(gè)784元素的矩陣Wi,每一個(gè)元素j與輸入照片784元素中相應(yīng)位置的元素相乘,然后加上bi。圖形化表示為:

屬于某類的概率

? ? ?之前提到第二步包含了計(jì)算概率。我們用softmax函數(shù)將“證據(jù)”求和轉(zhuǎn)變成可預(yù)測的概率,并用y來表示:

? ? ?輸出的向量一定是一個(gè)概率函數(shù)且和為1。為歸一化每一個(gè)元素,softmax函數(shù)對(duì)每一個(gè)輸入求指數(shù),然后如下來歸一化:

? ? ?采用指數(shù)的效果是在權(quán)重上進(jìn)行乘法的效果。當(dāng)支持某一類的“證據(jù)”很小時(shí),該類的支持會(huì)被之前的權(quán)重減掉一小部分。更進(jìn)一步,softmax函數(shù)歸一化權(quán)重,并使得其和為1,同時(shí)創(chuàng)建一個(gè)概率分布。

? ? ?該函數(shù)比較有意思的一點(diǎn)是好的預(yù)測輸出結(jié)果中一個(gè)值接近1,其余的接近0;弱的預(yù)測中,一些標(biāo)簽可能是相似的值。

TensorFlow中編程實(shí)現(xiàn)

? ? ?在簡要介紹了算法是如何識(shí)別數(shù)字后,我們可以在TensorFlow中實(shí)現(xiàn)它。先快速了解下tensor如何存儲(chǔ)我們的數(shù)據(jù)和模型參數(shù)。基于此,下面的范式描述了相關(guān)數(shù)據(jù)與它閃間的關(guān)系(幫助讀者容易回憶起問題中的每一個(gè)部分):

? ? ?首先創(chuàng)建兩個(gè)變量來保存權(quán)重W和bias b:

? ? ?這兩個(gè)變量通過調(diào)用tf.Variable來創(chuàng)建并初始化;本例子中,我們用常量0來初始化tensor。

? ? ?可以看到W的shape為【Dimension(784), Dimension(10)】,這是由它的參數(shù)常量tensor?tf.zeros[784,10]定義的。參數(shù)b也是類似,由它的參數(shù)指定形狀為[Dimension(10)]。

? ? ?矩陣W有這樣的大小是因?yàn)閷?duì)于10個(gè)可能性中的任一個(gè)。它都要與圖片向量784個(gè)位置相乘,加上b之后生成一個(gè)“證據(jù)”tensor。

? ? ?本例子中使用了MNIST,同樣需要?jiǎng)?chuàng)建一個(gè)2維的tensor來保留這些點(diǎn)的信息,代碼如下:

? ? ?tensorx將用來存儲(chǔ)MNIST圖像向量中784個(gè)浮點(diǎn)值(None代表該維度可為任意大小,本例子中將會(huì)是學(xué)習(xí)過程中照片的數(shù)量)

? ? ?定義完tensor后,接下來就可以實(shí)現(xiàn)模型。TensorFlow提供了很多操作來實(shí)現(xiàn)之前描述的softmax函數(shù),tf.nn.softmax(logits,name)只是眾多可用操作中的一個(gè)。參數(shù)必須是一個(gè)tensor,另外一個(gè)可選參數(shù)是name。函數(shù)返回一個(gè)同類型的tensor,其shape與參數(shù)一樣。

? ? ?在本例子中,我們將圖像向量x與權(quán)重矩陣W相乘再加上b之后的結(jié)果作為參數(shù)傳給softmax函數(shù):

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

? ? ?一旦確認(rèn)了模型的實(shí)現(xiàn),就可以通過一個(gè)迭代訓(xùn)練算法來獲得權(quán)重W和bias b。在每次迭代中,訓(xùn)練算法讀入訓(xùn)練數(shù)據(jù),應(yīng)用神經(jīng)網(wǎng)絡(luò),比較輸出結(jié)果與預(yù)期結(jié)果。

? ? ?為了能夠判斷一個(gè)模型是足夠好還是足夠壞,我們需要定義足夠好的定義。如之前章節(jié)中看到的,通用的方法是定義相反面:使用cost function表示一個(gè)模型有多壞。這樣的話,目標(biāo)就是找到參數(shù)W和b的值來最小化該函數(shù)。

? ? ?有多種不同機(jī)制來度量在訓(xùn)練數(shù)據(jù)上輸出結(jié)果與期望結(jié)果的差異。一個(gè)通用的方法是平均方差或平方歐氏距離。即使如此,一些研究小組針對(duì)神經(jīng)網(wǎng)絡(luò)提出了其它的機(jī)制,類似本例子中使用的交叉熵個(gè)代價(jià)函數(shù)。該算法計(jì)算公式如下:

? ? ?y是預(yù)測生成的概率分布,y`是訓(xùn)練數(shù)據(jù)集中標(biāo)注的真實(shí)分布。這里不會(huì)深入到交叉熵背后的數(shù)學(xué)細(xì)節(jié)以及它在神經(jīng)網(wǎng)絡(luò)中的地位,因?yàn)檫@已經(jīng)遠(yuǎn)超過本書的討論范圍;我們需要知道的是當(dāng)兩個(gè)分布完全一樣的時(shí)候,此時(shí)獲得最小值。再次說明,如果讀者希望學(xué)習(xí)該函數(shù)的內(nèi)部細(xì)節(jié),建議閱讀神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)一書。

? ? ?為實(shí)現(xiàn)交叉熵,需要?jiǎng)?chuàng)建一個(gè)placeholder代表正確的標(biāo)簽:

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

? ? ?使用這個(gè)placeholder,可通過下面代碼實(shí)現(xiàn)交叉熵,用來代表cost function:

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

? ? ?首先使用tensorflow中內(nèi)置的tf.log()對(duì)每一個(gè)元素y求對(duì)數(shù),然后再與每一個(gè)y_的元素相乘。最后使用tf.reduce_sum對(duì)tensor的所有元素求和(稍后我們會(huì)看到圖片是分批處理的,所以交叉熵的值是一批照片的,并不是一張照片的)。

? ? ?在迭代中,一旦對(duì)樣本定義了錯(cuò)誤表示,就需要在下次迭代中修正模型(通過修改參數(shù)W和b)來減少計(jì)算結(jié)果與期望結(jié)果的差值。

? ? ?最后,只需要實(shí)現(xiàn)迭代最小化的處理過程。神經(jīng)網(wǎng)絡(luò)中有一些算法來解決這個(gè)問題;我們使用反向傳播(backward propagation of errors)算法,正如它的名字所示,該算法會(huì)反向傳播輸出中的錯(cuò)誤值,以用來重新計(jì)算權(quán)重W,該算法對(duì)多層神經(jīng)網(wǎng)絡(luò)尤其重要。

? ? 反射傳播算法通常會(huì)與梯度下降算法一起使用,梯度下降算法中會(huì)使用交叉熵cost function,并使得我們?cè)诿看蔚懈鶕?jù)局部可用信息來計(jì)算需要多大程度修改參數(shù)來降低錯(cuò)誤值。在本例子中,它會(huì)在每一次迭代中持續(xù)一點(diǎn)點(diǎn)修改權(quán)重W(這里的每一小步表示為學(xué)習(xí)速率參數(shù),表示變化的速率)來降低錯(cuò)誤值。

? ? ?由于本例子中我們使用的神經(jīng)網(wǎng)絡(luò)只有一層,我們不會(huì)詳細(xì)分析反射傳播算法。只需要記住TensorFlow知道全部計(jì)算圖,并使用優(yōu)化算法為cost function找到合適的梯度來訓(xùn)練模型。

? ? ? 因?yàn)槲覀兪褂昧薓NIST數(shù)據(jù)集,下面的代碼顯示我們使用反向傳播算法與梯度下降算法來最小化交叉熵,同時(shí)學(xué)習(xí)速率為0.01。

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

? ? ? 到現(xiàn)在為止,我們已經(jīng)實(shí)現(xiàn)了所有問題,可以通過創(chuàng)建tf.Session()開始在可用設(shè)備CPUS或GPUS上計(jì)算各操作:

sess=tf.Session()

? ? ? 接下來,通過一個(gè)操作來初始化所有變量:

sess.run(tf.initialize_all_variables())

? ? ? 從現(xiàn)在開始,我們可以訓(xùn)練模型。執(zhí)行后返回的train_step參數(shù),會(huì)對(duì)相關(guān)參數(shù)應(yīng)用梯度下降。所以訓(xùn)練模型可以通過重復(fù)執(zhí)行train_step來實(shí)現(xiàn)。假如我們想迭代1000次train_step;通過下面的代碼就能實(shí)現(xiàn):

? ? ? 循環(huán)中的第一行表示,每次迭代中,從訓(xùn)練數(shù)據(jù)集中隨機(jī)選取100張圖片作為一批。在每次迭代時(shí),雖然我們可以使用全部訓(xùn)練數(shù)據(jù)集,但為了使得本例子更精巧,我們每次選擇使用一小部分樣本。第二行表示之前獲得的輸入分別賦給相關(guān)的placeholders。

? ? ? 最后說明一點(diǎn),基于梯度下降的機(jī)器學(xué)習(xí)算法可以充分利用TensorFlow自動(dòng)對(duì)比差值的能力。TensorFlow的用戶只需要定義預(yù)測模型的計(jì)算結(jié)構(gòu),與目標(biāo)函數(shù)相結(jié)合,然后只需要提供數(shù)據(jù)。

? ? ? TensorFlow同樣負(fù)責(zé)學(xué)習(xí)過程背后的導(dǎo)數(shù)計(jì)算。當(dāng)minimize()被執(zhí)行時(shí),TensorFlow辨認(rèn)出loss function依賴的變量集合,對(duì)集合中的每一個(gè)變量計(jì)算梯度。如果你有興趣了解對(duì)比是如何實(shí)現(xiàn)的,可以研究ops/gradients.py文件。

模型評(píng)估

? ? ? 訓(xùn)練得到的模型必須被評(píng)估來看該模型是有多好(或多壞)。例如,我們可以計(jì)算在預(yù)測中正確與錯(cuò)誤的比例,查看哪些樣本被正確的預(yù)測了。在之前的章節(jié)中,我們看到tf.argmax(y,1)函數(shù)會(huì)返回tensor中參數(shù)指定的維度中的最大值的索引。在效果上,tf.argmax(y,1)是我們模型中輸入數(shù)據(jù)的最大概率標(biāo)簽,tf.argmax(y_,1)是實(shí)際的標(biāo)簽。通過tf.equal方法可以比較預(yù)測結(jié)果與實(shí)際結(jié)果是否相等:

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

? ? ? 這行代碼返回一個(gè)布爾列表。為得到哪些預(yù)測是正確的,我們可用如下代碼將布爾值轉(zhuǎn)換成浮點(diǎn)數(shù):

accuracy=tf.reduce_mean(tf.cast(correct_prediction,"float"))

? ? ? 例如,[True, False, True, True]會(huì)轉(zhuǎn)換成[1,0,1,1],其平均值0.75代表了準(zhǔn)確比例。現(xiàn)在我們可使用mnist.test數(shù)據(jù)集作為feed_dict參數(shù)來計(jì)算準(zhǔn)確率:

printsess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels})

? ? ? 我得到的精度是91%。這個(gè)精度好嗎?我認(rèn)為非常好,因?yàn)樽x者已經(jīng)可以在TensorFlow中編程并執(zhí)行他們的第一個(gè)神經(jīng)網(wǎng)絡(luò)。

? ? ? 另外一個(gè)問題是其它模型可能提供更好的精度,下一章中的多層神經(jīng)網(wǎng)絡(luò)會(huì)詳細(xì)講解。

? ? ? 讀者可在github上的RedNeuronalSimple.py文件中看到本章中所有代碼,全部代碼如下:

? ? ?下一章節(jié)中人分析構(gòu)建多層神經(jīng)網(wǎng)絡(luò)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

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

  • 譯者序 前言 序 實(shí)踐練習(xí) 1.TensorFlow基礎(chǔ) 2.TensorFlow中實(shí)現(xiàn)線性回歸 3.Tensor...
    cn_Fly閱讀 14,604評(píng)論 14 111
  • tensorflow中文社區(qū)對(duì)官方文檔進(jìn)行了完整翻譯。鑒于官方更新不少內(nèi)容,而現(xiàn)有的翻譯基本上都已過時(shí)。故本人對(duì)更...
    周乘閱讀 10,291評(píng)論 4 27
  • 女人,你應(yīng)該20歲不失稚氣,30歲不失氣質(zhì),40歲不失優(yōu)雅,50歲不失韻味,60歲不失內(nèi)涵。當(dāng)然,你一直不可失的,...
    諾米Naomi閱讀 159評(píng)論 0 2
  • 本文想談?wù)勛止?jié)社、亞馬遜這兩家的電子書。他們分別體現(xiàn)了現(xiàn)在中文電子書的兩種趨勢(shì)。 字節(jié)社,自稱「中文世界最好的網(wǎng)上...
    梅阿查之夜閱讀 10,391評(píng)論 0 8
  • 春節(jié)的午后,坐在臥室的床上,和暖的陽光灑在臥室的梳妝鏡上,照著鏡中的我,一臉燦爛,一臉?gòu)趁摹?/div>
    風(fēng)箏_5c59閱讀 441評(píng)論 8 9