TensorFlow實例(4)--MNIST簡介及手寫數字分類算法

MNIST 是Tensoflow提供的一個入門級的計算機視覺數據集,分爲兩部分(訓練集和測試集

其中訓練集共55000張,測試集共10000張,當爲None時隨機讀取 



每一張圖又包含兩部分,就稱爲x與y吧
x是一個長度爲784的數組,每個元素都是0-1之間的數值,784等於28*28,相當於一個28*28的點陣圖
y是一個長度爲10的數組,每個元素是0或1,當y中第N個元素爲1時,表示x這個點陣圖所對應的就是N
如[0,0,1,0,0,0,0,0,0,0] 表示爲 2


在Tensoflow提供的這個實例中,使用的是softmax 迴歸模型,歸屬於神經網絡的一種算法,

如果對具體的模型數理算法感興趣可以上網找找,本文不做詳細介紹

這個模型計算MNIST最終的正確率大約在91%左右,並不是十分理想,但貴在簡單,代碼也不多

做爲TensorFlow的基礎篇,目的並不是學習如果使用高深的模型,可是理解如何使用TensorFlow


關於神經網絡的基本原理,可以參考  機器學習(1)--神經網絡初探

如果你看到上面784=28*28還是暈暈的,可以先看看 TensorFlow的MNIST手寫數字還原小程序

點擊此處下載Mnist數據包


# -*- coding:utf-8 -*- 
import tensorflow as tf 
import tensorflow.examples.tutorials.mnist.input_data as input_data
import random

#讀取mnist數據,下載後的Mnist並解壓後,放在項目的同級目錄下,通過下面程序即可讀取
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

#x_data,y_data爲傳入量(如果對傳入量不瞭解可參考我別的文章)在後面使用的意義是:
#在訓練時,None表示從訓練集中取得一張圖表(x_data),及圖表的值(y_data)
#在測試評估模型時,None表示整個測試集合
x_data = tf.placeholder("float", [None, 784]) 
y_data = tf.placeholder("float", [None,10]) 


W = tf.Variable(tf.zeros([784,10]))      #神經網絡的Weight的預設值,
b = tf.Variable(tf.zeros([10]))          #biase偏差爲一個有10個元素的

'''
下面一句用處就是利用 softmax模型,計算y值,在後面y值是來和實際值y_data進行比對用的
softmax 迴歸模型 可以用來給不同的對象分配概率,如果對具體的模型數理算法感興趣可以上網找找,這裏不做介紹
下面這句也就是神經網絡的一個應用,通過圖片x_data,自己算出一個y,不斷修正Weight,
這裏只簡單畫畫三個變量矩陣乘法 
x_data,是一行784列的數據,W是784行10列的數據,利用矩陣乘法

                                [w0_1,  w1_1,  w2_1,  w3_1,  w4_1,  w5_1,  w6_1,  w7_1,  w8_1,  w9_1  ]
x_data=[x1,x2,x3...,x784]   *     ...
                                [w0_784,w1_784,w2_784,w3_784,w4_784,w5_784,w6_784,w7_784,w8_784,w9_784]

=[b1,b2,b3...,b10],經過  softmax 計算後,得到y,然後再與y_data比對,修正Weight,
'''
y = tf.nn.softmax(tf.matmul(x_data,W) + b) 


loss = -tf.reduce_sum(y_data*tf.log(y))#計算y值與y_的loss
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss) #通過不斷的神經網絡訓練修正Weight


with  tf.Session() as sess:
    sess.run(tf.initialize_all_variables())    
    for i in range(1000):
        #取得一張圖片並做爲傳入量,經過1000循環調正Weights
        tmpX, tmpY = mnist.train.next_batch(100)
        sess.run(train, feed_dict={x_data: tmpX, y_data: tmpY})

    
    #以下三句用入是評估模型
    #1、y_data一定是0和1組成的數字,這裏比較實際與計算值是否相同
    prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_data,1)) 
    
    #2、prediction返回的是True或False,tf.cast(prediction, "float")將這個轉爲浮點型True爲1,最後會得到[1,0,1,0,...]
    #tf.reduce_mean對所有的值求平均值
    accuracy = tf.reduce_mean(tf.cast(prediction, "float")) 
    
    #3、上述測試結果,即這整個[1,0,1,0,...] 數組長度即爲測試集合的長度
    print( sess.run(accuracy, feed_dict={x_data: mnist.test.images, y_data: mnist.test.labels}))

    #最後結果應該是在91%左右,



發佈了46 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章