tensorflow實現DNN訓練手寫數據集達到98%準確率

項目github地址 DNN-digrecognizer (代碼數據集)若對您有用不妨來個star

手寫數據集來自kaggle競賽digit-recognizer中的數據。

此次訓練的模型為輸入層(784 node)---隱藏層(1層 500 node)---輸出層(10 node)

將訓練集拆成9:1,9成訓練,1成計算準確率

導入庫

import tensorflow as tfnimport numpy as npnimport pandas as pdn

首先對數據進行處理:

  • 使用pandas庫讀取數據

train_data=pd.read_csv("./data/train.csv")n#測試集數據,沒結果,需要將預測的結果提交到kagglentest_data=pd.read_csv("./data/test.csv")nlabels1=train_data.label.valuesnlabels=[]n#將標籤(圖片數字)從訓練集中抽出來nfor i in labels1:n z=np.zeros((1,10))n z[0][i]=1n labels.append(z[0])nnum_data=train_data.shape[0]n#把圖片像素從訓練集中抽出來ntrain_x_=train_data.loc[:,pixel0:].valuesndataSize=train_x_.shape[0]ntest_x=test_data.loc[:,pixel0:].valuesn

  • 將每一張圖片灰度化

def convert2gray(img):n if len(img.shape)>2:n gray=np.mean(img,-1)n return grayn else:n return imgnfor x in train_x_:n x=x.reshape(28,28)n image=convert2gray(x)n image1=image.flatten()/255n train_x.append(image1)n

至此數據已經處理完成

定義前向傳播演算法

#使用滑動平均模型優化權重和偏向ndef inf(x,avgclass,w1,w2,b1,b2):n if avgclass==None:n y1=tf.nn.relu(tf.matmul(x,w1)+b1)n return tf.matmul(y1,w2)+b2n else:n y1=tf.nn.relu(tf.matmul(x,avgclass.average(w1))+avgclass.average(b1))n return tf.matmul(y1,avgclass.average(w2))+avgclass.average(b2)n

數據定義

x=tf.placeholder(tf.float32,shape=[None,784],name=x-input)ny_=tf.placeholder(tf.float32,shape=[None,10],name=y-input)nnw1=tf.Variable(tf.truncated_normal(shape=[784,500],stddev=0.1,dtype=tf.float32))nnw2=tf.Variable(tf.truncated_normal(shape=[500,10],stddev=0.1,dtype=tf.float32))nnb1=tf.Variable(tf.constant(0.1,shape=[500]))nnb2=tf.Variable(tf.constant(0.1,shape=[10]))nnglobal_step=tf.Variable(0,trainable=False)n

學習率指數下降

#可降低梯度下降時梯度搖擺的風險nlearning_rate=tf.train.exponential_decay(learning_rate_base,global_step,dataSize/batch_size,learning_rate_decay,staircase=False)n

計算交叉熵

#l2正則化避免過擬合nentropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y__))+tf.contrib.layers.l2_regularizer(regularization)(w1)+tf.contrib.layers.l2_regularizer(regularization)(w2)n

反向傳播演算法更新參數

train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(entropy,global_step)n

計算準確率

cor=tf.equal(tf.argmax(y_,1),tf.argmax(y,1))naur=tf.reduce_mean(tf.cast(cor,tf.float32))n

訓練模型,並得到測試集的結果

with tf.Session() as sess:n init_op=tf.global_variables_initializer()n sess.run(init_op)n for i in range(5000):n if i%100==0:n auc=sess.run(aur,feed_dict={x:train_x[-100:],y_:labels[-100:]})n print("第{}次,準確率為{}".format(i+100,auc))n start=(i*batch_size)%(dataSize-100)n end=min(start+batch_size,dataSize-100)n sess.run(train_op,feed_dict={x:train_x[start:end],y_:labels[start:end]})nn yy = sess.run(y__, feed_dict={x: test_x})n yl = sess.run(tf.argmax(yy, 1))n wr = open(res.csv, w)n print(ImageId,Label, file=wr)n for i in range(len(yl)):n print(i + 1, yl[i], sep=,, file=wr)n wr.close()n

運行結果

準確率在98%左右,將res.csv數據提交到kaggle上也得到了0.98700 score

項目github地址 DNN-digrecognizer 若對您有用不妨來個star 0__0 0__0 0__0 0__0

0__0 0__0


推薦閱讀:

機器學習:一步一步學習強化學習 例子2
面向普通開發者的機器學習入門
美麗聯合(蘑菇街)業務升級下的機器學習應用
機器學習、大數據與經濟學研究

TAG:深度学习DeepLearning | 机器学习 | Python |