Mnist識別算法
首先載入tensorflow庫,並建立一個新的interactiveSession,使用這個命令會將session註冊爲默認的session,以後的運算也會跑在這個session裏,不一樣session之間的數據和運算應該是相互獨立的,接下來建立一個placeholder,即輸入數據的地方,placeholder的第一個參數是數據類型,第二個參數[None,784]表明Tensor的shape,也就是數據的尺寸,這裏的None表明不限條數的輸入,784表明每條輸入是一個784維的向量。網絡
接下來給softmax 迴歸模型中的weights和bias建立variable對象,variable是存儲模型參數的。不一樣於存儲數據的Tensor一旦使用掉就會消失,variable在模型訓練迭代中時持久化的(好比一直存放在顯存中),他能夠長期存在而且在每輪迭代中被更新。咱們把weights和bias所有初始化爲0,由於模型訓練時會自動學習合適的值,因此對這個簡單模型來講初始值不過重要,不過對於複雜的卷積網絡,循環網絡或者比較深的全鏈接網絡,初始方法就比較重要。W的shape是【784,10】,784是特徵的維數,然後面的10表明有10類,由於Label在one-hot編碼後是10維的向量。session
TensorFlow中的softmax是tf.nn下面的一個函數,tf.nn則包含了大量神經網絡的組件,tf.matmul是TensorFlow中的矩陣乘法函數,咱們使用一行代碼就定義了softmax regression,但他最厲害的地方不是定義公式,而是將forward和backward的內容都自動實現,只要定義好loss,訓練時就會自動求導並進行梯度降低。機器學習
爲了訓練模型,咱們須要定義一個loss function來描述對問題的分類精度,loss越小表明模型的分類結果與真實值的誤差越小。函數
咱們採用常見的隨機梯度降低SGD,TensorFlow就會根據咱們定義的整個流程圖自動求導,並根據反向傳播算法進行訓練,在每一輪迭代時更新參數來減少loss,在後臺TensorFlow會自動添加許多運算操做來實現反向傳播和梯度降低 ,而咱們提供的就是一個封裝好的優化器,只須要在每輪迭代時feed數據給他就好,咱們直接調用tf.train.GradientDescentOptimizer,並設置學習速率爲0.5,優化目標設定爲cross-entropy,獲得進行訓練的操做train-step,固然TensorFlow還有許多其餘的優化器,使用起來也很是方便,只須要修改函數名就能夠學習
下一步使用TensorFlow的全局參數初始化器tf.gloabl_variables_initializer,並執行它的run方法優化
tf.gloabl_variables_initializer().run()編碼
最後一步開始迭代執行訓練操做train_step對這些樣本進行訓練。使用一小部分樣本進行訓練稱爲隨機梯度降低,與每次使用所有樣本的傳統梯度降低相對應,若是每次訓練都使用所有樣本,計算量太大,有時也不容易跳出局部最優。對於大部分機器學習問題,咱們都使用一部分數據進行隨機梯度降低,這種作法絕大多數時候比全樣本訓練的收斂速度快的多spa
如今咱們完成了訓練,接下來對模型的準確率進行驗證,下面代碼中的tf.argmax(y,1)就是求各個預測的數字中機率最大的那一個,tf.argmax(y_,1)則是找樣本的真實數字類別,最後返回計算分類是否正確的操做。對象