深度學習|tensorflow識別手寫字型

我們依舊以MNIST手寫字型資料集,來看看我們如何使用tensorflow來實現MLP。
資料
資料下載
這裡我們通過tensorflow的模組,來下載資料集。
import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
這樣,我們就下載了資料集,這裡的one_hot的意思是label為獨熱編碼,也就是說我們的label就不需要預處理了。
資料情況
我們通過下面程式碼看看資料的情況:
- 55000訓練集
- 5000驗證集
- 10000測試集

MLP模型
之前我們使用過keras進行訓練,只需要建立一個model,然後add加入神經網路層。tensorflow是要複雜很多,那我們一步步構建我們的模型吧。
- 首先是輸入層,我們用placeholder來輸入
- 隱含層256個神經元
- 輸出10個神經元
def layer(output_dim,input_dim,inputs, activation=None): W = tf.Variable(tf.random_normal([input_dim, output_dim])) b = tf.Variable(tf.random_normal([1, output_dim])) XWb = tf.matmul(inputs, W) + b if activation is None: outputs = XWb else: outputs = activation(XWb) return outputs x = tf.placeholder("float", [None, 784]) h1=layer(output_dim=256,input_dim=784, inputs=x ,activation=tf.nn.relu) y_predict=layer(output_dim=10,input_dim=256, inputs=h1,activation=None)
定義損失函式
這裡我們需要自己定義函式,並進行優化處理。
y_label = tf.placeholder("float", [None, 10]) loss_function = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits (logits=y_predict , labels=y_label)) optimizer = tf.train.AdamOptimizer(learning_rate=0.001) \ .minimize(loss_function)
準確性評價
correct_prediction = tf.equal(tf.argmax(y_label, 1), tf.argmax(y_predict, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
訓練
訓練我們定義15輪。
trainEpochs = 15 batchSize = 100 totalBatchs = int(mnist.train.num_examples/batchSize) epoch_list=[];loss_list=[];accuracy_list=[] from time import time startTime=time() sess = tf.Session() sess.run(tf.global_variables_initializer()) for epoch in range(trainEpochs): for i in range(totalBatchs): batch_x, batch_y = mnist.train.next_batch(batchSize) sess.run(optimizer,feed_dict={x: batch_x,y_label: batch_y}) loss,acc = sess.run([loss_function,accuracy], feed_dict={x: mnist.validation.images, y_label: mnist.validation.labels}) epoch_list.append(epoch);loss_list.append(loss) accuracy_list.append(acc) print("Train Epoch:", '%02d' % (epoch+1), "Loss=", \ "{:.9f}".format(loss)," Accuracy=",acc) duration =time()-startTime print("Train Finished takes:",duration)

測試加預測
