1. 程式人生 > >Tensorflow的mnist資料集(十二)

Tensorflow的mnist資料集(十二)

mnist資料集

mnist資料集是一個TensorFlow的手寫資料集,可以自行下載也可以使用函式下載。

import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets('data/',one_hot=True)

引入包,使用read_data_sets來自動下載,不過可能會出錯,去百度了一下幾乎都出錯的了,所以還是自行下載吧。下載後放到本目錄下的data即可,因為上面第一個引數就是data,代表存的目錄。one_hot = True就是使用01編碼。

這個手寫資料集分為訓練集和測試集,

print(mnist.train.num_examples)
print(mnist.test.num_examples)

num_examples輸出就是數量

資料詳解:

training_images = mnist.train.images

這個是就是得到一個數據集的畫素。這裡的所有圖片都是28x28x1的,也就是寬高都是28,深度是1的。因為都是黑白畫素。使用深度都是一,等於就是把畫素拉長。所以輸出就是這個shape就是[55000 , 784]。

training_label = mnist.train.labels
這個就是一個數據集的一個結果,也就是標籤。如果這個圖片是9,那麼就是最後一個數字了[0,0,0,0,0,0,0,0,0,1],那個是正確的數字,那個才是1。

現在顯示一下mnsit資料集的圖片。

mnist = input_data.read_data_sets('data/',one_hot=True)
training_image = mnist.train.images
training_label = mnist.train.labels
n = 20
curr_img = np.reshape(training_image[n , :] , (28 , 28))
plt.matshow(curr_img , cmap = plt.get_cmap('gray'))
plt.show()

首先是匯入資料集,得到訓練集的圖片樣本和標籤,再把畫素裝換成一個28x28的圖片,之後使用matshow進行顯示。

matshow使用的cmap = plt.get_cmap('gray')

可以看到是28x28的灰度圖

使用mnist完成一個邏輯迴歸的操作:

x = tf.placeholder("float" , [None , 784])
y = tf.placeholder("float" , [None , 10])
w = tf.Variable(tf.zeros([784 , 10]))
b = tf.Variable(tf.zeros([10]))
準備資料,x是float型別,[None , 784]在TensorFlow裡面None就是無窮大的意思,先設定好一個佔位符,使用placeholder佔位,因為w  b不需要佔位,直接設定0就可以,所以可以使用Variable或者constent。
actv = tf.nn.softmax(tf.matmul(x , w) + b)
loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(actv) , reduction_indices=1))
lenght = 0.01
optim = tf.train.GradientDescentOptimizer(lenght).minimize(loss)

actv定義啟用函式,loss得到損失函式,lenght定義學習率,optim使用梯度下降進行優化w b值。優化的過程之前的邏輯迴歸講過。

preds = tf.equal(tf.argmax(actv , axis=1) , tf.argmax(y , axis=1))
accr = tf.reduce_mean(tf.cast(preds , tf.float32))

preds得到預測值,argmax就是找到最大值的索引,索引對比如果不是相同的就返回False,相同返回True。

accr是預測準確度,測試資料的準確率。

bacth_size = 100
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
costs = []
for i in range(100):
    cost = 0
num_batch = int(mnist.train.num_examples/bacth_size)
    for n in range(num_batch):
        train_x , train_y = mnist.train.next_batch(bacth_size)
        feeds = {x : train_x , y : train_y}
        sess.run(optim , feed_dict=feeds)
        cost += sess.run(loss , feed_dict=feeds)/num_batch
    costs.append(cost)
    print(cost)

 在Session裡面執行可以得到結果:


顯示Loss曲線

plt.plot(range(100) , costs)
plt.show()
test_x , test_y = mnist.test.next_batch(bacth_size)
test = {x : test_x , y : test_y}
print(sess.run(accr , feed_dict=test))

可以看到是下降的。

接著試一下測試資料:

print(sess.run(accr , feed_dict=test))