一、資料集介紹

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、結果輸出又是怎麼樣的呢?

.