3、TensorFlow實現Softmax迴歸識別手寫數字
一、資料集介紹
55000個訓練集、10000個測試集、5000個驗證集。
手寫數字圖片28*28畫素,從二維結構轉化為一維(後面章節使用卷積神經網路會利用空間結構)=784維特徵。
0到9共10維label特徵。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
二、多分類任務演算法選擇
SoftMax Regression演算法原理(略)
簡單點說,每個樣本都要算10個類的概率,選最高者。 類比到神經網路,是沒有隱藏層的最淺的神經網路。
三、四個步驟
1、定義演算法公式,也就是神經網路forward時的計算
2、定義loss,選定優化器,並指定優化器優化loss
3、迭代地對資料進行訓練
4、在測試集熵對準確率進行評測。
四、程式碼
五、補充import tensorflow as tf sess = tf.InteractiveSession() #之後的運算預設在這個session裡面跑。 # 匯入資料集 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) # 變數初始化 x = tf.placeholder(tf.float32,[None,784]) w = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) y_ = tf.placeholder(tf.float32,[None,10]) # 真實數字類別 # 定義假設函式計算公式,tensorflow會自動計算forward和backward方法。 y = tf.nn.softmax(tf.matmul(x,w)+b) # 定義損失函式公式 資訊熵 cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices = [1])) # 定義優化演算法 SGD學習速率 0.5 train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) #引數初始化 tf.global_variables_initializer().run() #迭代執行訓練操作 for i in range(1000): # 迭代次數1000 batch_xs, batch_ys = mnist.train.next_batch(100) # 選全部樣本計算量太大,只使用一小部分資料進行隨機梯度下降。 sess.run(train_step, feed_dict={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,"float")) #將結果轉換為浮點數 sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) #輸出
TensorFlow和Spark類似,我們定義的各個公式(cross_entropy、train_step、accuracy)其實只是計算圖,在執行程式碼時,計算還沒發生,只有等呼叫run方法並feed資料時,才真正執行。
雖然準確率有92%,但是線上利用還差的很遠。事實上,我們加個隱含層可達98%;引入卷積層、池化層後,可達99%;而目前基於卷積神經網路的state-of-the-art的方法已經可以達到99.8%的正確率。
六、思考
1、資料集支援其他格式嗎?或者可以轉化為該形式嗎?
2、結果輸出又是怎麼樣的呢?