MNIST機(jī)器學(xué)習(xí)入門_第1頁(yè)
MNIST機(jī)器學(xué)習(xí)入門_第2頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、MNIST機(jī)器學(xué)習(xí)入門這個(gè)教程的目標(biāo)讀者是對(duì)機(jī)器學(xué)習(xí)和TensorFlow都不太了解的新手。如果你已經(jīng)了解MNIST和softmax回(softmaxregression)的相關(guān)知識(shí),你可以閱讀這個(gè)快速上手教程。當(dāng)我們開(kāi)始學(xué)習(xí)編程的時(shí)候,第一件事往往是學(xué)習(xí)打印HelloWorld。就好比編程入門有HelloWorld,機(jī)器學(xué)習(xí)入門有MNIST。MNIST是一個(gè)入門級(jí)的計(jì)算機(jī)視覺(jué)數(shù)據(jù)集,它包含各種手寫(xiě)數(shù)字圖片:它也包含每一張圖片對(duì)應(yīng)的標(biāo)簽,告訴我們這個(gè)是數(shù)字幾。比如,上面這四張圖片的標(biāo)簽分別是5,0,4,1。在此教程中,我們將訓(xùn)練一個(gè)機(jī)器學(xué)習(xí)模型用于預(yù)測(cè)圖片里面的數(shù)字。我們的目的不是要設(shè)計(jì)一個(gè)世

2、界一流的復(fù)雜模型-盡管我們會(huì)在之后給你源代碼去實(shí)現(xiàn)一流的預(yù)測(cè)模型-而是要介紹下如何使用TensorFlow。所以,我們這里會(huì)從一個(gè)很簡(jiǎn)單的數(shù)學(xué)模型開(kāi)始,它叫做SoftmaxRegression。對(duì)應(yīng)這個(gè)教程的實(shí)現(xiàn)代碼很短,而且真正有意思的內(nèi)容只包含在三行代碼里面。但是,去理解包含在這些代碼里面的設(shè)計(jì)思想是非常重要的:TensorFlow工作流程和機(jī)器學(xué)習(xí)的基本概念。因此,這個(gè)教程會(huì)很詳細(xì)地介紹這些代碼的實(shí)現(xiàn)原理。MNIST數(shù)據(jù)集MNIST數(shù)據(jù)集的官網(wǎng)是YannLeCunswebsite。在這里,我們提供了一份python源代碼用于自動(dòng)下載和安裝這個(gè)數(shù)據(jù)集。你可以下載這份代碼,然后用下面的代碼導(dǎo)

3、入到你的項(xiàng)目里面,也可以直接復(fù)制粘貼到你的代碼文件里面。importtensorflow.examples.tutorials.mnist.input_dataasinput_datamnist=input_data.read_data_sets(MNIST_data/,one_hot=True)下載下來(lái)的數(shù)據(jù)集被分成兩部分:60000行的訓(xùn)練數(shù)據(jù)集(mnist.train)和10000行的測(cè)試數(shù)據(jù)集(mnist.test)。這樣的切分很重要,在機(jī)器學(xué)習(xí)模型設(shè)計(jì)時(shí)必須有一個(gè)單獨(dú)的測(cè)試數(shù)據(jù)集不用于訓(xùn)練而是用來(lái)評(píng)估這個(gè)模型的性能,從而更加容易把設(shè)計(jì)的模型推廣到其他數(shù)據(jù)集上(泛化)。正如前面提到的一

4、樣,每一個(gè)MNIST數(shù)據(jù)單元有兩部分組成:一張包含手寫(xiě)數(shù)字的圖片和一個(gè)對(duì)應(yīng)的標(biāo)簽。我們把這些圖片設(shè)為“xs”,把這些標(biāo)簽設(shè)為“ys”。訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集都包含xs和ys,比如訓(xùn)練數(shù)據(jù)集的圖片是mnist.train.images,訓(xùn)練數(shù)據(jù)集的標(biāo)簽是mnist.train.labels。每一張圖片包含28X28個(gè)像素點(diǎn)。我們可以用一個(gè)數(shù)字?jǐn)?shù)組來(lái)表示這張圖片:fl00fl00!l0000fla000n可0a0bn00血001.1000OaQ00000040J丄Q004o000D00caa000an打a00fl00fl0000000fl00我們把這個(gè)數(shù)組展開(kāi)成一個(gè)向量,長(zhǎng)度是28x28=784。

5、如何展開(kāi)這個(gè)數(shù)組(數(shù)字間的順序)不重要,只要保持各個(gè)圖片采用相同的方式展開(kāi)。從這個(gè)角度來(lái)看,MNIST數(shù)據(jù)集的圖片就是在784維向量空間里面的點(diǎn),并且擁有比較復(fù)雜的結(jié)構(gòu)(提醒:此類數(shù)據(jù)的可視化是計(jì)算密集型的)。展平圖片的數(shù)字?jǐn)?shù)組會(huì)丟失圖片的二維結(jié)構(gòu)信息。這顯然是不理想的,最優(yōu)秀的計(jì)算機(jī)視覺(jué)方法會(huì)挖掘并利用這些結(jié)構(gòu)信息,我們會(huì)在后續(xù)教程中介紹。但是在這個(gè)教程中我們忽略這些結(jié)構(gòu),所介紹的簡(jiǎn)單數(shù)學(xué)模型,softmax回歸(softmaxregression),不會(huì)利用這些結(jié)構(gòu)信息。因此,在MNIST訓(xùn)練數(shù)據(jù)集中,mnist.train.images是一個(gè)形狀為60000,784的張量,第一個(gè)維度數(shù)字

6、用來(lái)索引圖片,第二個(gè)維度數(shù)字用來(lái)索引每張圖片中的像素點(diǎn)。在此張量里的每一個(gè)元素,都表示某張圖片里的某個(gè)像素的強(qiáng)度值,值介于0和1之間。784mnist.train.xs60000相對(duì)應(yīng)的MNIST數(shù)據(jù)集的標(biāo)簽是介于0到9的數(shù)字,用來(lái)描述給定圖片里表示的數(shù)字。為了用于這個(gè)教程,我們使標(biāo)簽數(shù)據(jù)是one-hotvectors。一個(gè)one-hot向量除了某一位的數(shù)字是1以外其余各維度數(shù)字都是0。所以在此教程中,數(shù)字n將表示成一個(gè)只有在第n維度(從0開(kāi)始)數(shù)字為1的10維向量。比如,標(biāo)簽0將表示成(1,0,0,0,0,0,0,0,0,0,0)。因此,mnist.train.labels是一個(gè)60000,

7、10的數(shù)字矩陣。mnist.train.ys60000現(xiàn)在,我們準(zhǔn)備好可以開(kāi)始構(gòu)建我們的模型啦!Softmax回歸介紹我們知道MNIST的每一張圖片都表示一個(gè)數(shù)字,從0到9。我們希望得到給定圖片代表每個(gè)數(shù)字的概率。比如說(shuō),我們的模型可能推測(cè)一張包含9的圖片代表數(shù)字9的概率是80%但是判斷它是8的概率是5%(因?yàn)?和9都有上半部分的小圓),然后給予它代表其他數(shù)字的概率更小的值。這是一個(gè)使用softmax回歸(softmaxregression)模型的經(jīng)典案例。softmax模型可以用來(lái)給不同的對(duì)象分配概率。即使在之后,我們訓(xùn)練更加精細(xì)的模型時(shí),最后一步也需要用softmax來(lái)分配概率。softm

8、ax回歸(softmaxregression)分兩步:第一步為了得到一張給定圖片屬于某個(gè)特定數(shù)字類的證據(jù)(evidenee),我們對(duì)圖片像素值進(jìn)行加權(quán)求和。如果這個(gè)像素具有很強(qiáng)的證據(jù)說(shuō)明這張圖片不屬于該類,那么相應(yīng)的權(quán)值為負(fù)數(shù),相反如果這個(gè)像素?fù)碛杏欣淖C據(jù)支持這張圖片屬于這個(gè)類,那么權(quán)值是正數(shù)。下面的圖片顯示了一個(gè)模型學(xué)習(xí)到的圖片上每個(gè)像素對(duì)于特定數(shù)字類的權(quán)值。紅色代表負(fù)數(shù)權(quán)值,藍(lán)色代表正數(shù)權(quán)值。0123456789我們也需要加入一個(gè)額外的偏置量(bias),因?yàn)檩斎胪鶗?huì)帶有一些無(wú)關(guān)的干擾量。因此對(duì)于給定的輸入圖片x它代表的是數(shù)字i的證據(jù)可以表示為其中代表權(quán)重,山代表數(shù)字i類的偏置量,j代

9、表給定圖片x的像素索引用于像素求和。然后用softmax函數(shù)可以把這些證據(jù)轉(zhuǎn)換成概率y:y=Eoftmax(evidehce)這里的softmax可以看成是一個(gè)激勵(lì)(aetivation)函數(shù)或者鏈接(link)函數(shù),把我們定義的線性函數(shù)的輸出轉(zhuǎn)換成我們想要的格式,也就是關(guān)于10個(gè)數(shù)字類的概率分布。因此,給定一張圖片,它對(duì)于每一個(gè)數(shù)字的吻合度可以被softmax函數(shù)轉(zhuǎn)換成為一個(gè)概率值。softmax函數(shù)可以定義為:softniax(j?)=口ornialize(exp(j?)展開(kāi)等式右邊的子式,可以得到:so仕max(z)F=exp(zj但是更多的時(shí)候把softmax模型函數(shù)定義為前一種形式:

10、把輸入值當(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è)有效的概率分布。(更多的關(guān)于Softmax函數(shù)的信息,可以參考MichaelNieslen的書(shū)里面的這個(gè)部分,其中有關(guān)于softmax的可交互式的可視化解釋。)對(duì)于softmax回歸模型可以用下面的圖解釋,對(duì)于輸入的xs加權(quán)求和,再分別加上一個(gè)偏置量,最后再輸入到softmax函數(shù)中:softmQJx

11、如果把它寫(xiě)成一個(gè)等式,我們可以得到:yi|Him+bit/2=softmaxW2xr+肌尹3+2y3+2+昭護(hù)3+&3我們也可以用向量表示這個(gè)計(jì)算過(guò)程:用矩陣乘法和向量相加。這有助于提高計(jì)算效率。(也是一種更有效的思考方式)yi1sV2=softmax妙31=更進(jìn)一步,可以寫(xiě)成更加緊湊的方式:bi+血&3y=softmax(Tyx+6)實(shí)現(xiàn)回歸模型為了用python實(shí)現(xiàn)高效的數(shù)值計(jì)算,我們通常會(huì)使用函數(shù)庫(kù),比如NumPy,會(huì)把類似矩陣乘法這樣的復(fù)雜運(yùn)算使用其他外部語(yǔ)言實(shí)現(xiàn)。不幸的是,從外部計(jì)算切換回Python的每一個(gè)操作,仍然是一個(gè)很大的開(kāi)銷。如果你用GPU來(lái)進(jìn)行外部計(jì)算,這樣的開(kāi)銷會(huì)更大。

12、用分布式的計(jì)算方式,也會(huì)花費(fèi)更多的資源用來(lái)傳輸數(shù)據(jù)。TensorFlow也把復(fù)雜的計(jì)算放在python之外完成,但是為了避免前面說(shuō)的那些開(kāi)銷,它做了進(jìn)一步完善。Tensorflow不單獨(dú)地運(yùn)行單一的復(fù)雜計(jì)算,而是讓我們可以先用圖描述一系列可交互的計(jì)算操作,然后全部一起在Python之外運(yùn)行。(這樣類似的運(yùn)行方式,可以在不少的機(jī)器學(xué)習(xí)庫(kù)中看到。)使用TensorFlow之前,首先導(dǎo)入它:importtensorflowastf我們通過(guò)操作符號(hào)變量來(lái)描述這些可交互的操作單元,可以用下面的方式創(chuàng)建一個(gè):x=tf.placeholder(tf.float32,None,784)x不是一個(gè)特定的值,而是

13、一個(gè)占位符placeholder,我們?cè)赥ensorFlow運(yùn)行計(jì)算時(shí)輸入這個(gè)值。我們希望能夠輸入任意數(shù)量的MNIST圖像,每一張圖展平成784維的向量。我們用2維的浮點(diǎn)數(shù)張量來(lái)表示這些圖,這個(gè)張量的形狀是None,784。(這里的None表示此張量的第一個(gè)維度可以是任何長(zhǎng)度的。)我們的模型也需要權(quán)重值和偏置量,當(dāng)然我們可以把它們當(dāng)做是另外的輸入(使用占位符),但TensorFlow有一個(gè)更好的方法來(lái)表示它們:Variable。一個(gè)Variable代表一個(gè)可修改的張量,存在在TensorFlow的用于描述交互性操作的圖中。它們可以用于計(jì)算輸入值,也可以在計(jì)算中被修改。對(duì)于各種機(jī)器學(xué)習(xí)應(yīng)用,一般

14、都會(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)+

15、b)首先,我們用tf.matmul(X,W)表示x乘以W,對(duì)應(yīng)之前等式里面的_,這里xWGc是一個(gè)2維張量擁有多個(gè)輸入。然后再加上b,把和輸入到tf.nn.softmax函數(shù)里面。至此,我們先用了幾行簡(jiǎn)短的代碼來(lái)設(shè)置變量,然后只用了一行代碼來(lái)定義我們的模型。TensorFlow不僅僅可以使softmax回歸模型計(jì)算變得特別簡(jiǎn)單,它也用這種非常靈活的方式來(lái)描述其他各種數(shù)值計(jì)算,從機(jī)器學(xué)習(xí)模型對(duì)物理學(xué)模擬仿真模型。一旦被定義好之后,我們的模型就可以在不同的設(shè)備上運(yùn)行:計(jì)算機(jī)的CPU,GPU,甚至手機(jī)!訓(xùn)練模型為了訓(xùn)練我們的模型,我們首先需要定義一個(gè)指標(biāo)來(lái)評(píng)估這個(gè)模型是好的。其實(shí),在機(jī)器學(xué)習(xí),我們通

16、常定義指標(biāo)來(lái)表示一個(gè)模型是壞的,這個(gè)指標(biāo)稱為成本(cost)或損失(loss),然后盡量最小化這個(gè)指標(biāo)。但是,這兩種方式是相同的。一個(gè)非常常見(jiàn)的,非常漂亮的成本函數(shù)是交叉熵”(cross-entropy)。交叉熵產(chǎn)生于信息論里面的信息壓縮編碼技術(shù),但是它后來(lái)演變成為從博弈論到機(jī)器學(xué)習(xí)等其他領(lǐng)域里的重要技術(shù)手段。它的定義如下:砒=工yfi噸(如y是我們預(yù)測(cè)的概率分布,y是實(shí)際的分布(我們輸入的one-hotvector)。比較粗糙的理解是,交叉熵是用來(lái)衡量我們的預(yù)測(cè)用于描述真相的低效性。更詳細(xì)的關(guān)于交叉熵的解釋超出本教程的范疇,但是你很有必要好好理解它。為了計(jì)算交叉熵,我們首先需要添加一個(gè)新的占

17、位符用于輸入正確值:y_=tf.placeholder(float,None,10)護(hù)然后我們可以用計(jì)算交叉熵:cross_entropy=-tf.reduce_sum(y_*tf.log(y)首先,用tf.log計(jì)算y的每個(gè)元素的對(duì)數(shù)。接下來(lái),我們把y_的每一個(gè)元素和tf.log(y)的對(duì)應(yīng)兀素相乘。最后,用tf.reduce_sum計(jì)算張量的所有兀素的總和。(注意,這里的交叉熵不僅僅用來(lái)衡量單一的一對(duì)預(yù)測(cè)和真實(shí)值,而是所有100幅圖片的交叉熵的總和。對(duì)于100個(gè)數(shù)據(jù)點(diǎn)的預(yù)測(cè)表現(xiàn)比單一數(shù)據(jù)點(diǎn)的表現(xiàn)能更好地描述我們的模型的性能?,F(xiàn)在我們知道我們需要我們的模型做什么啦,用TensorFlow來(lái)訓(xùn)

18、練它是非常容易的。因?yàn)門ensorFlow擁有一張描述你各個(gè)計(jì)算單元的圖,它可以自動(dòng)地使用反向傳播算法(backpropagationalgorithm)來(lái)有效地確定你的變量是如何影響你想要最小化的那個(gè)成本值的。然后,TensorFlow會(huì)用你選擇的優(yōu)化算法來(lái)不斷地修改變量以降低成本。train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)在這里,我們要求TensorFlow用梯度下降算法(gradientdescentalgorithm)以0.01的學(xué)習(xí)速率最小化交叉熵。梯度下降算法(gradient

19、descentalgorithm)是一個(gè)簡(jiǎn)單的學(xué)習(xí)過(guò)程,TensorFlow只需將每個(gè)變量一點(diǎn)點(diǎn)地往使成本不斷降低的方向移動(dòng)。當(dāng)然TensorFlow也提供了其他許多優(yōu)化算法:只要簡(jiǎn)單地調(diào)整一行代碼就可以使用其他的算法。TensorFlow在這里實(shí)際上所做的是,它會(huì)在后臺(tái)給描述你的計(jì)算的那張圖里面增加一系列新的計(jì)算操作單元用于實(shí)現(xiàn)反向傳播算法和梯度下降算法。然后,它返回給你的只是一個(gè)單一的操作,當(dāng)運(yùn)行這個(gè)操作時(shí),它用梯度下降算法訓(xùn)練你的模型,微調(diào)你的變量,不斷減少成本?,F(xiàn)在,我們已經(jīng)設(shè)置好了我們的模型。在運(yùn)行計(jì)算之前,我們需要添加一個(gè)操作來(lái)初始化我們創(chuàng)建的變量:init=tf.initiali

20、ze_all_variables()現(xiàn)在我們可以在一個(gè)Session里面啟動(dòng)我們的模型,并且初始化變量:sess=tf.Session()sess.run(init)然后開(kāi)始訓(xùn)練模型,這里我們讓模型循環(huán)訓(xùn)練1000次!foriinrange(1000):printsess.run(accuracy,feed_dict=x:mnist.test.images,y_:mnist.test.labels)sess.run(train_step,feed_dict=x:batch_xs,y_:batch_ys)該循環(huán)的每個(gè)步驟中,我們都會(huì)隨機(jī)抓取訓(xùn)練數(shù)據(jù)中的100個(gè)批處理數(shù)據(jù)點(diǎn),然后我們用這些數(shù)據(jù)點(diǎn)作

21、為參數(shù)替換之前的占位符來(lái)運(yùn)行train_step。使用一小部分的隨機(jī)數(shù)據(jù)來(lái)進(jìn)行訓(xùn)練被稱為隨機(jī)訓(xùn)練(stochastictraining)-在這里更確切的說(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)估我們的模型那么我們的模型性能如何呢?首先讓我們找出那些預(yù)測(cè)正確的標(biāo)簽otf.argmax是一個(gè)非常有用的函數(shù),它能給出某個(gè)tensor對(duì)象在某一維上的其數(shù)據(jù)最大值所在的索引值。由于標(biāo)簽向量是由0,1

22、組成,因此最大值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)這行代碼會(huì)給我們一組布爾值。為了確定正確預(yù)測(cè)項(xiàng)的比例,我們可以把布爾值轉(zhuǎn)換成浮點(diǎn)數(shù),然后取平均值。例如,True,False,True,True會(huì)變成1,0,1,1,取平均值后得到0.75.accuracy=tf.reduce_me

23、an(tf.cast(correct_prediction,float)最后,我們計(jì)算所學(xué)習(xí)到的模型在測(cè)試數(shù)據(jù)集上面的正確率。這個(gè)最終結(jié)果值應(yīng)該大約是91%。這個(gè)結(jié)果好嗎?嗯,并不太好。事實(shí)上,這個(gè)結(jié)果是很差的。這是因?yàn)槲覀儍H僅使用了一個(gè)非常簡(jiǎn)單的模型。不過(guò),做一些小小的改進(jìn),我們就可以得到97%的正確率。最好的模型甚至可以獲得超過(guò)99.7%的準(zhǔn)確率?。ㄏ肓私飧嘈畔?,可以看看這個(gè)關(guān)于各種模型的性能對(duì)比列表。)比結(jié)果更重要的是,我們從這個(gè)模型中學(xué)習(xí)到的設(shè)計(jì)思想。不過(guò),如果你仍然對(duì)這里的結(jié)果有點(diǎn)失望,可以查看下一個(gè)教程,在那里你可以學(xué)習(xí)如何用TensorFlow構(gòu)建更加復(fù)雜的模型以獲得更好的性能

24、!深入MNISTTensorFlow是一個(gè)非常強(qiáng)大的用來(lái)做大規(guī)模數(shù)值計(jì)算的庫(kù)。其所擅長(zhǎng)的任務(wù)之一就是實(shí)現(xiàn)以及訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)。在本教程中,我們將學(xué)到構(gòu)建一個(gè)TensorFlow模型的基本步驟,并將通過(guò)這些步驟為MNIST構(gòu)建一個(gè)深度卷積神經(jīng)網(wǎng)絡(luò)。這個(gè)教程假設(shè)你已經(jīng)熟悉神經(jīng)網(wǎng)絡(luò)和MNIST數(shù)據(jù)集。如果你尚未了解,請(qǐng)查看新手指南.安裝在創(chuàng)建模型之前,我們會(huì)先加載MNIST數(shù)據(jù)集,然后啟動(dòng)一個(gè)TensorFlow的session。加載MNIST數(shù)據(jù)為了方便起見(jiàn),我們已經(jīng)準(zhǔn)備了一個(gè)腳本來(lái)自動(dòng)下載和導(dǎo)入MNIST數(shù)據(jù)集。它會(huì)自動(dòng)創(chuàng)建一個(gè)MNIST_data的目錄來(lái)存儲(chǔ)數(shù)據(jù)。importinput_dat

25、amnist=input_data.read_data_sets(MNIST_data,one_hot=True)這里,mnist是一個(gè)輕量級(jí)的類。它以Numpy數(shù)組的形式存儲(chǔ)著訓(xùn)練、校驗(yàn)和測(cè)試數(shù)據(jù)集。同時(shí)提供了一個(gè)函數(shù),用于在迭代中獲得minibatch,后面我們將會(huì)用到。運(yùn)行TensorFlow的InteractiveSessionTensorflow依賴于一個(gè)高效的C+后端來(lái)進(jìn)行計(jì)算。與后端的這個(gè)連接叫做session。一般而言,使用TensorFlow程序的流程是先創(chuàng)建一個(gè)圖,然后在session中啟動(dòng)它。這里,我們使用更加方便的InteractiveSession類。通過(guò)它,你可以更

26、加靈活地構(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ì)算圖importtensorflowastfsess=tfnteractiveSession()計(jì)算圖為了在Python中進(jìn)行高效的數(shù)值計(jì)算,我們通常會(huì)使用像NumPy類的庫(kù),將一些諸如矩陣乘法的耗時(shí)操作在Python環(huán)境的外部來(lái)計(jì)算,這些計(jì)算通常會(huì)通過(guò)其它語(yǔ)言并用更為高效的代碼來(lái)實(shí)現(xiàn)。但遺憾的是,每

27、一個(gè)操作切換回Python環(huán)境時(shí)仍需要不小的開(kāi)銷。如果你想在GPU或者分布式環(huán)境中計(jì)算時(shí),這一開(kāi)銷更加可怖,這一開(kāi)銷主要可能是用來(lái)進(jìn)行數(shù)據(jù)遷移。TensorFlow也是在Python外部完成其主要工作,但是進(jìn)行了改進(jìn)以避免這種開(kāi)銷。其并沒(méi)有采用在Python外部獨(dú)立運(yùn)行某個(gè)耗時(shí)操作的方式,而是先讓我們描述一個(gè)交互操作圖,然后完全將其運(yùn)行在Python外部。這與Theano或Torch的做法類似。因此Python代碼的目的是用來(lái)構(gòu)建這個(gè)可以在外部運(yùn)行的計(jì)算圖,以及安排計(jì)算圖的哪一部分應(yīng)該被運(yùn)行。詳情請(qǐng)查看基本用法中的計(jì)算圖表一節(jié)。構(gòu)建Softmax回歸模型在這一節(jié)中我們將建立一個(gè)擁有一個(gè)線性層的

28、softmax回歸模型。在下一節(jié),我們會(huì)將其擴(kuò)展為一個(gè)擁有多層卷積網(wǎng)絡(luò)的softmax回歸模型。占位符我們通過(guò)為輸入圖像和目標(biāo)輸出類別創(chuàng)建節(jié)點(diǎn),來(lái)開(kāi)始構(gòu)建計(jì)算圖。x=tf.placeholder(float,shape=None,784)y_=tf.placeholder(float,shape=None,10)這里的x和y并不是特定的值,相反,他們都只是一個(gè)占位符,可以在TensorFlow運(yùn)行某一計(jì)算時(shí)根據(jù)該占位符輸入具體的值。輸入圖片x是一個(gè)2維的浮點(diǎn)數(shù)張量。這里,分配給它的shape為None,784,其中784是一張展平的MNIST圖片的維度。None表示其值大小不定,在這里作為第一

29、個(gè)維度值,用以指代batch的大小,意即x的數(shù)量不定。輸出類別值y_也是一個(gè)2維張量,其中每一行為一個(gè)10維的one-hot向量,用于代表對(duì)應(yīng)某一MNIST圖片的類別。雖然placeholder的shape參數(shù)是可選的,但有了它,TensorFlow能夠自動(dòng)捕捉因數(shù)據(jù)維度不一致導(dǎo)致的錯(cuò)誤。變量我們現(xiàn)在為模型定義權(quán)重W和偏置b。可以將它們當(dāng)作額外的輸入量,但是TensorFlow有一個(gè)更好的處理方式:變量。一個(gè)變量代表著TensorFlow計(jì)算圖中的一個(gè)值,能夠在計(jì)算過(guò)程中使用,甚至進(jìn)行修改。在機(jī)器學(xué)習(xí)的應(yīng)用過(guò)程中,模型參數(shù)一般用Variable來(lái)表示。W=tf.Variable(tf.zero

30、s(784,10)b=tf.Variable(tf.zeros(10)我們?cè)谡{(diào)用tf.Variable的時(shí)候傳入初始值。在這個(gè)例子里,我們把W和b都初始化為零向量。W是一個(gè)784x10的矩陣(因?yàn)槲覀冇?84個(gè)特征和10個(gè)輸出值)。b是一個(gè)10維的向量(因?yàn)槲覀冇?0個(gè)分類)。BeforeVariablescanbeusedwithinasession,theymustbeinitializedusingthatsession.Thissteptakestheinitialvalues(inthiscasetensorsfullofzeros)thathavealreadybeenspecif

31、ied,andassignsthemtoeachVariable.ThiscanbedoneforallVariablesatonce-變量需要通過(guò)seesion初始化后,才能在session中使用。這一初始化步驟為,為初始值指定具體值(本例當(dāng)中是全為零),并將其分配給每個(gè)變量,可以一次性為所有變量完成此操作。sess.run(tf.initialize_all_variables()類別預(yù)測(cè)與損失函數(shù)現(xiàn)在我們可以實(shí)現(xiàn)我們的回歸模型了。這只需要一行!我們把向量化后的圖片x和權(quán)重矩陣w相乘,加上偏置b,然后計(jì)算每個(gè)分類的softmax概率值。y=tf.nn.softmax(tf.matmul(x

32、,W)+b)可以很容易的為訓(xùn)練過(guò)程指定最小化誤差用的損失函數(shù),我們的損失函數(shù)是目標(biāo)類別和預(yù)測(cè)類別之間的交叉熵。cross_entropy=-tf.reduce_sum(y_*tf.log(y)注意,tf.reduce_sum把minibatch里的每張圖片的交叉熵值都加起來(lái)了。我們計(jì)算的交叉熵是指整個(gè)minibatch的。訓(xùn)練模型我們已經(jīng)定義好模型和訓(xùn)練用的損失函數(shù),那么用TensorFlow進(jìn)行訓(xùn)練就很簡(jiǎn)單了。因?yàn)門ensorFlow知道整個(gè)計(jì)算圖,它可以使用自動(dòng)微分法找到對(duì)于各個(gè)變量的損失的梯度值。TensorFlow有大量?jī)?nèi)置的優(yōu)化算法這個(gè)例子中,我們用最速下降法讓交叉熵下降,步長(zhǎng)為0.

33、01.train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)這一行代碼實(shí)際上是用來(lái)往計(jì)算圖上添加一個(gè)新操作,其中包括計(jì)算梯度,計(jì)算每個(gè)參數(shù)的步長(zhǎng)變化,并且計(jì)算出新的參數(shù)值。返回的train_step操作對(duì)象,在運(yùn)行時(shí)會(huì)使用梯度下降來(lái)更新參數(shù)。因此,整個(gè)模型的訓(xùn)練可以通過(guò)反復(fù)地運(yùn)行train_step來(lái)完成。foriinrange(1000):batch=mnist.train.next_batch(50)train_step.run(feed_dict=x:batch0,y_:batch1)每一步迭代

34、,我們都會(huì)加載50個(gè)訓(xùn)練樣本,然后執(zhí)行一次train_step,并通過(guò)feed_dict將x和y_張量占位符用訓(xùn)練訓(xùn)練數(shù)據(jù)替代。注意,在計(jì)算圖中,你可以用feed_dict來(lái)替代任何張量,并不僅限于替換占位符。評(píng)估模型那么我們的模型性能如何呢?首先讓我們找出那些預(yù)測(cè)正確的標(biāo)簽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)

35、檢測(cè)我們的預(yù)測(cè)是否真實(shí)標(biāo)簽匹配(索引位置一樣表示匹配)。correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)這里返回一個(gè)布爾數(shù)組。為了計(jì)算我們分類的準(zhǔn)確率,我們將布爾值轉(zhuǎn)換為浮點(diǎn)數(shù)來(lái)代表對(duì)、錯(cuò),然后取平均值。例如:True,False,True,True變?yōu)?,0,1,1,計(jì)算出平均值為0.75。accuracy=tf.reduce_mean(tf.cast(correct_prediction,float)最后,我們可以計(jì)算出在測(cè)試數(shù)據(jù)上的準(zhǔn)確率,大概是91%。printaccuracy.eval(feed_dict=x:mni

36、st.test.images,y_:mnist.test.labels)構(gòu)建一個(gè)多層卷積網(wǎng)絡(luò)在MNIST上只有91%正確率,實(shí)在太糟糕。在這個(gè)小節(jié)里,我們用一個(gè)稍微復(fù)雜的模型:卷積神經(jīng)網(wǎng)絡(luò)來(lái)改善效果。這會(huì)達(dá)到大概99.2%的準(zhǔn)確率。雖然不是最高,但是還是比較讓人滿意。權(quán)重初始化為了創(chuàng)建這個(gè)模型,我們需要?jiǎng)?chuàng)建大量的權(quán)重和偏置項(xiàng)。這個(gè)模型中的權(quán)重在初始化時(shí)應(yīng)該加入少量的噪聲來(lái)打破對(duì)稱性以及避免0梯度。由于我們使用的是ReLU神經(jīng)元,因此比較好的做法是用一個(gè)較小的正數(shù)來(lái)初始化偏置項(xiàng),以避免神經(jīng)元節(jié)點(diǎn)輸出恒為0的問(wèn)題(deadneurons)。為了不在建立模型的時(shí)候反復(fù)做初始化操作,我們定義兩個(gè)函數(shù)用

37、于初始化。defweight_variable(shape):initial=tf.truncated_normal(shape,stddev=0.1)returntf.Variable(initial)defbias_variable(shape):initial=tf.constant(0.1,shape=shape)returntf.Variable(initial)卷積和池化TensorFlow在卷積和池化上有很強(qiáng)的靈活性。我們?cè)趺刺幚磉吔??步長(zhǎng)應(yīng)該設(shè)多大?在這個(gè)實(shí)例里,我們會(huì)一直使用vanilla版本。我們的卷積使用1步長(zhǎng)(stridesize),0邊距(paddingsize)的模

38、板,保證輸出和輸入是同一個(gè)大小。我們的池化用簡(jiǎn)單傳統(tǒng)的2x2大小的模板做maxpooling。為了代碼更簡(jiǎn)潔,我們把這部分抽象成一個(gè)函數(shù)。defconv2d(x,W):returntf.nn.conv2d(x,W,strides=1,1,1,1,padding=SAME)defmax_pool_2x2(x):returntf.nn.max_pool(x,ksize=1,2,2,1,strides=1,2,2,1,padding=SAME)第一層卷積現(xiàn)在我們可以開(kāi)始實(shí)現(xiàn)第一層了。它由一個(gè)卷積接一個(gè)maxpooling完成。卷積在每個(gè)5x5的patch中算出32個(gè)特征。卷積的權(quán)重張量形狀是5,5,

39、1,32,前兩個(gè)維度是patch的大小,接著是輸入的通道數(shù)目,最后是輸出的通道數(shù)目。而對(duì)于每一個(gè)輸出通道都有一個(gè)對(duì)應(yīng)的偏置量。W_conv1=weight_variable(5,5,1,32)b_conv1=bias_variable(32)為了用這一層,我們把x變成一個(gè)4d向量,其第2、第3維對(duì)應(yīng)圖片的寬、高,最后一維代表圖片的顏色通道數(shù)(因?yàn)槭腔叶葓D所以這里的通道數(shù)為1,如果是rgb彩色圖,則為3)。x_image=tf.reshape(x,-1,28,28,1)Wethenconvolvex_imagewiththeweighttensor,addthebias,applytheReLU

40、function,andfinallymaxpool.我們把x_image和權(quán)值向量進(jìn)行卷積,加上偏置項(xiàng),然后應(yīng)用ReLU激活函數(shù),最后進(jìn)行maxpooling。h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)h_pool1=max_pool_2x2(h_conv1)第二層卷積為了構(gòu)建一個(gè)更深的網(wǎng)絡(luò),我們會(huì)把幾個(gè)類似的層堆疊起來(lái)。第二層中,每個(gè)5x5的patch會(huì)得到64個(gè)特征。W_conv2=weight_variable(5,5,32,64)b_conv2=bias_variable(64)h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)h_pool2=max_pool_2x2(h_conv2)密集連接層現(xiàn)在,圖片尺寸減小到7x7,我們加入一個(gè)有1024個(gè)神經(jīng)元的全連接層,用于處理整個(gè)圖片。我們把池化層輸出的張量reshape成一些向量,乘上權(quán)重矩陣,加上偏置,然后對(duì)其使用ReLU。W_fc1=weight_variable(7*7*64,1024)b_fc1=bias_varia

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論