其中訓練集共55000張,測試集共10000張,當爲None時隨機讀取
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手寫數字還原小程序
# -*- 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%左右,