1. 程式人生 > >TensorFlow學習二:SOFTMAX迴歸

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_{i,j}=\frac{e^{logits_{i,j}}}{\sum_{j=1}^{n}e^{logits_{i,j}}} 

類似於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是樣本的預測答案。交叉熵=\sum y1 \cdot \log 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的值是檢驗部分的資料。