1. 程式人生 > >TensorFlow學習筆記(一)-- Softmax迴歸模型識別MNIST

TensorFlow學習筆記(一)-- Softmax迴歸模型識別MNIST

最近學習Tensorflow,特此筆記,學習資料為21個專案玩轉深度學習 基於TensorFlow的實踐詳解
Softmax迴歸是一個線性的多分類模型,它是從Logistic迴歸模型轉化而來的,不同的是Logistic迴歸模型是一個二分類模型,而Softmax迴歸模型是一個多分類模型

Softmax函式將模型對於各個類別的預測值轉化為概率,假設模型在三個類別上的預測值分別為(a, b, c),則運用Softmax函式之後的概率值分別為(e^a/(e^a+e^b+e^c), e^b/(e^a+e^b+e^c), e^c/(e^a+e^b+e^c))

上程式碼:

#coding=utf-8
#匯入tensorflow import tensorflow as tf #匯入MNIST教學模組 from tensorflow.examples.tutorials.mnist import input_data #讀入MNIST資料 mnist = input_data.read_data_sets("MNIST_data", one_hot=True) # 建立x,x是一個佔位符(placeholder),代表待識別的圖片 x = tf.placeholder(tf.float32, [None,784]) # W是softmax模型的引數,將一個784的輸入轉為10維的輸出 W = tf.Variable
(tf.zeros([784, 10])) # b是另一個引數,一般叫做偏置(bias) b = tf.Variable(tf.zeros([10])) #y表示模型的輸出 y = tf.nn.softmax(tf.matmul(x, W) + b) #y_是實際的影象標籤,同樣以佔位符表示 # y_ = tf.placeholder(tf.float32, [None, 10]) y_ = tf.placeholder(tf.float32, [None,10]) #現在,我們得到了兩個重要的Tensor:y and y_ #y是模型的輸出,y_是影象是實際標籤,y_是獨熱表示的 # 根據y和y_構造交叉熵損失
cross_entropy = \ tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y))) #定義損失之後,就可以用梯度下降法對模型的引數(W and b)進行優化 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) #建立一個session 只有在session中才能執行優化步驟train_step sess = tf.InteractiveSession() #執行之前必須要初始化所有變數,分配記憶體 tf.global_variables_initializer().run() #進行1000步梯度下降 for _ in range(1000): # 在mnist.train中取100個數據 # batch_xs是形狀為(100, 784)的影象資料,batch_ys是形如(100,10)的實際標籤 # batch_xs, batch_ys對應著兩個佔位符x and y batch_xs, batch_ys = mnist.train.next_batch(100) # 在session中執行train_step,執行時要傳入佔位符的值 sess.run(train_step, feed_dict={x:batch_xs, y_:batch_ys}) # 正確的預測結果 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) # 計算預測準確率,它們都是tensor accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 在Session中執行Tensor可以得到Tensor的值 # 這裡獲取最終模型的準確率 print(sess.run(accuracy, feed_dict={x:mnist.test.images, y_:mnist.test.labels }))

執行環境:Windows10 64bit, Python3.6.4 64bit, TensorFlow1.7.0 cpu version

解釋幾個函式:


tf.argmax(input, axis=None, name=None, dimension=None)
此函式是對矩陣按行或列計算最大值

引數
input:輸入Tensor
axis:0表示按列,1表示按行
name:名稱
dimension:和axis功能一樣,預設axis取值優先。新加的欄位
返回:Tensor 一般是行或列的最大值下標向量


tf.cast(x, dtype, name=None)
x: 輸入Tensor
dtype: 要轉化的型別
name: 名稱
返回:轉化成dtype型別的Tensor


tf.reduce_mean(input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None, keep_dims=None)
功能:求均值
input_tensor:輸入Tensor
axis:0表示按列,1表示按行


tf.equal(x, y)
判斷兩個輸入Tensor x, y 是否相等,返回值為相同維度的布林值Tensor
關於TensorFlow的佔位符,變數以及會話,參考部落格Tensorflow入門—-佔位符、常量和Session