TensorFlow 訓練 MNIST (1)—— softmax 單層神經網路
阿新 • • 發佈:2018-12-12
1、MNIST資料集簡介
首先通過下面兩行程式碼獲取到TensorFlow內建的MNIST資料集:
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('./data/mnist', one_hot=True)
MNIST資料集共有55000(mnist.train.num_examples)張用於訓練的資料,對應的有55000個標籤;共有10000(mnist.test.num_examples)張用於測試的圖片的資料,同樣的有10000個標籤與之對應。為了方便訪問,這些圖片或標籤的資料都是被格式化了的。
MNIST資料集的訓練資料集(mnist.train.images)是一個 55000 * 784 的矩陣,矩陣的每一行代表一張圖片(28 * 28 * 1)的資料,圖片的資料範圍是 [0, 1],代表畫素點灰度歸一化後的值。
訓練集的標籤(mnist.train.labels)是一個55000 * 10 的矩陣,每一行的10個數字分別代表對應的圖片屬於數字0到9的概率,範圍是0或1。一個標籤行只有一個是1,表示該圖片的正確數字是對應的下標值, 其餘是0。
測試集與訓練集的類似,只是資料量不同。
以下程式碼顯示部分MNIST訓練圖片的形狀及標籤:
import numpy as np importmatplotlib.pyplot as plot from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('./data/mnist', one_hot=True) trainImages = mnist.train.images trainLabels = mnist.train.labels plot.figure(1, figsize=(4, 3)) for i in range(6): curImage = np.reshape(trainImages[i, :], (28, 28)) curLabel= np.argmax(trainLabels[i, :]) ax = plot.subplot(int(str(23) + str(i+1))) plot.imshow(curImage, cmap=plot.get_cmap('gray')) plot.axis('off') ax.set_title(curLabel) plot.suptitle('MNIST') plot.show()
上述程式碼輸出的MNIST圖片及其標籤:
2、通過單層神經網路進行訓練
1 def train(trainCycle=50000, debug=False): 2 inputSize = 784 3 outputSize = 10 4 batchSize = 64 5 inputs = tf.placeholder(tf.float32, shape=[None, inputSize]) 6 7 # x * w = [64, 784] * [784, 10] 8 weights = tf.Variable(tf.random_normal([784, 10], 0, 0.1)) 9 bias = tf.Variable(tf.random_normal([outputSize], 0, 0.1)) 10 outputs = tf.add(tf.matmul(inputs, weights), bias) 11 outputs = tf.nn.softmax(outputs) 12 13 labels = tf.placeholder(tf.float32, shape=[None, outputSize]) 14 15 loss = tf.reduce_mean(tf.square(outputs - labels)) 16 optimizer = tf.train.GradientDescentOptimizer(0.1) 17 trainer = optimizer.minimize(loss) 18 19 sess = tf.Session() 20 sess.run(tf.global_variables_initializer()) 21 for i in range(trainCycle): 22 batch = mnist.train.next_batch(batchSize) 23 sess.run([trainer, loss], feed_dict={inputs: batch[0], labels: batch[1]}) 24 25 if debug and i % 1000 == 0: 26 corrected = tf.equal(tf.argmax(labels, 1), tf.argmax(outputs, 1)) 27 accuracy = tf.reduce_mean(tf.cast(corrected, tf.float32)) 28 accuracyValue = sess.run(accuracy, feed_dict={inputs: batch[0], labels: batch[1]}) 29 print(i, ' train set accuracy:', accuracyValue) 30 31 # 測試 32 corrected = tf.equal(tf.argmax(labels, 1), tf.argmax(outputs, 1)) 33 accuracy = tf.reduce_mean(tf.cast(corrected, tf.float32)) 34 accuracyValue = sess.run(accuracy, feed_dict={inputs: mnist.test.images, labels: mnist.test.labels}) 35 print("accuracy on test set:", accuracyValue) 36 37 sess.close()
3、訓練結果
上述模型的最終輸出為:
由列印日誌可以看出,前期收斂速度很快,後期開始波動。最後該模型在訓練集上的正確率大概為90%,測試集上也差不多。精度還是比較低的,說明單層的神經網路在處理圖片資料上存在著很大的缺陷,並不是一個很好的選擇。