用TensorFlow輕鬆識別手寫數字

用TensorFlow輕鬆識別手寫數字

ADDOPS團隊籍鑫璞 360雲計算 算法

女主宣言

該文章出自於ADDOPS團隊,經過上一篇《三分鐘讀懂tensorflow》,相信你們對tensorflow的核心概念以及編程模式有了有了必定的瞭解,今天該文章將結合一個手寫數字識別(MNIST)模型來進一步瞭解tensorflow的使用。但願能激發起你們的一些興趣.
PS:豐富的一線技術、多元化的表現形式,盡在「HULK一線技術雜談」,點關注哦!編程

MNIST簡介

學習一門編程語言,都是從最基本的「hello world」開始的,做爲一個編程模式,tensorflow也有本身的「hello world」--MNIST。它是計算機視覺的最基礎且最多見的數據集,由70000張28像素28像素的手寫數字組成,每一個圖片對應一個標籤,分別是0~9之間的一個數字。這70000個樣本包含55000個訓練樣本,10000個測試樣本以及5000個驗證樣本。咱們隨機選取了該數據集中的四個樣本,以下圖,它們對應的標籤分別是5,0,4和1。
用TensorFlow輕鬆識別手寫數字
你們知道,電腦識別圖片是從最基本的單元--像素開始的,爲了將上面的手寫數字轉換成電腦可以識別的信號,咱們引入灰度概念,將28
28個像素點轉換成灰度值(0到1區間內的一個值)。下圖是將標籤爲1的圖片轉換成28乘以28的矩陣。
用TensorFlow輕鬆識別手寫數字
數字用來索引圖片,第二個維度數字用來索引每張圖片中的像素點。同時,訓練的數據將是一個55000*10的張量,第一個維度數字用來索引圖片,第二個維度是label的向量。好比數字0,對應的label就是[1,0,0,0,0,0,0,0,0,0]。
這篇文章的主要任務是創建一個模型,可以識別手寫的數字圖片,獲得0~9之間的值,即進行分類。目前實現MNIST模型有不少種,有的準確率超過90%以上,可是咱們須要從最簡單的Softmax Regression來開始。機器學習

Softmax Regression模型

使用模型:Softmax Regression介紹

咱們知道MNIST的每一張圖片都表示一個數字,從0到9。咱們但願獲得給定圖片表明每一個數字的機率。好比說,咱們的模型可能推測一張包含9的圖片表明數字9的機率是80%可是判斷它是其餘數字的機率比80%的機率要低。softmax模型能夠用來給不一樣的對象分配機率,即便在以後,咱們訓練更加精細的模型時,最後一步也須要用softmax來分配機率。
Softmax Regression的工做原理很簡單,將特徵相加,而後將這些特徵轉化爲斷定是這類的機率。好比,某個像素的灰度值大表明極可能是數字n時,這個像素的權值就會很大;相反,若是不太多是n,則權重有多是負數。
咱們能夠將這些特徵寫出以下的公式,i表明第i類(0到9的值),j表明一張圖片的第j個像素,bi是一個偏差項。
用TensorFlow輕鬆識別手寫數字
獲得全部像素的和之後,咱們用softmax函數能夠把這些證據轉換成機率y。
用TensorFlow輕鬆識別手寫數字
咱們將獲得某個圖片標籤是0到9的機率值,咱們取機率值最大的標籤,即爲該圖片表示的數字。編程語言

實現模型

接下來咱們用tensorflow來實現一個softmax regression。在tensorflow中,定義一個softmax模型比較簡單,只須要下面五行。ide

import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)

訓練模型

爲了訓練咱們的模型,咱們首先須要定義一個指標來評估這個模型是好的。其實,在機器學習,咱們一般定義指標來表示一個模型是壞的,這個指標稱爲成本(cost)或損失(loss),而後儘可能最小化這個指標。
一個很是常見的成本函數是「交叉熵」(cross-entropy)。交叉熵產生於信息論裏面的信息壓縮編碼技術,可是它後來演變成爲從博弈論到機器學習等其餘領域裏的重要技術手段。它的定義以下:
用TensorFlow輕鬆識別手寫數字
其中,y 是咱們預測的機率分佈, y' 是實際的分佈。
tensorflow中定義「交叉熵」也比較容易,代碼以下:函數

y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))

如今咱們有了算法softmax regression,又有了損失函數cross-entropy的定義,只須要定義一個優化算法便可開始訓練。咱們採用常見的「隨機梯度降低」來定義該優化方法,也比較容易,代碼以下:學習

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

最後,咱們須要定義一個會話來運行上面的計算圖,代碼以下:測試

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

總結

本篇文章介紹瞭如何使用tensorflow來構建SoftMax Regression模型,從而實現對MNIST數據集的識別,但願對tensorflow的使用有個簡單的認識。接下來,咱們將更深刻的介紹tensorflow,但願您持續關注系列文章。優化

相關文章
相關標籤/搜索