TensorFlow入門開發(fā)之MNIST機器學習入門_第1頁
TensorFlow入門開發(fā)之MNIST機器學習入門_第2頁
TensorFlow入門開發(fā)之MNIST機器學習入門_第3頁
TensorFlow入門開發(fā)之MNIST機器學習入門_第4頁
TensorFlow入門開發(fā)之MNIST機器學習入門_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

當我們開始學習編程的時候,第一件事往往是學習打印”HelloWorld”。就好比編程入門有HelloWorld,機器學習入門有MNIST。MNIST是一個入門級的計算機視覺數(shù)據(jù)集,它包含各種手寫數(shù)字圖片:它也包含每一張圖片對應(yīng)的標簽,告訴我們這個是數(shù)字幾。比如,上面這四張圖片的標簽分別是5,0,4,1。在此教程中,我們將訓練一個機器學習模型用于預測圖片里面的數(shù)字。我們的目的不是要設(shè)計一個世界一流的復雜模型一盡管我們會在之后給你源代碼去實現(xiàn)一流的預測模型一而是要介紹下如何使用TensorFlow。所以,我們這里會從一個很簡單的數(shù)學模型開始,它叫做SoftmaxRegression。對應(yīng)這個教程的實現(xiàn)代碼很短,而且真正有意思的內(nèi)容只包含在三行代碼里面。但是,去理解包含在這些代碼里面的設(shè)計思想是非常重要的:TensorFlow工作流程和機器學習的基本概念。因此,這個教程會很詳細地介紹這些代碼的實現(xiàn)原理。MNIST數(shù)據(jù)集MNIST數(shù)據(jù)集的官網(wǎng)是YannLeCun'swebsite。在這里,我們提供了一份python源代碼用于自動下載和安裝這個數(shù)據(jù)集。你可以下載這份代碼,然后用下面的代碼導入到你的項目里面,也可以直接復制粘貼到你的代碼文件里面。importinput_datamnist=input_data.read_data_sets(〃MNIST_data/〃,one_hot=True)下載下來的數(shù)據(jù)集被分成兩部分:60000行的訓練數(shù)據(jù)集(mnist.train)和10000行的測試數(shù)據(jù)集(mnist.test)。這樣的切分很重要,在機器學習模型設(shè)計時必須有一個單獨的測試數(shù)據(jù)集不用于訓練而是用來評估這個模型的性能,從而更加容易把設(shè)計的模型推廣到其他數(shù)據(jù)集上(泛化)。正如前面提到的一樣,每一個MNIST數(shù)據(jù)單元有兩部分組成:一張包含手寫數(shù)字的圖片和一個對應(yīng)的標簽。我們把這些圖片設(shè)為“xs”,把這些標簽設(shè)為“ys”。訓練數(shù)據(jù)集和測試數(shù)據(jù)集都包含xs和ys,比如訓練數(shù)據(jù)集的圖片是mnist.train.images,訓練數(shù)據(jù)集的標簽是mnist.train.labels。每一張圖片包含28像素X28像素。我們可以用一個數(shù)字數(shù)組來表示這張圖片:

nnnn□[}□HD0□Q□□H0&0000000&nn□n□..i4□Q□□Hnn□&□?『I4□Q□□&0&000:■」0000&0U0004||40000&Q0□H0。|40D00D0Q000『|4□D□00。。。0G■■0D000-。GQ。Q?!觥?DOOD-0D000■>I.10□0D。GQ。Q01.1DOOD-0D00000000□0D。GQ。Q0&D0D00D-我們把這個數(shù)組展開成一個向量,長度是28x28=784。如何展開這個數(shù)組(數(shù)字間的順序)不重要,只要保持各個圖片采用相同的方式展開。從這個角度來看,MNIST數(shù)據(jù)集的圖片就是在784維向量空間里面的點,并且擁有比較復雜的結(jié)構(gòu)(提醒:此類數(shù)據(jù)的可視化是計算密集型的)。展平圖片的數(shù)字數(shù)組會丟失圖片的二維結(jié)構(gòu)信息。這顯然是不理想的,最優(yōu)秀的計算機視覺方法會挖掘并利用這些結(jié)構(gòu)信息,我們會在后續(xù)教程中介紹。但是在這個教程中我們忽略這些結(jié)構(gòu),所介紹的簡單數(shù)學模型,softmax回歸(softmaxregression),不會利用這些結(jié)構(gòu)信息。因此,在MNIST因此,在MNIST訓練數(shù)據(jù)集中,mnist.train.images是一個形狀為[60000,784]的張量,第一個維度數(shù)字用來索引圖片,第二個維度數(shù)字用來索引每張圖片中的像素點。在此張量里的每一個元素,都表示某張圖片里的某個像素的強度值,值介于0和1之間。相對應(yīng)的MNIST數(shù)據(jù)集的標簽是介于0到9的數(shù)字,用來描述給定圖片里表示的數(shù)字。為了用于這個教程,我們使標簽數(shù)據(jù)是"one-hotvectors"。一個one-hot向量除了某一位的數(shù)字是1以外其余各維度數(shù)字都是0。所以在此教程中,數(shù)字n將表示成一個只有在第n維度(從0開始)數(shù)字為1的10維向量。比如,標簽0將表示成([1,0,0,0,0,0,0,0,0,0,0])。因此,mnist.train.labels是一個[60000,10]的數(shù)字矩陣。mnist.train.ys60000現(xiàn)在,我們準備好可以開始構(gòu)建我們的模型啦!Softmax回歸介紹我們知道MNIST的每一張圖片都表示一個數(shù)字,從0到9。我們希望得到給定圖片代表每個數(shù)字的概率。比如說,我們的模型可能推測一張包含9的圖片代表數(shù)字9的概率是80%但是判斷它是8的概率是5%(因為8和9都有上半部分的小圓),然后給予它代表其他數(shù)字的概率更小的值。這是一個使用softmax回歸(softmaxregression)模型的經(jīng)典案例。softmax模型可以用來給不同的對象分配概率。即使在之后,我們訓練更加精細的模型時,最后一步也需要用softmax來分配概率。softmax回歸(softmaxregression)分兩步:第一步為了得到一張給定圖片屬于某個特定數(shù)字類的證據(jù)(evidence),我們對圖片像素值進行加權(quán)求和。如果這個像素具有很強的證據(jù)說明這張圖片不屬于該類,那么相應(yīng)的權(quán)值為負數(shù),相反如果這個像素擁有有利的證據(jù)支持這張圖片屬于這個類,那么權(quán)值是正數(shù)。下面的圖片顯示了一個模型學習到的圖片上每個像素對于特定數(shù)字類的權(quán)值。紅色代表負數(shù)權(quán)值,藍色代表正數(shù)權(quán)值。HillTOC\o"1-5"\h\z\o"CurrentDocument"01234Hill\o"CurrentDocument"56789我們也需要加入一個額外的偏置量(bias),因為輸入往往會帶有一些無關(guān)的干擾量。因此對于給定的輸入圖片x它代表的是數(shù)字i的證據(jù)可以表示為:\o"CurrentDocument"evidence,=+如其中II?-代表權(quán)重,"代表數(shù)字i類的偏置量,j代表給定圖片X的像素索引用于像素求和。然后用softmax函數(shù)可以把這些證據(jù)轉(zhuǎn)換成概率y:y=softmax(evidence)這里的softmax可以看成是一個激勵(activation)函數(shù)或者鏈接(link)函數(shù),把我們定義的線性函數(shù)的輸出轉(zhuǎn)換成我們想要的格式,也就是關(guān)于10個數(shù)字類的概率分布。因此,給定一張圖片,它對于每一個數(shù)字的吻合度可以被softmax函數(shù)轉(zhuǎn)換成為一個概率值。softmax函數(shù)可以定義為:softmax(j?)=normalize)展開等式右邊的子式,可以得到:

但是更多的時候把softmax模型函數(shù)定義為前一種形式:把輸入值當成幕指數(shù)求值,再正則化這些結(jié)果值。這個幕運算表示,更大的證據(jù)對應(yīng)更大的假設(shè)模型(hypothesis)里面的乘數(shù)權(quán)重值。反之,擁有更少的證據(jù)意味著在假設(shè)模型里面擁有更小的乘數(shù)系數(shù)。假設(shè)模型里的權(quán)值不可以是0值或者負值。Softmax然后會正則化這些權(quán)重值,使它們的總和等于1,以此構(gòu)造一個有效的概率分布。(更多的關(guān)于Softmax函數(shù)的信息,可以參考MichaelNieslen的書里面的這個部分,其中有關(guān)于softmax的可交互式的可視化解釋。)對于softmax回歸模型可以用下面的圖解釋,對于輸入的xs對于softmax回歸模型可以用下面的圖解釋,對于輸入的xs加權(quán)求和,再分別加上一個偏置量,最后再輸入到softmax函數(shù)中:如果把它寫成一個等式,我們可以得到:softmax‘噬+險”+覽眄+|甘|阻仍+陽物softmax‘噬+險”+覽眄+|甘|阻仍+陽物+阮3奶+訪|J//L.優(yōu)3*3+的"3+他3版+||我們也可以用向量表示這個計算過程:用矩陣乘法和向量相加。這有助于提高計算效率。(也是一種更有效的思考方式)更進一步,可以寫成更加緊湊的方式:y=softmax(rTj?+6)實現(xiàn)回歸模型為了用python實現(xiàn)高效的數(shù)值計算,我們通常會使用函數(shù)庫,比如NumPy,會把類似矩陣乘法這樣的復雜運算使用其他外部語言實現(xiàn)。不幸的是,從外部計算切換回Python的每一個操作,仍然是一個很大的開銷。如果你用GPU來進行外部計算,這樣的開銷會更大。用分布式的計算方式,也會花費更多的資源用來傳輸數(shù)據(jù)。TensorFlow也把復雜的計算放在python之外完成,但是為了避免前面說的那些開銷,它做了進一步完善。Tensorflow不單獨地運行單一的復雜計算,而是讓我們可以先用圖描述一系列可交互的計算操作,然后全部一起在Python之外運行。(這樣類似的運行方式,可以在不少的機器學習庫中看到。)使用TensorFlow之前,首先導入它:importtensorflowastf我們通過操作符號變量來描述這些可交互的操作單元,可以用下面的方式創(chuàng)建一個:x=tf.placeholder(〃float〃,[None,784])x不是一個特定的值,而是一個占位符placeholder,我們在TensorFlow運行計算時輸入這個值。我們希望能夠輸入任意數(shù)量的MNIST圖像,每一張圖展平成784維的向量。我們用2維的浮點數(shù)張量來表示這些圖,這個張量的形狀是[None,784]。(這里的None表示此張量的第一個維度可以是任何長度的。)我們的模型也需要權(quán)重值和偏置量,當然我們可以把它們當做是另外的輸入(使用占位符),但TensorFlow有一個更好的方法來表示它們:Variable。一個Variable代表一個可修改的張量,存在在TensorFlow的用于描述交互性操作的圖中。它們可以用于計算輸入值,也可以在計算中被修改。對于各種機器學習應(yīng)用,一般都會有模型參數(shù),可以用Variable表示。W=tf.Variable(tf.zeros([784,10]))b=tf.Variable(tf.zeros([10]))我們賦予tf.Variable不同的初值來創(chuàng)建不同的Variable:在這里,我們都用全為零的張量來初始化W和b。因為我們要學習W和b的值,它們的初值可以隨意設(shè)置。注意,W的維度是[784,10],因為我們想要用784維的圖片向量乘以它以得到一個10維的證據(jù)值向量,每一位對應(yīng)不同數(shù)字類。b的形狀是[10],所以我們可以直接把它加到輸出上面?,F(xiàn)在,我們可以實現(xiàn)我們的模型啦。只需要一行代碼!y=tf.nn.softmax(tf.matmul(x,W)+b)首先,我們用tf.matmul(X,W)表示x乘以W,對應(yīng)之前等式里面的H.「,這里x是一個2維張量擁有多個輸入。然后再加上b,把和輸入到tf.nn.softmax函數(shù)里面。至此,我們先用了幾行簡短的代碼來設(shè)置變量,然后只用了一行代碼來定義我們的模型。TensorFlow不僅僅可以使softmax回歸模型計算變得特別簡單,它也用這種非常靈活的方式來描述其他各種數(shù)值計算,從機器學習模型對物理學模擬仿真模型。一旦被定義好之后,我們的模型就可以在不同的設(shè)備上運行:計算機的CPU,GPU,甚至是手機!訓練模型為了訓練我們的模型,我們首先需要定義一個指標來評估這個模型是好的。其實,在機器學習,我們通常定義指標來表示一個模型是壞的,這個指標稱為成本(cost)或損失(loss),然后盡量最小化這個指標。但是,這兩種方式是相同的。一個非常常見的,非常漂亮的成本函數(shù)是"交叉熵”(cross-entropy)。交叉熵產(chǎn)生于信息論里面的信息壓縮編碼技術(shù),但是它后來演變成為從博弈論到機器學習等其他領(lǐng)域里的重要技術(shù)手段。它的定義如下:凡小)=一Y祁]%(婦y是我們預測的概率分布,y'是實際的分布(我們輸入的one-hotvector)o比較粗糙的理解是,交叉熵是用來衡量我們的預測用于描述真相的低效性。更詳細的關(guān)于交叉熵的解釋超出本教程的范疇,但是你很有必要好好理解它。為了計算交叉熵,我們首先需要添加一個新的占位符用于輸入正確值:y_=tf.placeholder(〃float〃,[None,10])然后我們可以用計算交叉熵:cross_entropy=-tf.reduce_sum(y_*tf.log(y))首先,用tf.log計算y的每個元素的對數(shù)。接下來,我們把y_的每一個元素和tf.log(y_)的對應(yīng)元素相乘。最后,用tf.reduce_sum計算張量的所有元素的總和。(注意,這里的交叉熵不僅僅用來衡量單一的一對預測和真實值,而是所有100幅圖片的交叉熵的總和。對于100個數(shù)據(jù)點的預測表現(xiàn)比單一數(shù)據(jù)點的表現(xiàn)能更好地描述我們的模型的性能。現(xiàn)在我們知道我們需要我們的模型做什么啦,用TensorFlow來訓練它是非常容易的。因為TensorFlow擁有一張描述你各個計算單元的圖,它可以自動地使用反向傳播算法(backpropagationalgorithm)來有效地確定你的變量是如何影響你想要最小化的那個成本值的。然后,TensorFlow會用你選擇的優(yōu)化算法來不斷地修改變量以降低成本。train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)在這里,我們要求TensorFlow用梯度下降算法(gradientdescentalgorithm)以0.01的學習速率最小化交叉熵。梯度下降算法(gradientdescentalgorithm)是一個簡單的學習過程,TensorFlow只需將每個變量一點點地往使成本不斷降低的方向移動。當然TensorFlow也提供了其他許多優(yōu)化算法:只要簡單地調(diào)整一行代碼就可以使用其他的算法。TensorFlow在這里實際上所做的是,它會在后臺給描述你的計算的那張圖里面增加一系列新的計算操作單元用于實現(xiàn)反向傳播算法和梯度下降算法。然后,它返回給你的只是一個單一的操作,當運行這個操作時,它用梯度下降算法訓練你的模型,微調(diào)你的變量,不斷減少成本。現(xiàn)在,我們已經(jīng)設(shè)置好了我們的模型。在運行計算之前,我們需要添加一個操作來初始化我們創(chuàng)建的變量:init=tf.initialize_all_variables()現(xiàn)在我們可以在一個Session里面啟動我們的模型,并且初始化變量:sess=tf.Session()sess.run(init)然后開始訓練模型,這里我們讓模型循環(huán)訓練1000次!foriinrange(1000):batch_xs,batch_ys=mnist.train.next_batch(100)sess.run(train_step,feed_dict=(x:batch_xs,y_:batch_ys})該循環(huán)的每個步驟中,我們都會隨機抓取訓練數(shù)據(jù)中的100個批處理數(shù)據(jù)點,然后我們用這些數(shù)據(jù)點作為參數(shù)替換之前的占位符來運行train_step。使用一小部分的隨機數(shù)據(jù)來進行訓練被稱為隨機訓練(stochastictraining)-在這里更確切的說是隨機梯度下降訓練。在理想情況下,我們希望用我們所有的數(shù)據(jù)來進行每一步的訓練,因為這能給我們更好的訓練結(jié)果,但顯然這需要很大的計算開銷。所以,每一次訓練我們可以使用不同的數(shù)

溫馨提示

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

評論

0/150

提交評論