TensorFlow實(shí)現(xiàn)Softmax Regression(回歸)識(shí)別手寫數(shù)字。MNIST(Mixed National Institute of Standards and Technology database),簡(jiǎn)單機(jī)器視覺數(shù)據(jù)集,28X28像素手寫數(shù)字,只有灰度值信息,空白部分為0,筆跡根據(jù)顏色深淺取[0, 1], 784維,丟棄二維空間信息,目標(biāo)分0~9共10類。數(shù)據(jù)加載,data.read_data_sets, 55000個(gè)樣本,測(cè)試集10000樣本,驗(yàn)證集5000樣本。樣本標(biāo)注信息,label,10維向量,10種類one-hot編碼。訓(xùn)練集訓(xùn)練模型,驗(yàn)證集檢驗(yàn)效果,測(cè)試集評(píng)測(cè)模型(準(zhǔn)確率、召回率、F1-score)。
算法設(shè)計(jì),Softmax Regression訓(xùn)練手寫數(shù)字識(shí)別分類模型,估算類別概率,取概率最大數(shù)字作模型輸出結(jié)果。類特征相加,判定類概率。模型學(xué)習(xí)訓(xùn)練調(diào)整權(quán)值。softmax,各類特征計(jì)算exp函數(shù),標(biāo)準(zhǔn)化(所有類別輸出概率值為1)。y = softmax(Wx+b)。
NumPy使用C、fortran,調(diào)用openblas、mkl矩陣運(yùn)算庫(kù)。TensorFlow密集復(fù)雜運(yùn)算在Python外執(zhí)行。定義計(jì)算圖,運(yùn)算操作不需要每次把運(yùn)算完的數(shù)據(jù)傳回Python,全部在Python外面運(yùn)行。
import tensor flow as tf,載入TensorFlow庫(kù)。less = tf.InteractiveSession(),創(chuàng)建InteractiveSession,注冊(cè)為默認(rèn)session。不同session的數(shù)據(jù)、運(yùn)算,相互獨(dú)立。x = tf.placeholder(tf.float32, [None,784]),創(chuàng)建Placeholder 接收輸入數(shù)據(jù),第一參數(shù)數(shù)據(jù)類型,第二參數(shù)代表tensor shape 數(shù)據(jù)尺寸。None不限條數(shù)輸入,每條輸入為784維向量。
tensor存儲(chǔ)數(shù)據(jù),一旦使用掉就會(huì)消失。Variable在模型訓(xùn)練迭代中持久化,長(zhǎng)期存在,每輪迭代更新。Softmax Regression模型的Variable對(duì)象weights、biases 初始化為0。模型訓(xùn)練自動(dòng)學(xué)習(xí)合適值。復(fù)雜網(wǎng)絡(luò),初始化方法重要。w = tf.Variable(tf.zeros([784, 10])),784特征維數(shù),10類。Label,one-hot編碼后10維向量。
Softmax Regression算法,y = tf.nn.softmax(tf.matmul(x, W) + b)。tf.nn包含大量神經(jīng)網(wǎng)絡(luò)組件。tf.matmul,矩陣乘法函數(shù)。TensorFlow將forward、backward內(nèi)容自動(dòng)實(shí)現(xiàn),只要定義好loss,訓(xùn)練自動(dòng)求導(dǎo)梯度下降,完成Softmax Regression模型參數(shù)自動(dòng)學(xué)習(xí)。
定義loss function描述問題模型分類精度。Loss越小,模型分類結(jié)果與真實(shí)值越小,越精確。模型初始參數(shù)全零,產(chǎn)生初始loss。訓(xùn)練目標(biāo)是減小loss,找到全局最優(yōu)或局部最優(yōu)解。cross-entropy,分類問題常用loss function。y預(yù)測(cè)概率分布,y'真實(shí)概率分布(Label one-hot編碼),判斷模型對(duì)真實(shí)概率分布預(yù)測(cè)準(zhǔn)確度。cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))。定義placeholder,輸入真實(shí)label。tf.reduce_sum求和,tf.reduce_mean每個(gè)batch數(shù)據(jù)結(jié)果求均值。
定義優(yōu)化算法,隨機(jī)梯度下降SGD(Stochastic Gradient Descent)。根據(jù)計(jì)算圖自動(dòng)求導(dǎo),根據(jù)反向傳播(Back Propagation)算法訓(xùn)練,每輪迭代更新參數(shù)減小loss。提供封裝優(yōu)化器,每輪迭代feed數(shù)據(jù),TensorFlow在后臺(tái)自動(dòng)補(bǔ)充運(yùn)算操作(Operation)實(shí)現(xiàn)反向傳播和梯度下降。train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)。調(diào)用tf.train.GradientDescentOptimizer,設(shè)置學(xué)習(xí)速度0.5,設(shè)定優(yōu)化目標(biāo)cross-entropy,得到訓(xùn)練操作train_step。
tf.global_variables_initializer().run()。TensorFlow全局參數(shù)初始化器tf.golbal_variables_initializer。
batch_xs,batch_ys = mnist.train.next_batch(100)。訓(xùn)練操作train_step。每次隨機(jī)從訓(xùn)練集抽取100條樣本構(gòu)成mini-batch,feed給 placeholder,調(diào)用train_step訓(xùn)練樣本。使用小部分樣本訓(xùn)練,隨機(jī)梯度下降,收斂速度更快。每次訓(xùn)練全部樣本,計(jì)算量大,不容易跳出局部最優(yōu)。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmzx(y_,1)),驗(yàn)證模型準(zhǔn)確率。tf.argmax從tensor尋找最大值序號(hào),tf.argmax(y,1)求預(yù)測(cè)數(shù)字概率最大,tf.argmax(y_,1)找樣本真實(shí)數(shù)字類別。tf.equal判斷預(yù)測(cè)數(shù)字類別是否正確,返回計(jì)算分類操作是否正確。
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)),統(tǒng)計(jì)全部樣本預(yù)測(cè)正確度。tf.cast轉(zhuǎn)化correct_prediction輸出值類型。
print(accuracy.eval({x: mnist.test.images,y_: mnist.test.labels}))。測(cè)試數(shù)據(jù)特征、Label輸入評(píng)測(cè)流程,計(jì)算模型測(cè)試集準(zhǔn)確率。Softmax Regression MNIST數(shù)據(jù)分類識(shí)別,測(cè)試集平均準(zhǔn)確率92%左右。
TensorFlow 實(shí)現(xiàn)簡(jiǎn)單機(jī)器算法步驟:
1?定義算法公式,神經(jīng)網(wǎng)絡(luò)forward計(jì)算。
2?定義loss,選定優(yōu)化器,指定優(yōu)化器優(yōu)化loss。
3?迭代訓(xùn)練數(shù)據(jù)。
4?測(cè)試集、驗(yàn)證集評(píng)測(cè)準(zhǔn)確率。
定義公式只是Computation Graph,只有調(diào)用run方法,feed數(shù)據(jù),計(jì)算才執(zhí)行。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print(mnist.train.images.shape, mnist.train.labels.shape)
print(mnist.test.images.shape, mnist.test.labels.shape)
print(mnist.validation.images.shape, mnist.validation.labels.shape)
import tensorflow as tf
sess = tf.InteractiveSession()
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)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
tf.global_variables_initializer().run()
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
train_step.run({x: batch_xs, y_: batch_ys})
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}))
參考資料:
《TensorFlow實(shí)戰(zhàn)》
歡迎付費(fèi)咨詢(150元每小時(shí)),我的微信:qingxingfengzi