TensorFlow實現Softmax迴歸模型,tensorflowsoftmax

來源:互聯網
上載者:User

TensorFlow實現Softmax迴歸模型,tensorflowsoftmax

一、概述及完整代碼

對MNIST(MixedNational Institute of Standard and Technology database)這個非常簡單的機器視覺資料集,Tensorflow為我們進行了方便的封裝,可以直接載入MNIST資料成我們期望的格式.本程式使用Softmax Regression訓練手寫數字識別的分類模型.

先看完整代碼:

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data  mnist = input_data.read_data_sets("MNIST_data", one_hot=True) print(mnist.train.images.shape, mnist.train.labels.shape) print(mnist.test.images.shape, mnist.test.labels.shape) print(mnist.validation.images.shape, mnist.validation.labels.shape)  #構建計算圖 x = tf.placeholder(tf.float32, [None, 784]) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.nn.softmax(tf.matmul(x, W) + b) y_ = tf.placeholder(tf.float32, [None, 10]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)  #在會話sess中啟動圖 sess = tf.InteractiveSession() #建立InteractiveSession對象 tf.global_variables_initializer().run() #全域參數初始化器 for i in range(1000):  batch_xs, batch_ys = mnist.train.next_batch(100)  train_step.run({x: batch_xs, y_: batch_ys})  #測實驗證階段 #沿著第1條軸方向取y和y_的最大值的索引並判斷是否相等 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) #轉換bool型tensor為float32型tensor並求平均即得到正確率 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels})) 

二、詳細解讀

首先看一下使用TensorFlow進行演算法設計訓練的核心步驟

1.定義演算法公式,也就是神經網路forward時的計算;

2.定義loss,選定最佳化器,並制定最佳化器最佳化loss;

3.在訓練集上迭代訓練演算法模型;

4.在測試集或驗證集上對訓練得到的模型進行準確率評測.

首先建立一個Placeholder,即輸入張量資料的地方,第一個參數是資料類型dtype,第二個參數是tensor的形狀shape.接下來建立SoftmaxRegression模型中的weights(W)和biases(b)的Variable對象,不同於儲存資料的tensor一旦使用掉就會消失,Variable在模型訓練迭代中是持久存在的,並且在每輪迭代中被更新Variable初始化可以是常量或隨機值.接下來實現模型演算法y = softmax(Wx + b),TensorFlow語言只需要一行代碼,tf.nn包含了大量神經網路的組件,頭tf.matmul是矩陣乘法函數.TensorFlow將模型中的forward和backward的內容都自動實現,只要定義好loss,訓練的時候會自動求導並進行梯度下降,完成對模型參數的自動學習.定義損失函數lossfunction來描述分類精度,對於多分類問題通常使用cross-entropy交叉熵.先定義一個placeholder輸入真實的label,tf.reduce_sum和tf.reduce_mean的功能分別是求和和求平均.構造完損失函數cross-entropy後,再定義一個最佳化演算法即可開始訓練.我們採用隨機梯度下降SGD,定義好後TensorFlow會自動添加許多運算操作來實現反向傳播和梯度下降,而給我們提供的是一個封裝好的最佳化器,只需要每輪迭代時feed資料給它就好.設定好學習率.

構造階段完成後, 才能啟動圖. 啟動圖的第一步是建立一個 Session 對象或InteractiveSession對象, 如果無任何建立參數, 會話構造器將啟動預設圖.建立InteractiveSession對象會這個Session註冊為預設的Session,之後的運算也預設跑在這個Session裡面,不同Session之間的資料和運算應該是相互獨立的.下一步使用TensorFlow的全域參數初始化器tf.global_variables_initializer病直接執行它的run方法(這個全域參數初始化器應該是1.0.0版本中的新特性,在之前0.10.0版本測試不通過).

至此,以上定義的所有公式其實只是Computation Graph,代碼執行到這時,計算還沒有實際發生,只有等調用run方法並feed資料時計算才真正執行.

隨後一步,就可以開始迭代地執行訓練操作train_step.這裡每次都從訓練集中隨機抽取100條樣本構成一個mini-batch,並feed給placeholder.

完成迭代訓練後,就可以對模型的準確率進行驗證.比較y和y_在各個測試樣本中最大值所在的索引,然後轉換為float32型tensor後求平均即可得到正確率.多次測試後得到在測試集上的正確率為92%左右.還是比較理想的結果.

三、其他補充

1.Sesssion類和InteractiveSession類

對於product =tf.matmul(matrix1, matrix2),調用 sess 的 'run()' 方法來執行矩陣乘法 op, 傳入 'product' 作為該方法的參數.上面提到, 'product' 代表了矩陣乘法 op 的輸出, 傳入它是向方法表明, 我們希望取回矩陣乘法 op 的輸出.整個執行過程是自動化的, 會話負責傳遞op 所需的全部輸入. op 通常是並發執行的.函數調用 'run(product)' 觸發了圖中三個 op (兩個常量 op 和一個矩陣乘法 op)的執行.傳回值 'result' 是一個 numpy的`ndarray`對象.

Session 對象在使用完後需要關閉以釋放資源sess.close(). 除了顯式調用 close 外, 也可以使用"with" 代碼塊 來自動完成關閉動作.

with tf.Session() as sess:  result = sess.run([product])  print result 

為了便於使用諸如 IPython 之類的 Python 互動環境, 可以使用InteractiveSession代替 Session 類, 使用 Tensor.eval()和 Operation.run()方法代替 Session.run(). 這樣可以避免使用一個變數來持有會話.

# 進入一個互動式 TensorFlow 會話. import tensorflow as tf sess = tf.InteractiveSession() x = tf.Variable([1.0, 2.0]) a = tf.constant([3.0, 3.0]) # 使用初始化器 initializer op 的 run() 方法初始化 'x' x.initializer.run() # 增加一個減法 sub op, 從 'x' 減去 'a'. 運行減法 op, 輸出結果 sub = tf.sub(x, a) print sub.eval() # ==> [-2. -1.] 

2.tf.reduce_sum

首先,tf.reduce_X一系列運算操作(operation)是實現對一個tensor各種減少維度數學計算.

tf.reduce_sum(input_tensor, reduction_indices=None,keep_dims=False, name=None)

運算功能:沿著給定維度reduction_indices的方向降低input_tensor的維度,除非keep_dims=True,tensor的秩在reduction_indices上減1,被降低的維度長度為1.如果reduction_indices沒有傳入參數,所有維度都降低,返回只含有1個元素的tensor.運算最終返回降維後的tensor.

示範代碼:

# 'x' is [[1, 1, 1] #   [1, 1, 1]] tf.reduce_sum(x) ==> 6 tf.reduce_sum(x, 0) ==> [2, 2, 2] tf.reduce_sum(x, 1) ==> [3, 3] tf.reduce_sum(x, 1, keep_dims=True) ==> [[3], [3]] tf.reduce_sum(x, [0, 1]) ==> 6 

3.tf.reduce_mean

tf.reduce_mean(input_tensor, reduction_indices=None,keep_dims=False, name=None)

運算功能:將input_tensor沿著給定維度reduction_indices減少維度,除非keep_dims=True,tensor的秩在reduction_indices上減1,被降低的維度長度為1.如果reduction_indices沒有傳入參數,所有維度都降低,返回只含有1個元素的tensor.運算最終返回降維後的tensor.

示範代碼:

# 'x' is [[1., 1. ] #   [2., 2.]] tf.reduce_mean(x) ==> 1.5 tf.reduce_mean(x, 0) ==> [1.5, 1.5] tf.reduce_mean(x, 1) ==> [1., 2.] 

4.tf.argmax

tf.argmax(input, dimension, name=None)

運算功能:返回input在指定維度下的最大值的索引.傳回型別為int64.

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.