深度學習入門:Tensorflow實戰Digit Recognizer(一)
Tensorflow是當前GitHub上最活躍的機器學習項目,本文是Tensorflow實戰Digit Recognizer系列文章的第一篇,介紹如何在MNIST數據集上快速跑出一個模型。
我們在學習一門新的編程語言的時候,第一個項目都是「Hello word」。MNIST在圖像識別領域的地位正如「Hello world」在程序員心中的地位,本文將手把手教會大家利用Tensorflow實現一個簡單的Softmax回歸模型,快速完成Kaggle的入門賽Digit Recognizer。
1.前言
1.1 Digit Recognizer競賽
Digit Recognizer競賽是Kaggle平台舉辦的新手入門級別的比賽,幫助我們快速入門計算機視覺(CV,Computer Vision)。
比賽用MNIST數據集,MNIST (「Modified National Institute of Standards and Technology」) 是計算機視覺領域非常著名的數據集,收集了大量的手寫數字,參賽者選手需要通過機器學習演算法來識別手寫數字圖片,包括0~9一共10個數字。1.2 Tensorflow簡介
TensorFlow? 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。Google在2015年將Tensorflow開源後,收到業界的追捧而成為當前最為流行的深度學習庫。
Tensorflow的安裝請參考另外一篇文章:深度學習環境搭建。
2.Competition
2.1 數據預處理
正則化
像素點用0~255的數字來表示,為了提高神經網路的優化SGD的準確性,對數據進行正則化處理。train_df = train_df.applymap(lambda x: x/255.0).astype(np.float32)ntest = test.applymap(lambda x: x/255.0).astype(np.float32)n
OneHot編碼
訓練數據集的標籤是0~9的數字,為了方便Softmax分類,調用pandas庫的get_dummies方法轉化為Onehot編碼方式。label = pd.get_dummies(train[label])n
驗證集劃分
將數據集劃分為8:2的訓練集和驗證集。
x_train, x_valid, y_train, y_valid = train_test_split(train_df, label, test_size=0.2, random_state=2017) n
2.2 Tensorflow回歸模型預測MNIST
2.2.1 Softmax回歸模型
定義模型參數
Tensorflow中的Variable表示一個可以修改的張量,可以用於計算輸入值,也可以在計算中被修改。對於Softmax回歸模型中,我們需要定義的權重值w和偏置量b。我們想要784維的輸入像素乘以w得到一個10維的值,所以w的維度是(784,10),b的維度是(10)。
W = tf.Variable(tf.zeros([784,10]))nb = tf.Variable(tf.zeros([10]))n
定義模型變數
Tensorflow中的placeholder表示一個佔位符,我們可以在Tensorflow運行時輸入這個值。我們定義輸入的像素x和輸入的正確標籤y。
x = tf.placeholder("float", [None, 784])ny = tf.placeholder("float", [None,10])n
實現模型
Tensorflow已經實現的很多的運算,我們只需要簡單的一行代碼就可以實現我們的函數。
yhat = tf.nn.softmax(tf.matmul(x,W) + b) n
這行代碼實現的了我們的Softmax函數。
2.2.2 訓練模型
計算Cost Function
我們用交叉熵(cross-entropy),計算損失函數。
cross_entropy = -tf.reduce_sum(y*tf.log(yhat))n
首先計算預測的yhat,用tf.lag(yhat)求對數,再乘上正確的標籤y。最後用tf.reduce_sum計算張量元素的和。
實現反向傳播演算法
Tensorflow訓練演算法非常容易,它對常規的函數已經內置了求導函數,因此可以自動幫我們實現反向傳播演算法。
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)n
我們定義梯度下降演算法來最小化cross_entropy,步長為0.01。
模型訓練
訓練之前初始化全局variables,再以64個訓練樣本為mini-batch,訓練我們的模型。
tf.global_variables_initializer().run()nntrain_size = x_train.shape[0]nbatch = 64nfor i in range(1000):n start = i*batch % train_sizen end = (i+1)*batch % train_size n #print(start, end)n if start > end:n start = 0nn batch_x = x_train[start:end]n batch_y = y_train[start:end] nn sess.run(train_step,feed_dict={x:batch_x,y_:batch_y}) n
模型評估
完成模型訓練後,我們需要對模型的性能進行評估,觀察模型的性能是否符合我們的需求。
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))naccuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))nprint(accuracy.eval({x: x_valid, y_: y_valid})) n
output:0.91
結束語
我們用Tensorflow實現了Softmax回歸模型,並在MNIST數據集上取得約91%的成績。雖然這個成績比傳統的機器學習演算法表現更差,但是,我們對Tensorflow的運行有了一個直觀的認識。在後面的幾篇文章中,我們將用Tensorflow實現更高級的演算法,實現可以商用的演算法,準確高達99.8%。
關注微信公眾號:kaggle數據分析,回復digit獲取完整代碼。
推薦閱讀:
※kaggle小黃車競賽 得分:0.41038
※Kaggle—So Easy!百行代碼實現排名Top 5%的圖像分類比賽
※Zillow簡介(二)如何重構經紀行業的產業鏈?
※用Python下載Kaggle數據
※Titanic: kaggle入門實踐-top10%(附Python代碼)
TAG:Kaggle |