# 手寫數字識別 ----Softmax迴歸模型 # regression
import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data data = input_data.read_data_sets("/tmp/data/", one_hot=True) # 獲取數據 mnist是一個輕量級的類,其中以Numpy數組的形式中存儲着訓練集、驗證集、測試集。
# 一個對手寫數字進行識別的模型。 # 思路: # 一、將訓練集中獲取的手寫數字圖像進行某一統一方式(所有按行或所有按列)的展開, # 獲得一個長向量(這是爲了利用softmax作一維的迴歸,不過損失了二維信息), # 用一個二維張量來索引某一個樣本中的某一像素。 # 二、softmax模型:用來給不一樣的對象分配機率(即便在更精細的模型中,最後一步,每每也須要用softmax來分配機率) # 兩步: # ① 加權求和,並引入偏置 # 對於給定輸入圖片x,其表明圖像爲數字i的證據爲 # evidencei =∑i(wi, jxj) + bi # evidence_i =∑_i(w_{i, j}x_j)+b_ievidencei=∑i(wi, jxj) + bi # ② 用softmax函數將evidence轉換成機率,即 # y = softmax(evidence) # y = softmax(evidence) # y = softmax(evidence) # 將輸入值當成冪指數求值,再正則化這些結果 # 更緊湊的寫法爲 # y = softmax(Wx + b) # y = softmax(Wx + b) # y = softmax(Wx + b) # 三、爲了節省在python外使用別的語言進行復雜矩陣運算帶來的開銷,TensorFlow作出的優化爲,先用圖描述一系列可交互的操做,最後統一放在python外執行。 # 用佔位符placeholder來描述這些可交互的單元: # --------------------- # 做者:Crystal # 來源:CSDN # 原文:https: // blog.csdn.net / weixin_43226400 / article / details / 82749769 # 版權聲明:本文爲博主原創文章,轉載請附上博文連接!
#http://www.cnblogs.com/rgvb178/p/6052541.html 相關說明 # Softmax Regression Model Softmax迴歸模型
def regression(x): W = tf.Variable(tf.zeros([784, 10]), name="W") b = tf.Variable(tf.zeros([10]), name="b") y = tf.nn.softmax(tf.matmul(x, W) + b) # print(y)
return y, [W, b] # model 聲明佔位符
with tf.variable_scope("regression"): x = tf.placeholder(tf.float32, [None, 784]) y, variables = regression(x) # 用交叉熵(cross - entropy)來評判模型的好壞,其表達式爲 # Hy′(y) =−∑iy′ilog(yi) # 其中y是預測的機率分佈,y’是實際的機率分佈(即訓練集對應的真實標籤,是一個one - hotvector)定義
# train 開始訓練模型
y_ = tf.placeholder("float", [None, 10]) # 計算交叉熵
cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) # tensorflow能夠自動利用反向傳播算法,根據選擇的優化器來最小化你的目標函數
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) # tf.argmax給出對象在某一維度上最大值所對應的索引值,能夠用來判斷預測是否準確,即
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) # equal函數返回布爾值,用cast函數轉化爲浮點數後求均值來計算正確率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) saver = tf.train.Saver(variables) with tf.Session() as sess: # 初始化操做
sess.run(tf.global_variables_initializer()) for _ in range(10000): batch_xs, batch_ys = data.train.next_batch(100) # 此爲隨機梯度降低訓練,每次訓練隨機抓取訓練集中的100個數據做爲一個batch
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # 計算學習到的模型在訓練集上的準確率
print(sess.run(accuracy, feed_dict={x: data.test.images, y_: data.test.labels})) # 保存訓練結果
# print(os.path.join(os.path.dirname(__file__), 'data', 'regression.ckpt'))
# //絕對路徑包含中文字符可能致使路徑不可用 相對路徑:'mnist/data/regression.ckpt'
path = saver.save( sess, 'mnist/data/regression.ckpt', write_meta_graph=False, write_state=False) print("Saved:", path) # path = saver.save(
# sess, os.path.join(os.path.dirname(__file__), 'mnist\data', 'regression.ckpt'),write_meta_graph=False, write_state=False)
# print("Saved:", path) write_meta_graph=False, write_state=False)
print("Saved:", path) # path = saver.save(
# sess, os.path.join(os.path.dirname(__file__), 'mnist\data', 'regression.ckpt'),write_meta_graph=False, write_state=False)
# print("Saved:", path)