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實現一個簡單的機器學習算法
- 定義算法公式,也就是神經網絡的forward是的計算
- 定義loss,選定優化器,並制定優化器優化loss
- 迭代地對數據進行訓練
- 在測試集或驗證集上對準確率進行評測。
注意:
定義各個公式其實只是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