介紹tensorflow
入門MNIST
![]()
Google開源架構之MNIST入門 Google開源架構之MNIST入門
人眼直接看圖檔直接就可以知道數字為多少,我們的任務就是讓計算機能夠看懂數字。
那麼你就可以像下面的代碼一樣使用該腳本
這段代碼作用将資料集分為訓練集和測試集,分别為60000與10000。
這裡我引用極客學院的關于這個回歸的介紹:
我們知道MNIST的每一張圖檔都表示一個數字,從0到9。我們希望得到給定圖檔代表每個數字的機率。比如說,我們的模型可能推測一張包含9的圖檔代表數字9的機率是80%但是判斷它是8的機率是5%(因為8和9都有上半部分的小圓),然後給予它代表其他數字的機率更小的值。
這是一個使用softmax回歸(softmax regression)模型的經典案例。softmax模型可以用來給不同的對象配置設定機率。即使在之後,我們訓練更加精細的模型時,最後一步也需要用softmax來配置設定機率。
softmax回歸(softmax regression)分兩步:第一步
為了得到一張給定圖檔屬于某個特定數字類的證據(evidence),我們對圖檔像素值進行權重求和。如果這個像素具有很強的證據說明這張圖檔不屬于該類,那麼相應的權值為負數,相反如果這個像素擁有有利的證據支援這張圖檔屬于這個類,那麼權值是正數。
evidencei=∑jWi, jxj+bi
然後将所求得的和進行機率統計。
y=softmax(evidence)
根據機率最大的值就很可能能為對應的标簽。
softmax(x)=normalize(exp(x))
展開
softmax(x)i=exp(xi)∑jexp(xj)
我們根據矩陣,可以将其展開成:
最後,更一般的:
将其寫成一般化數學公式為:
y=softmax(Wx+b)
現在到了我們實作的步驟了,tensorflow提供了大量的數值計算的庫,準确的來說,并不是數值計算,而是符号計算,對于符号計算,我也是剛剛才了解這種符号化計算方式。連google最新的支援的API是python的,是以當時決定學習python作為腳本語言是明智的選擇,臭美中。。。
首先我們先導入該架構:
接下來,我們通過操作符号變量來描述這些可互動的操作單元,可以用下面的方式建立一個:
x不是一個特定的值,而是一個占位符placeholder,我們在TensorFlow運作計算時輸入這個值。我們希望能夠輸入任意數量的MNIST圖像,每一張圖展平成784維的向量。我們用2維的浮點數張量來表示這些圖,這個張量的形狀是[None,784 ]。(這裡的None表示此張量的第一個次元可以是任何長度的。 )
我們的模型也需要權重值和偏置量,當然我們可以把它們當做是另外的輸入(使用占位符),但TensorFlow有一個更好的方法來表示它們:Variable 。 一個Variable代表一個可修改的張量,存在在TensorFlow的用于描述互動性操作的圖中。它們可以用于計算輸入值,也可以在計算中被修改。對于各種機器學習應用,一般都會有模型參數,可以用Variable表示。
現在,我們可以實作我們的模型啦。隻需要一行代碼!
首先,我們用tf.matmul(X,W)表示x乘以W,對應之前等式裡面的(Wx),這裡x是一個2維張量擁有多個輸入。然後再加上b,把和輸入到tf.nn.softmax函數裡面。
對于接觸過機器學習的同學來說,交叉熵作為損失評估是再也常見不過了
Hy′(y)=−∑iy′ilog(yi)
為了計算交叉熵,我們首先需要添加一個新的占位符用于輸入正确值:
下面我們就用上面的代碼建構訓練算法,這裡使用了反向傳播算法,對于算法的細節我們不需要了解太多,我們首先會使用即可。
現在,我們已經設定好了我們的模型。在運作計算之前,我們需要添加一個操作來初始化我們建立的變量:
現在我們可以在一個Session裡面啟動我們的模型,并且初始化變量:
然後開始訓練模型,這裡我們讓模型循環訓練1000次!
訓練模型已經完成,那我們怎麼知道該模型的好壞呢?
首先讓我們找出那些預測正确的标簽。tf.argmax 是一個非常有用的函數,它能給你在一個張量裡沿着某條軸的最高條目的索引值。比如,tf.argmax(y,1) 是模型認為每個輸入最有可能對應的那些标簽,而 tf.argmax(y_,1) 代表正确的标簽。 我們可以用 tf.equal 來檢測我們的預測是否真實标簽比對。
最後将正确率輸出:
最後在我的阿裡雲伺服器上得到的結果為91.8%,看起來不是特别好,别着急,我們接下來會使用卷積神經網絡來構模組化型。
學會了使用tensorflow建構簡單的淺層網絡,并将整個淺層網絡搭建起來,并将代碼放在github中。接下來使用卷積神經網絡。