TensorFlow學習二:SOFTMAX迴歸
下載MNIST資料: 參考資料https://blog.csdn.net/i8088/article/details/79126150,把四個檔案下載之後,在執行的python同目錄裡面新建資料夾MNIST_data,然後把4個檔案移動到裡面。like this.
正式寫程式碼:
PART 1 匯入MNIST資料集
# encoding=utf-8 import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
第一行
在python2.x裡面 程式碼要寫中文必須將編碼宣告為utf-8
第二行
Module tensorflow.examples.tutorials.mnist.input_data Functions for downloading and reading MNIST data. 用來下載和讀取MNIST資料集的一些函式。
第三行
使用read_data_sets方法讀取MNIST_data資料夾下的資料集。one_hot單點資料只有一項為真,其餘為假。返回DataSets型別的物件。
PART 2
import tensorflow as tf # placeholder必須用feed_dict進行賦值 否則會報錯。placeholder返回一個Tensor物件 x = tf.placeholder(tf.float32, [None, 784]) # x是一個佔位符, 再執行計算時輸入這個值 W = tf.Variable(tf.zeros([784, 10])) # W是變數(待定引數) # zeros 輸入數列,輸出Tensor, [class]構造Variable建構函式引數Tensor b = tf.Variable(tf.zeros([10])) # softmax: 輸入Logic, 輸出Tensor y = tf.nn.softmax(tf.matmul(x, W) + b) # y = x * W + b
第一行
引入tensorflow包並起了一個別名
第三行
建立一個Float32型別、高度未知、寬度為784的佔位符x。佔位符在執行時必須用feed_dict方法進行填充,將來會被填充成樣本資料。高度是樣本數量,所以是未知的;寬度是每個樣本的畫素數量,是784個。在語法層面上,placeholder返回一個Tensor物件,感覺Tensor物件就是一個矩陣。深入理解Tensor物件>>
第四行
tf.zeros是返回一個全0的Tensor物件,使用這個物件構造一個Variable[變數]型別的物件W。變數型別可以理解為待求引數。
第六行
同上。構造一個變數b。
第八行
softmax文件:
Computes softmax activations. 計算softmax啟用函式。For each batch i and class j we have 對於每一批i和型別j有 softmax[i, j] = exp(logits[i, j]) / sum(exp(logits[i]))
類似於Softmax(某元素)=某元素/這一行的和 logits: (第一個引數)A Tensor. Must be one of the following types: float32, float64. 2-D with shape [batch_size, num_classes]. 一個Tensor物件。必須是float32或float64型別的物件。必須是2維的,每一行是一個樣本,第一列是一類。returns:(返回值)A Tensor. Has the same type as logits. Same shape as logits. 返回與引數型別一樣、形狀一樣的Tensor物件。
返回值賦給y。
PART 3
y_ = tf.placeholder("float", [None, 10]) # 輸入正確值
# 交叉熵
cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) # reduce_sum 求和
# 在語法層面上:先構造一個梯度下降優化器物件,然後呼叫改物件的minimize方法,引數:A Tensor containing the value to minimize
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) # 指定訓練方法
第一行
y_是一個用來填充成樣本代表的答案的佔位符。高度為None表示不知道有幾個樣本,寬度為10表示單點資料的寬度為10。
第三行
reduce_sum理解為sum即可。y_是樣本的真實答案,y是樣本的預測答案。交叉熵= 這裡用的乘是×,應該是按元素相乘。矩陣相乘用上面的matmul。
第五行
構造一個梯度下降優化器,並執行minimize方法。
minimize的文件
Add operations to minimize loss by updating var_list. 通過更新變數列表使誤差最小化。
returns: An Operation that updates the variables in var_list. If global_step was not None, that operation also increments global_step.
Operation是一種新型別。上面的W和b都是Variable型別的變數。
PART 4
# 開始設定值
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
[batch_xs, batch_ys] = mnist.train.next_batch(100) # 隨機選取100個數據
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
第二行
initialize_all_variables的文件
Returns an Op that initializes all variables. 返回一個初始化所有變數的操作This is just a shortcut for initialize_variables(all_variables()) 這是一個函式的快捷方式。 returns: 返回:An Op that initializes all variables in the graph. 一個操作Op。
第三行
開始回話。
第四行
執行操作。
第五行
range的文件
range(stop) -> list of integers range(start, stop[, step]) -> list of integers
Return a list containing an arithmetic progression(一系列、發展,此處可能是增長) of integers. range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0. When step is given, it specifies the increment (or decrement). For example, range(4) returns [0, 1, 2, 3]. The end point is omitted(遺漏的)! These are exactly the valid indices for a list of 4 elements.
第六行
從訓練資料中隨機選取100個數據.
第七行
執行。能執行的都是Operation型別的變數。
# 返回 bool變數風格的tensor物件
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) # 這裡的y代表的SOFTMAX這一長串,類似MATLAB的符號運算
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # 把bool轉成float求平均值
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
第二行
tf.argmax(y, 1)表示返回y矩陣每一行的最大元素所在未知,構成一個新矩陣。y是預測值,y_是真值。檢查y形成的矩陣每一個元素和y_形成的矩陣的每一個元素是否相等,這個結構構成了一個布林矩陣。
第三行
將上面的布林矩陣的每個值都強制轉換成float型別,然後求平均值。
第四行
求出正確率。這裡feed的值是檢驗部分的資料。