1. 程式人生 > >tensorflow-mnist訓練(一:只有全連線網路)

tensorflow-mnist訓練(一:只有全連線網路)

mnist資料集首先下載好,在根目錄下建立一個資料夾(MNIST_data),把下載好的mnist資料集儲存在MNIST_data中,注意下載的mnist不用解壓,程式會自動解壓

下面程式碼包含:

一:網路結構只有全連線,比較簡單

二:能得到測試集的精確度,大約為百分之91

三:能夠儲存模型 

import tensorflow as tf
#載入資料集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#one_hot引數指將資料轉成one_hot形式,如手寫數字是0-9,若為0 ,則轉為10維資料[1,0,0,0,0,0,0,0,0,0]。
#通過上兩句程式碼,能夠自動解壓整理資料集
#例如把訓練集的所有影象的畫素點序列化,並與影象數量組成二維矩陣
#分為六類,分別是train(又分images和labels類),validation,test
print("訓練集影象的尺寸:",mnist.train.images.shape)  # (55000, 784)
print("訓練集標籤的尺寸:",mnist.train.labels.shape)  # (55000, 10)
print("驗證集影象的尺寸:",mnist.validation.images.shape)  # (5000, 784)
print("驗證集標籤的尺寸:",mnist.validation.labels.shape)  # (5000, 10)
print("測試集影象的尺寸:",mnist.test.images.shape)  # (10000, 784)
print("測試集標籤的尺寸:",mnist.test.labels.shape)  # (10000, 10)


#設定引數
x = tf.placeholder("float", [None, 784])
# x 不是一個特定的值,而是一個佔位符 placeholder ,我們在TensorFlow執行計算時輸入這個值。
# 我們希望能夠輸入任意數量的MNIST影象,每一張圖展平成784維的向量。我們用2維的浮點數張量來表示這些圖,
# 這個張量的形狀是 [None,784 ] 。(這裡的 None 表示此張量的第一個維度可以是任何長度的。)
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#我們的模型也需要權重值和偏置量,當然我們可以把它們當做是另外的輸入(使用佔位符),
#但TensorFlow有一個更好的方法來表示它們: Variable  。 一個 Variable 代表一個可修改的張量,
#存在在TensorFlow的用於描述互動性操作的圖中。它們可以用於計算輸入值,也可以在計算中被修改。
#W 的維度是[784,10],因為我們想要用784維的圖片向量乘以它以得到一個10維的證據值向量,每一位對應不同數字類。
# b 的形狀是[10],所以我們可以直接把它加到輸出上面。

#softmax迴歸:softmax模型可以用來給不同的物件分配概率
y = tf.nn.softmax(tf.matmul(x,W) + b)


#交叉熵定義為損失函式
#為了計算交叉熵,我們首先需要新增一個新的佔位符用於輸入正確值:
#行數無限的,列數我們預先知道
y_ = tf.placeholder("float", [None,10])

#然後計算交叉熵:y是預測概率分佈,y_是實際概率分佈
# tf.reduce_sum  計算張量的所有元素的總和
cross_entropy = -tf.reduce_sum(y_*tf.log(y)) #reduce_sum損失值的和

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#在這裡,我們要求TensorFlow用梯度下降演算法(gradient descent algorithm)以0.01的學習速率最小化交叉熵
#因為TensorFlow擁有一張描述你各個計算單元的圖,它可以自動地使用反向傳播演算法(backpropagation algorithm)來
#有效地確定你的變數是如何影響你想要最小化的那個成本值的


saver = tf.train.Saver()#儲存或者讀取模型


#現在我們可以在一個Session會議裡面啟動我們的模型:

with tf.Session() as sess:
    #在執行計算之前,我們需要新增一個操作來初始化我們建立的變數
    sess.run(tf.initialize_all_variables())
    #然後開始訓練模型,這裡我們讓模型迴圈訓練1000次!
    for i in range(1000):
      batch_xs, batch_ys = mnist.train.next_batch(100)
      #隨機取batch_xs為100個訓練圖片,batch_ys為100個對應的標籤
      sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})


    #評估我們的模型 
    #首先讓我們找出那些預測正確的標籤.tf.argmax是一個非常有用的函式,它能給出某個tensor物件在某一維上的其資料最大值所在的索引值。
    #由於標籤向量是由0,1組成,因此最大值1所在的索引位置就是類別標籤,
    #比如 tf.argmax(y,1) 返回的是模型對於任一輸入x預測到的標籤值,
    #而  tf.argmax(y_,1)  代表正確的標籤,
    #我們可以用  tf.equal  來檢測我們的預測是否真實標籤匹配(索引位置一樣表示匹配)。
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

    #這行程式碼會給我們一組布林值。為了確定正確預測項的比例,我們可以把布林值轉換成浮點數,然後取平均值。
    #例如, [True, False, True, True]  會變成  [1,0,1,1]  ,取平均值後得到  0.75 .
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))


    #最後,我們計算所學習到的模型在測試資料集上面的正確率。
    print ("準確率",sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

    save_path = saver.save(sess,"save/model")