TensorFlow 實現Softmax Regression識別手寫數字

TensorFlow 實現Softmax Regression識別手寫數字

1.數據準備

1.1.圖像是28像素*28像素大小的灰度圖片,即每個樣本又784維特徵(28*28 = 784);故丟棄圖像的二維結構信息 ,圖片變成一個很長的1維向量。空間結構信息,將在卷積神經網絡被使用

1.2 訓練數據特徵 :55000*784 第一維度 是圖片編號;第二維度是圖片中像素點編號。

1.3 數字0~9的one-hot編碼:每個數字的one-hot編碼就是等價於Label(標籤)。[1,0,0,0,0,0,0,0,0]對應數字1.

2. 設計算法

2.1 Softmax Regression算法: 模型對一張圖片進行預測時,Softmax Regression會對每一種類別估算一個概率:取概率最大的那個數字作爲模型的輸出

2.2 處理多分類任務,通常使用Softmax Regression 模型。Softmax Regression工作原理:將可以判定爲某類的特徵相加,然後將這些特徵轉化爲判定是這一類的概率。

2.3 特徵獲取 :對所有像素一個加權和,而權重是模型根據數據自動學習,訓練出來的。比如某個像素的灰度值大代表很可能是數字n時候,這個像素的權重就很大。

2.4 特徵公式:

1》i代表第i類,j代表一張圖片的第j個像素。bi是bias。

2》對所有特徵計算softmax:

對各個類的特徵求exp函數,然後對它們標準化,使得和爲1,特徵的值越大的類,最後輸的概率也越大。

2.5 計算過程可視化

連線變成公式:

將元素相乘變成矩陣乘法:

簡寫 成公式:

 

2.6 Tensorflow 實現Softmax Regression.

1>

sess = tf.InteractiveSession()
x = tf.placeholder(tf.float32,[None,784])

sess = tf.InteractiveSession()
x = tf.placeholder(tf.float32,[None,784])

InteractiveSeesion():會將這個Session註冊爲默認的Session,之後的運算也默認跑在這個session,不同session之間的的數據和運算都是相互獨立的。

Placeholder():輸入數據的地方。參數1:數據類型,參數2:[None,784]代表tensor的shape,也就是數據的尺寸。None: 代表不限條數的輸入,784代表每條輸入是一個784維的向量。

2》創建weights和bias的Variable對象

Variable作用:存儲模型參數

Variable特點: 在模型迭代中是持久化的,可以長期存在並且在每輪迭代中被更新。存儲數據的tensor一旦使用就會消失掉

Variable初始化 :weights,bias全部初始化爲0,因爲模型訓練時會自定學習合適的值,所以對該模型來說初始值不重要。但是,對複雜的卷積網絡,或者比較深的全連接網絡,初始化的方法比較重要

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

W的shape是[784,10],784是特徵的維數,10代表有10類

3》Softmax公式實現:

y = tf.nn.softmax(tf.matmul(x,W)+b)

y = tf.nn.softmax(tf.matmul(x,W)+b)

代碼解析:

>tf.nn 包含大量的神經網絡的組件

>tf.matmul()是Tensorflow中的矩陣乘法函數

>Tensorflow代碼與公式很像。Tensorflow最厲害的地方還不是定義公式,而是將forward 和 backward的內容都自動實現(無論CPU,GPU),只要接下來定義好loss,訓練將會自定求導並進行梯度下降。

4》定義loss function

loss作用: loss越小,代表模型的分類結果與真實值得偏差越小,模型越準確。

訓練的目的: 不斷將loss減小,直到達到一個全局最優或者局部最優解。

Loss function : cross-entropy(交叉熵),作用:用它來判斷模型對真實概率分佈估計的準確程度。

y是預測的概率分佈, 是真實的概率分佈(Label的one-hot編碼)。  

5》cross-entropy(交叉熵)的tensorflow代碼實現

y_ = tf.placeholder(tf.float32,[None,10])
 

c

y_ = tf.placeholder(tf.float32,[None,10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

ross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

》代碼解析

Placeholder(),輸入是真實的label,用來計算cross-entropy,代碼y_*tf.log(y)對應公式中  。

>tf.reduce_sum() 對飲求和  

>tf.reduce_sum() 對每個batch數據結果求平均值。

6》定義優化算法

>採用隨機梯度下降SGD(Stochastic Gradient Descent)

>Tensorflow 運行解析: 定義好優化算法後,Tensorflow就可以更具我 們定義的整個計算圖(前面定義的各個公式已經自動構成計算圖)自動求導,並根據反向傳播(BP,Back Propagation)算法進行訓練,在每一輪迭代時候更新參數來減小loss.

7》優化算法 Tensorflow代碼實現:

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

tf.global_varibles_initializer().run()

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
tf.global_varibles_initializer().run()

代碼解析:

>Tensorflow給我們提供一個封裝好的優化器,只需要每輪迭代是feed數據給優化器-》tr.train.GradientDescentOptimizer()

>tr.train.GradientDescentOptimizer() 參數:是學習速率

>minmize() :是優化目標的設定

>tf.global_variables_initializer().run()

是Tensorflow的全局參數初始化器,並直接執行他的run()

8》迭代執行訓練操作train_step

根據本次實驗目標,每次都隨機從訓練集中抽取100條樣構成一個mini-batch,並feed給placeholder,然後調用train_step對這些樣本進行訓練。

特點分析:使用一小部分樣本進行訓練成爲隨機梯度下降,與每次使用全部樣本的傳統的梯度下降對應。如果每次訓練都使用全部樣本,計算量太大,有時候也不容跳出局部最優。對於大部分機器學習問題,我們都使用一小部分數據進行隨機梯度下降,比全樣本訓練隊額收斂速度快很多。

9》迭代執行訓練操作train_step代碼實現;

for i in range(1000):
    batch_xs,batch_ys = mnist.train.next_batch(100)
    train_step.sun({x: batch_xs, y_: batch_ys})

for i in range(1000):
    batch_xs,batch_ys = mnist.train.next_batch(100)
    train_step.sun({x: batch_xs, y_: batch_ys})

10》對模型的準確率進行驗證

>1 . 求各個預測的數字中概率最大的那一個

>2.  找樣本的真實數字類別

>3.  判斷預測的數字類別是否就是正確的類別

代碼實現:

correct_predcorrect_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))iction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))

correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))

11》統計全部樣本預測的accuracey

accuracy = tf.reduce_

mean(tf.cast(correct_prediction, tf.float32))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

>tf.cast() :數據類型轉換

12》測試數據的特徵 和 Label 輸入評測流程 accuracy,計算模型在測試集上的準確率。

總結

使用Tensorflow實現一個簡單的機器學習算法

  1. 定義算法公式,也就是神經網絡的forward是的計算
  2. 定義loss,選定優化器,並制定優化器優化loss
  3. 迭代地對數據進行訓練
  4. 在測試集或驗證集上對準確率進行評測。

注意:

定義各個公式其實只是Computation Graph ,在執行代碼時,計算還沒有實際發生,只有等調用run方法,並feed數據時候,計算才真正執行。

比如5》cross_entropy,7》train_step,11》accuracy等都是圖中的節點,而並不是數據結果,可以通過調用run()執行這些節點或者運算操作來獲取結果。

 

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# 1. load data
mnist = input_data.read_data_sets("E:/1.Download_Software/MNIST_data/",one_hot=True)
#E:/1.Download_Software/MNIST_data
#print(mnist.train.images.shape,mnist.train.labels.shape)
sess = tf.InteractiveSession()
x = tf.placeholder(tf.float32,[None,784])

#2. initialize weights bias
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

#3.  y = softamx(Wx+b)
y = tf.nn.softmax(tf.matmul(x,W)+b)

#4. loss-function: cross-entropy
y_ = tf.placeholder(tf.float32,[None,10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

#5. optimization algorithm
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

tf.global_variables_initializer().run()

#6. iterate train_step
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    train_step.run({x: batch_xs, y_: batch_ys})

#7. accuracy verification
correct_prediction = tf.equal(tf.argmax(y, 1),tf.argmax(y_, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval({x: mnist.test.images, y_:mnist.test.labels}))












 

運行結果:0.9184

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章