標籤:

深度學習入門: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 |