中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站建設(shè)課程 谷建軟文推廣服務(wù)

網(wǎng)站建設(shè)課程 谷建,軟文推廣服務(wù),武漢營(yíng)銷型網(wǎng)站制作公司,通州 網(wǎng)站建設(shè)原文:Building Machine Learning Projects with TensorFlow 協(xié)議:CC BY-NC-SA 4.0 譯者:飛龍 本文來(lái)自【ApacheCN 深度學(xué)習(xí) 譯文集】,采用譯后編輯(MTPE)流程來(lái)盡可能提升效率。 不要擔(dān)心自己的形象&#x…

原文:Building Machine Learning Projects with TensorFlow

協(xié)議:CC BY-NC-SA 4.0

譯者:飛龍

本文來(lái)自【ApacheCN 深度學(xué)習(xí) 譯文集】,采用譯后編輯(MTPE)流程來(lái)盡可能提升效率。

不要擔(dān)心自己的形象,只關(guān)心如何實(shí)現(xiàn)目標(biāo)?!对瓌t》,生活原則 2.3.c

一、探索和轉(zhuǎn)換數(shù)據(jù)

TensorFlow 是用于使用數(shù)據(jù)流圖進(jìn)行數(shù)值計(jì)算的開源軟件庫(kù)。 圖中的節(jié)點(diǎn)表示數(shù)學(xué)運(yùn)算,而圖的邊緣表示在它們之間傳遞的多維數(shù)據(jù)數(shù)組(張量)。

該庫(kù)包含各種函數(shù),使您能夠?qū)崿F(xiàn)和探索用于圖像和文本處理的最先進(jìn)的卷積神經(jīng)網(wǎng)絡(luò)(CNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)架構(gòu)。 由于復(fù)雜的計(jì)算以圖的形式排列,因此 TensorFlow 可用作框架,使您能夠輕松開發(fā)自己的模型并將其用于機(jī)器學(xué)習(xí)領(lǐng)域。

它還能夠在從 CPU 到移動(dòng)處理器(包括高度并行的 GPU 計(jì)算)的大多數(shù)異構(gòu)環(huán)境中運(yùn)行,并且新的服務(wù)架構(gòu)可以在所有指定選項(xiàng)的非常復(fù)雜的混合環(huán)境中運(yùn)行:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Qwhov9OM-1681565530608)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00002.jpg)]

TensorFlow 的主要數(shù)據(jù)結(jié)構(gòu) – 張量

TensorFlow 的數(shù)據(jù)管理基于張量。 張量是來(lái)自數(shù)學(xué)領(lǐng)域的概念,并且是作為向量和矩陣的線性代數(shù)項(xiàng)的概括而開發(fā)的。

專門討論 TensorFlow 時(shí),張量只是在張量對(duì)象中建模的帶類型的多維數(shù)組,帶有其他操作。

張量屬性 – 階數(shù),形狀和類型

如前所述,TensorFlow 使用張量數(shù)據(jù)結(jié)構(gòu)表示所有數(shù)據(jù)。 任何張量都具有靜態(tài)類型和動(dòng)態(tài)尺寸,因此您可以實(shí)時(shí)更改張量的內(nèi)部組織。

張量的另一個(gè)特性是,只有張量類型的對(duì)象才能在計(jì)算圖中的節(jié)點(diǎn)之間傳遞。

現(xiàn)在讓我們看一下張量的屬性是什么(從現(xiàn)在開始,每次使用張量這個(gè)詞時(shí),我們都將引用 TensorFlow 的張量對(duì)象)。

張量階數(shù)

張量階數(shù)表示張量的維度方面,但與矩陣階數(shù)不同。 它表示張量所處的維數(shù),而不是行/列或等效空間中張量擴(kuò)展的精確度量。

秩為 1 的張量等于向量,秩為 2 的張量是矩陣。 對(duì)于二階張量,您可以使用語(yǔ)法t[i, j]訪問(wèn)任何元素。 對(duì)于三階張量,您將需要使用t[i, j, k]來(lái)尋址元素,依此類推。

在下面的示例中,我們將創(chuàng)建一個(gè)張量,并訪問(wèn)其分量之一:

>>> import tensorflow as tf 
>>> tens1 = tf.constant([[[1,2],[2,3]],[[3,4],[5,6]]]) 
>>> print sess.run(tens1)[1,1,0] 
5 

這是三階張量,因?yàn)樵诎仃嚨拿總€(gè)元素中都有一個(gè)向量元素:

數(shù)學(xué)實(shí)體代碼定義示例
0標(biāo)量scalar = 1000
1向量vector = [2, 8, 3]
2矩陣matrix = [[4, 2, 1], [5, 3, 2], [5, 5, 6]]
33 階張量tensor = [[[4], [3], [2]], [[6], [100], [4]], [[5], [1], [4]]]
nn 階張量

張量形狀

TensorFlow 文檔使用三種符號(hào)約定來(lái)描述張量維數(shù):階數(shù),形狀和維數(shù)。 下表顯示了它們之間的相互關(guān)系:

形狀維度數(shù)量示例
0[]04
1[D0]1[2]
2[D0,D1]2[6, 2]
3[D0,D1,D2]3[7, 3, 2]
n[D0,D1,... Dn-1]d形狀為[D0, D1, ..., Dn-1]的張量。

在下面的示例中,我們創(chuàng)建一個(gè)樣本階數(shù)三張量,并打印其形狀:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-2pQz4Zsn-1681565530609)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00003.jpg)]

張量數(shù)據(jù)類型

除了維數(shù)外,張量還具有固定的數(shù)據(jù)類型。 您可以將以下任意一種數(shù)據(jù)類型分配給張量:

數(shù)據(jù)類型Python 類型描述
DT_FLOATtf.float3232 位浮點(diǎn)。
DT_DOUBLEtf.float6464 位浮點(diǎn)。
DT_INT8tf.int88 位有符號(hào)整數(shù)。
DT_INT16tf.int1616 位有符號(hào)整數(shù)。
DT_INT32tf.int3232 位有符號(hào)整數(shù)。
DT_INT64tf.int6464 位有符號(hào)整數(shù)。
DT_UINT8tf.uint88 位無(wú)符號(hào)整數(shù)。
DT_STRINGtf.string可變長(zhǎng)度字節(jié)數(shù)組。 張量的每個(gè)元素都是一個(gè)字節(jié)數(shù)組。
DT_BOOLtf.bool布爾值。

創(chuàng)建新的張量

我們可以創(chuàng)建自己的張量,也可以從著名的 numpy 庫(kù)派生它們。 在以下示例中,我們創(chuàng)建一些 numpy 數(shù)組,并對(duì)其進(jìn)行一些基本數(shù)學(xué)運(yùn)算:

import tensorflow as tf
import numpy as np
x = tf.constant(np.random.rand(32).astype(np.float32))
y=  tf.constant ([1,2,3])

從 numpy 到張量,以及反向

TensorFlow 可與 numpy 互操作,通常eval()函數(shù)調(diào)用將返回一個(gè) numpy 對(duì)象,準(zhǔn)備與標(biāo)準(zhǔn)數(shù)值工具一起使用。

提示

我們必須注意,張量對(duì)象是操作結(jié)果的符號(hào)句柄,因此它不保存其包含的結(jié)構(gòu)的結(jié)果值。 因此,我們必須運(yùn)行eval()方法來(lái)獲取實(shí)際值,該值等于Session.run(tensor_to_eval)。

在此示例中,我們構(gòu)建了兩個(gè) numpy 數(shù)組,并將它們轉(zhuǎn)換為張量:

import tensorflow as tf #we import tensorflow 
import numpy as np   #we import numpy 
sess = tf.Session() #start a new Session Object 
x_data = np.array([[1.,2.,3.], 
[3.,2.,6.]]) # 2x3 matrix 
x = tf.convert_to_tensor(x_data, dtype=tf.float32) #Finally, we create the tensor, starting from the fload 3x matrix 

有用的方法

tf.convert_to_tensor:此函數(shù)將各種類型的 Python 對(duì)象轉(zhuǎn)換為張量對(duì)象。 它接受張量對(duì)象,numpy 數(shù)組,Python 列表和 Python 標(biāo)量。

完成工作 – 與 TensorFlow 交互

與大多數(shù) Python 模塊一樣,TensorFlow 允許使用 Python 的交互式控制臺(tái):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-SsLjwSbc-1681565530610)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00004.jpg)]

與 Python 的解釋器和 TensorFlow 庫(kù)輕松交互

在上圖中,我們調(diào)用 Python 解釋器(通過(guò)簡(jiǎn)單地調(diào)用 Python)并創(chuàng)建常量類型的張量。 然后我們?cè)俅握{(diào)用它,Python 解釋器顯示張量的形狀和類型。

我們還可以使用 IPython 解釋器,該解釋器將允許我們采用與筆記本樣式工具(例如 Jupyter)更兼容的格式:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-IgZOiPTZ-1681565530610)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00005.jpg)]

IPython 提示

在談?wù)撘越换シ绞竭\(yùn)行 TensorFlow 會(huì)話時(shí),最好使用InteractiveSession對(duì)象。

與普通的tf.Session類不同,tf.InteractiveSession類將自身安裝為構(gòu)造時(shí)的默認(rèn)會(huì)話。 因此,當(dāng)您嘗試求值張量或運(yùn)行操作時(shí),將不需要傳遞Session對(duì)象來(lái)指示它所引用的會(huì)話。

處理計(jì)算工作流程 – TensorFlow 的數(shù)據(jù)流程圖

TensorFlow 的數(shù)據(jù)流圖是模型計(jì)算如何工作的符號(hào)表示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-SkXxnoOi-1681565530610)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00006.jpg)]

在 TensorBoard 上繪制的簡(jiǎn)單數(shù)據(jù)流圖表示

簡(jiǎn)而言之,數(shù)據(jù)流圖是一個(gè)完整的 TensorFlow 計(jì)算,表示為一個(gè)圖,其中節(jié)點(diǎn)是操作,邊是操作之間的數(shù)據(jù)流。

通常,節(jié)點(diǎn)執(zhí)行數(shù)學(xué)運(yùn)算,但也表示連接以輸入數(shù)據(jù)或變量,或推出結(jié)果。

邊緣描述節(jié)點(diǎn)之間的輸入/輸出關(guān)系。 這些數(shù)據(jù)邊僅傳輸張量。 節(jié)點(diǎn)被分配給計(jì)算設(shè)備,并且一旦它們進(jìn)入邊緣上的所有張量都可用,就會(huì)異步并行執(zhí)行。

所有運(yùn)算都有一個(gè)名稱,并表示一個(gè)抽象計(jì)算(例如,矩陣求逆或乘積)。

計(jì)算圖構(gòu)建

通常在庫(kù)用戶創(chuàng)建張量和模型將支持的操作時(shí)構(gòu)建計(jì)算圖,因此無(wú)需直接構(gòu)建Graph()對(duì)象。 Python 張量構(gòu)造器,例如tf.constant(),會(huì)將必要的元素添加到默認(rèn)圖。 TensorFlow 操作也會(huì)發(fā)生同樣的情況。

例如,c = tf.matmul(a, b)創(chuàng)建一個(gè)MatMul類型的操作,該操作將張量ab作為輸入并產(chǎn)生c作為輸出。

有用的操作對(duì)象方法

  • tf.Operation.type:返回操作的類型(例如MatMul
  • tf.Operation.inputs:返回代表操作輸入的張量對(duì)象列表
  • tf.Graph.get_operations():返回圖中的操作列表
  • tf.Graph.version:返回圖的自動(dòng)數(shù)字版本

饋送

TensorFlow 還提供了一種饋送機(jī)制,可將張量直接修補(bǔ)到圖中的任何操作中。

提要用張量值臨時(shí)替換操作的輸出。 您將提要數(shù)據(jù)作為run()調(diào)用的參數(shù)提供。 提要僅用于傳遞給它的運(yùn)行調(diào)用。 最常見的用例涉及通過(guò)使用tf.placeholder()創(chuàng)建特定的操作,使其指定為feed操作。

變量

在大多數(shù)計(jì)算中,圖執(zhí)行多次。 大多數(shù)張量都無(wú)法通過(guò)圖的一次執(zhí)行而幸存。 但是,變量是一種特殊的操作,它可以將句柄返回到持久可變的張量,該張量在圖執(zhí)行過(guò)程中仍然存在。 對(duì)于 TensorFlow 的機(jī)器學(xué)習(xí)應(yīng)用,模型的參數(shù)通常存儲(chǔ)在變量中保存的張量中,并在運(yùn)行模型的訓(xùn)練圖時(shí)進(jìn)行更新。

變量初始化

要初始化變量,只需使用張量作為參數(shù)調(diào)用Variable對(duì)象構(gòu)造器。

在此示例中,我們使用1000零數(shù)組初始化了一些變量:

b = tf.Variable(tf.zeros([1000])) 

保存數(shù)據(jù)流程圖

數(shù)據(jù)流圖是使用 Google 的協(xié)議緩沖區(qū)編寫的,因此以后可以使用多種語(yǔ)言進(jìn)行讀取。

圖序列化語(yǔ)言 – 協(xié)議緩沖區(qū)

協(xié)議緩沖區(qū)是一種不依賴語(yǔ)言,不依賴平臺(tái)的可擴(kuò)展機(jī)制,用于序列化結(jié)構(gòu)化數(shù)據(jù)。 首先定義數(shù)據(jù)結(jié)構(gòu),然后可以使用專門生成的代碼來(lái)使用多種語(yǔ)言進(jìn)行讀寫。

有用的方法

tf.Graph.as_graph_def(from_version=None, add_shapes=False):返回此圖的序列化GraphDef表示形式。

參數(shù):

  • from_version:如果設(shè)置了此選項(xiàng),它將返回帶有從該版本添加的節(jié)點(diǎn)的GraphDef
  • add_shapes:如果true,則向每個(gè)節(jié)點(diǎn)添加一個(gè)shape屬性

建立圖的示例

在此示例中,我們將構(gòu)建一個(gè)非常簡(jiǎn)單的數(shù)據(jù)流圖,并觀察生成的 protobuffer 文件的概述:

import tensorflow as tf 
g = tf.Graph() 
with g.as_default(): 
import tensorflow as tf 
sess = tf.Session() 
W_m = tf.Variable(tf.zeros([10, 5])) 
x_v = tf.placeholder(tf.float32, [None, 10]) 
result = tf.matmul(x_v, W_m) 
print g.as_graph_def() 

生成的 protobuffer(摘要)為:

node {name: "zeros"op: "Const"attr {key: "dtype"value {type: DT_FLOAT}}attr {key: "value"value {tensor {dtype: DT_FLOATtensor_shape {dim {size: 10}dim {size: 5}}float_val: 0.0}}}
}
...
node {name: "MatMul"op: "MatMul"input: "Placeholder"input: "Variable/read"attr {key: "T"value {type: DT_FLOAT}}
...
}
versions {producer: 8
}

運(yùn)行我們的程序 – 會(huì)話

客戶端程序通過(guò)創(chuàng)建會(huì)話與 TensorFlow 系統(tǒng)交互。 會(huì)話對(duì)象表示將在其中運(yùn)行計(jì)算的環(huán)境。 Session對(duì)象開始為空,并且當(dāng)程序員創(chuàng)建不同的操作和張量時(shí),它們將被自動(dòng)添加到Session中,在調(diào)用Run()方法之前,該對(duì)象不會(huì)進(jìn)行任何計(jì)算。

Run()方法采用一組需要計(jì)算的輸出名稱,以及一組可選的張量,以代替節(jié)點(diǎn)的某些輸出輸入到圖中。

如果調(diào)用此方法,并且命名操作依賴于某些操作,則Session對(duì)象將執(zhí)行所有這些操作,然后繼續(xù)執(zhí)行命名操作。

這條簡(jiǎn)單的線是創(chuàng)建會(huì)話所需的唯一一行:

s = tf.Session()
Sample command line output:
tensorflow/core/common_runtime/local_session.cc:45]Localsessioninteropparallelism threads:6

基本張量方法

在本節(jié)中,我們將探索 TensorFlow 支持的一些基本方法。 它們對(duì)于初始數(shù)據(jù)探索和為更好的并行計(jì)算準(zhǔn)備數(shù)據(jù)很有用。

簡(jiǎn)單矩陣運(yùn)算

TensorFlow 支持許多更常見的矩陣運(yùn)算,例如轉(zhuǎn)置,乘法,獲取行列式和逆運(yùn)算。

這是應(yīng)用于樣本數(shù)據(jù)的那些函數(shù)的一個(gè)小例子:

In [1]: import tensorflow as tf 
In [2]: sess = tf.InteractiveSession() 
In [3]: x = tf.constant([[2, 5, 3, -5], 
...:                  [0, 3,-2,  5], 
...:                  [4, 3, 5,  3], 
...:                  [6, 1, 4,  0]]) In [4]: y = tf.constant([[4, -7, 4, -3, 4], 
...:                  [6, 4,-7,  4, 7], 
...:                  [2, 3, 2,  1, 4], 
...:                  [1, 5, 5,  5, 2]]) 
In [5]: floatx = tf.constant([[2., 5., 3., -5.], 
...:                       [0., 3.,-2.,  5.], 
...:                       [4., 3., 5.,  3.], 
...:                       [6., 1., 4.,  0.]]) 
In [6]: tf.transpose(x).eval() # Transpose matrix 
Out[6]: 
array([[ 2,  0,  4,  6], 
[ 5,  3,  3,  1], 
[ 3, -2,  5,  4], 
[-5,  5,  3,  0]], dtype=int32) In [7]: tf.matmul(x, y).eval() # Matrix multiplication 
Out[7]: 
array([[ 39, -10, -46,  -8,  45], 
[ 19,  31,   0,  35,  23], 
[ 47,  14,  20,  20,  63], 
[ 38, -26,  25, -10,  47]], dtype=int32) In [8]: tf.matrix_determinant(floatx).eval() # Matrix determinant 
Out[8]: 818.0 In [9]: tf.matrix_inverse(floatx).eval() # Matrix inverse 
Out[9]: 
array([[-0.00855745,  0.10513446, -0.18948655,  0.29584351], 
[ 0.12958434,  0.12224938,  0.01222495, -0.05134474], 
[-0.01955992, -0.18826403,  0.28117359, -0.18092911], 
[-0.08557458,  0.05134474,  0.10513448, -0.0415648 ]], dtype=float32) In [10]: tf.matrix_solve(floatx, [[1],[1],[1],[1]]).eval() # Solve Matrix system 
Out[10]: 
array([[ 0.20293398], 
[ 0.21271393], 
[-0.10757945], 
[ 0.02933985]], dtype=float32) 

歸約

歸約運(yùn)算是對(duì)張量的一個(gè)維度進(jìn)行運(yùn)算的操作,而其維數(shù)較小。

支持的操作(具有相同參數(shù))包括乘積,最小值,最大值,平均值,所有,任意和accumulate_n)。

In [1]: import tensorflow as tf In [2]: sess = tf.InteractiveSession() 
In [3]: x = tf.constant([[1,  2, 3], 
...:                  [3,  2, 1], 
...:                  [-1,-2,-3]]) 
In [4]: In [4]: boolean_tensor = tf.constant([[True,  False, True], 
...:                  [False, False, True], 
...:                  [True, False, False]]) In [5]: tf.reduce_prod(x, reduction_indices=1).eval() # reduce prod 
Out[5]: array([ 6,  6, -6], dtype=int32) In [6]: tf.reduce_min(x, reduction_indices=1).eval() # reduce min 
Out[6]: array([ 1,  1, -3], dtype=int32) In [7]: tf.reduce_max(x, reduction_indices=1).eval() # reduce max 
Out[7]: array([ 3,  3, -1], dtype=int32) In [8]: tf.reduce_mean(x, reduction_indices=1).eval() # reduce mean 
Out[8]: array([ 2,  2, -2], dtype=int32) In [9]: tf.reduce_all(boolean_tensor, reduction_indices=1).eval() # reduce all 
Out[9]: array([False, False, False], dtype=bool) In [10]: tf.reduce_any(boolean_tensor, reduction_indices=1).eval() # reduce any 
Out[10]: array([ True,  True,  True], dtype=bool) 

張量分段

張量分段是一個(gè)過(guò)程,其中某個(gè)維度被歸約,并且所得元素由索引行確定。 如果該行中的某些元素被重復(fù),則對(duì)應(yīng)的索引將轉(zhuǎn)到其中的值,并且該操作將在具有重復(fù)索引的索引之間應(yīng)用。

索引數(shù)組的大小應(yīng)與索引數(shù)組的維度 0 的大小相同,并且必須增加 1。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-WHgNMlWd-1681565530611)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00007.jpg)]

細(xì)分說(shuō)明(重做)

In [1]: import tensorflow as tf 
In [2]: sess = tf.InteractiveSession() 
In [3]: seg_ids = tf.constant([0,1,1,2,2]); # Group indexes : 0|1,2|3,4 
In [4]: tens1 = tf.constant([[2, 5, 3, -5], 
...:                     [0, 3,-2,  5], 
...:                     [4, 3, 5,  3], 
...:                     [6, 1, 4,  0], 
...:                     [6, 1, 4,  0]])  # A sample constant matrix In [5]: tf.segment_sum(tens1, seg_ids).eval()   # Sum segmentation 
Out[5]: 
array([[ 2,  5,  3, -5], 
[ 4,  6,  3,  8], 
[12,  2,  8,  0]], dtype=int32) In [6]: tf.segment_prod(tens1, seg_ids).eval() # Product segmentation 
Out[6]: 
array([[  2,   5,   3,  -5], 
[  0,   9, -10,  15], 
[ 36,   1,  16,   0]], dtype=int32) In [7]: tf.segment_min(tens1, seg_ids).eval() # minimun value goes to group 
Out[7]: 
array([[ 2,  5,  3, -5], 
[ 0,  3, -2,  3], 
[ 6,  1,  4,  0]], dtype=int32) In [8]: tf.segment_max(tens1, seg_ids).eval() # maximum value goes to group 
Out[8]: 
array([[ 2,  5,  3, -5], 
[ 4,  3,  5,  5], 
[ 6,  1,  4,  0]], dtype=int32) In [9]: tf.segment_mean(tens1, seg_ids).eval() # mean value goes to group 
Out[9]: 
array([[ 2,  5,  3, -5], 
[ 2,  3,  1,  4], 
[ 6,  1,  4,  0]], dtype=int32) 

序列

序列工具包括諸如argminargmax(顯示維度的最小值和最大值),listdiff(顯示列表之間交集的補(bǔ)碼),where(顯示真實(shí)值的索引)和unique(在列表上顯示唯一值)之類的張量方法。

In [1]: import tensorflow as tf 
In [2]: sess = tf.InteractiveSession() 
In [3]: x = tf.constant([[2, 5, 3, -5], 
...:                  [0, 3,-2,  5], 
...:                  [4, 3, 5,  3], 
...:                  [6, 1, 4,  0]]) 
In [4]: listx = tf.constant([1,2,3,4,5,6,7,8]) 
In [5]: listy = tf.constant([4,5,8,9]) In [6]: In [6]: boolx = tf.constant([[True,False], [False,True]]) In [7]: tf.argmin(x, 1).eval() # Position of the maximum value of columns 
Out[7]: array([3, 2, 1, 3]) In [8]: tf.argmax(x, 1).eval() # Position of the minimum value of rows 
Out[8]: array([1, 3, 2, 0]) In [9]: tf.listdiff(listx, listy)[0].eval() # List differences 
Out[9]: array([1, 2, 3, 6, 7], dtype=int32) In [10]: tf.where(boolx).eval() # Show true values 
Out[10]: 
array([[0, 0], 
[1, 1]]) In [11]: tf.unique(listx)[0].eval() # Unique values in list 
Out[11]: array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int32) 

張量形狀變換

這些操作與矩陣形狀有關(guān),用于調(diào)整不匹配的數(shù)據(jù)結(jié)構(gòu)并檢索有關(guān)數(shù)據(jù)量度的快速信息。 這在確定運(yùn)行時(shí)的處理策略時(shí)很有用。

在以下示例中,我們將從第二張量張量開始,并將打印有關(guān)它的一些信息。

然后,我們將探討按維度修改矩陣的操作,包括添加或刪除維度,例如squeezeexpand_dims

In [1]: import tensorflow as tf 
In [2]: sess = tf.InteractiveSession() 
In [3]: x = tf.constant([[2, 5, 3, -5], 
...:                  [0, 3,-2,  5], 
...:                  [4, 3, 5,  3], 
...:                  [6, 1, 4,  0]]) In [4]: tf.shape(x).eval() # Shape of the tensor 
Out[4]: array([4, 4], dtype=int32) In [5]: tf.size(x).eval() # size of the tensor 
Out[5]: 16 In [6]: tf.rank(x).eval() # rank of the tensor 
Out[6]: 2 In [7]: tf.reshape(x, [8, 2]).eval() # converting to a 10x2 matrix 
Out[7]: 
array([[ 2,  5], 
[ 3, -5], 
[ 0,  3], 
[-2,  5], 
[ 4,  3], 
[ 5,  3], 
[ 6,  1], 
[ 4,  0]], dtype=int32) In [8]: tf.squeeze(x).eval() #  squeezing 
Out[8]: 
array([[ 2,  5,  3, -5], 
[ 0,  3, -2,  5], 
[ 4,  3,  5,  3], 
[ 6,  1,  4,  0]], dtype=int32) In [9]: tf.expand_dims(x,1).eval() #Expanding dims 
Out[9]: 
array([[[ 2,  5,  3, -5]], 
[[ 0,  3, -2,  5]], 
[[ 4,  3,  5,  3]], 
[[ 6,  1,  4,  0]]], dtype=int32) 

張量切片和合并

為了從大型數(shù)據(jù)集中提取和合并有用的信息,切片和聯(lián)接方法使您可以合并所需的列信息,而不必使用非特定信息來(lái)占用內(nèi)存空間。

在以下示例中,我們將提取矩陣切片,對(duì)其進(jìn)行分割,添加填充以及對(duì)行進(jìn)行打包和解包:

In [1]: import tensorflow as tf 
In [2]: sess = tf.InteractiveSession() 
In [3]: t_matrix = tf.constant([[1,2,3], 
...:                         [4,5,6], 
...:                         [7,8,9]]) 
In [4]: t_array = tf.constant([1,2,3,4,9,8,6,5]) 
In [5]: t_array2= tf.constant([2,3,4,5,6,7,8,9]) In [6]: tf.slice(t_matrix, [1, 1], [2,2]).eval() # cutting an slice 
Out[6]: 
array([[5, 6], 
[8, 9]], dtype=int32) In [7]: tf.split(0, 2, t_array) # splitting the array in two 
Out[7]: 
[<tf.Tensor 'split:0' shape=(4,) dtype=int32>, 
<tf.Tensor 'split:1' shape=(4,) dtype=int32>] In [8]: tf.tile([1,2],[3]).eval() # tiling this little tensor 3 times 
Out[8]: array([1, 2, 1, 2, 1, 2], dtype=int32) In [9]: tf.pad(t_matrix, [[0,1],[2,1]]).eval() # padding 
Out[9]: 
array([[0, 0, 1, 2, 3, 0], 
[0, 0, 4, 5, 6, 0], 
[0, 0, 7, 8, 9, 0], 
[0, 0, 0, 0, 0, 0]], dtype=int32) In [10]: tf.concat(0, [t_array, t_array2]).eval() #concatenating list 
Out[10]: array([1, 2, 3, 4, 9, 8, 6, 5, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32) In [11]: tf.pack([t_array, t_array2]).eval() # packing 
Out[11]: 
array([[1, 2, 3, 4, 9, 8, 6, 5], 
[2, 3, 4, 5, 6, 7, 8, 9]], dtype=int32) In [12]: sess.run(tf.unpack(t_matrix)) # Unpacking, we need the run method to view the tensors 
Out[12]: 
[array([1, 2, 3], dtype=int32), 
array([4, 5, 6], dtype=int32), 
array([7, 8, 9], dtype=int32)] In [13]: tf.reverse(t_matrix, [False,True]).eval() # Reverse matrix 
Out[13]: 
array([[3, 2, 1], 
[6, 5, 4], 
[9, 8, 7]], dtype=int32) 

數(shù)據(jù)流結(jié)構(gòu)和結(jié)果可視化 – TensorBoard

可視化摘要信息是任何數(shù)據(jù)科學(xué)家工具箱的重要組成部分。

TensorBoard 是一個(gè)軟件工具,它允許數(shù)據(jù)流圖的圖形表示和用于解釋結(jié)果的儀表板,通常來(lái)自日志記錄工具:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-v8nChBJH-1681565530611)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00008.jpg)]

TensorBoard GUI

可以將圖的所有張量和操作設(shè)置為將信息寫入日志。 TensorBoard 分析在Session運(yùn)行時(shí)正常編寫的信息,并向用戶顯示許多圖形項(xiàng),每個(gè)圖形項(xiàng)一個(gè)。

命令行用法

要調(diào)用 TensorBoard,命令行為:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-nwlpRgfI-1681565530611)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00009.jpg)]

TensorBoard 的工作方式

我們構(gòu)建的每個(gè)計(jì)算圖都有 TensorFlow 的實(shí)時(shí)日志記錄機(jī)制,以便保存模型擁有的幾乎所有信息。

但是,模型構(gòu)建者必須考慮應(yīng)保存的幾百個(gè)信息維中的哪一個(gè),以后才能用作分析工具。

為了保存所有必需的信息,TensorFlow API 使用了稱為摘要的數(shù)據(jù)輸出對(duì)象。

這些摘要將結(jié)果寫入 TensorFlow 事件文件,該文件收集在Session運(yùn)行期間生成的所有必需數(shù)據(jù)。

在以下示例中,我們將直接在生成的事件日志目錄上運(yùn)行 TensorBoard:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Re4FPwiu-1681565530612)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00010.jpg)]

添加摘要節(jié)點(diǎn)

TensorFlow 會(huì)話中的所有摘要均由SummaryWriter對(duì)象編寫。 調(diào)用的主要方法是:

tf.train.SummaryWriter.__init__(logdir, graph_def=None) 

該命令將在參數(shù)的路徑中創(chuàng)建一個(gè)SummaryWriter和一個(gè)事件文件。

SummaryWriter的構(gòu)造器將在logdir中創(chuàng)建一個(gè)新的事件文件。 當(dāng)您調(diào)用以下函數(shù)之一時(shí),此事件文件將包含Event類型的協(xié)議緩沖區(qū):add_summary()add_session_log()add_event()add_graph()。

如果將graph_def協(xié)議緩沖區(qū)傳遞給構(gòu)造器,則會(huì)將其添加到事件文件中。 (這等效于稍后調(diào)用add_graph())。

當(dāng)您運(yùn)行 TensorBoard 時(shí),它將從文件中讀取圖定義并以圖形方式顯示它,以便您可以與其進(jìn)行交互。

首先,創(chuàng)建您要從中收集摘要數(shù)據(jù)的 TensorFlow 圖,并確定要使用摘要操作標(biāo)注的節(jié)點(diǎn)。

TensorFlow 中的操作在您運(yùn)行它們或取決于它們的輸出的操作之前不會(huì)做任何事情。 我們剛剛創(chuàng)建的摘要節(jié)點(diǎn)是圖的外圍:當(dāng)前運(yùn)行的所有操作都不依賴于它們。 因此,要生成摘要,我們需要運(yùn)行所有這些摘要節(jié)點(diǎn)。 手動(dòng)管理它們很繁瑣,因此請(qǐng)使用tf.merge_all_summaries將它們組合為一個(gè)可生成所有摘要數(shù)據(jù)的操作。

然后,您可以運(yùn)行合并的摘要操作,這將在給定步驟中生成一個(gè)包含所有摘要數(shù)據(jù)的序列化摘要protobuf對(duì)象。 最后,要將摘要數(shù)據(jù)寫入磁盤,請(qǐng)將摘要protobuf傳遞給tf.train.SummaryWriter。

SummaryWriter在其構(gòu)造器中帶有logdir,此logdir非常重要,它是所有事件將被寫出的目錄。 同樣,SummaryWriter可以選擇在其構(gòu)造器中使用GraphDef。 如果收到一個(gè),TensorBoard 還將可視化您的圖。

現(xiàn)在,您已經(jīng)修改了圖并具有SummaryWriter,就可以開始運(yùn)行網(wǎng)絡(luò)了! 如果需要,您可以在每個(gè)步驟中運(yùn)行合并的摘要操作,并記錄大量的訓(xùn)練數(shù)據(jù)。 不過(guò),這可能是您需要的更多數(shù)據(jù)。 相反,請(qǐng)考慮每 n 個(gè)步驟運(yùn)行一次合并的摘要操作。

通用摘要操作

這是不同的摘要類型及其構(gòu)造所使用的參數(shù)的列表:

  • tf.scalar_summary(label, value, collection=None, name=None)
  • tf.image_summary(label, tensor, max_images=3, collection=None, name=None)
  • tf.histogram_summary(label, value, collection=None, name=None)

特殊摘要函數(shù)

這些是特殊函數(shù),用于合并不同操作的值,無(wú)論是摘要的集合,還是圖中的所有摘要:

  • tf.merge_summary(input, collection=None, name=None)
  • tf.merge_all_summaries(key="summary")

最后,作為提高可讀性的最后一項(xiàng)幫助,可視化對(duì)常數(shù)和匯總節(jié)點(diǎn)使用特殊的圖標(biāo)。 總而言之,這是節(jié)點(diǎn)符號(hào)表:

符號(hào)含義
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-MYWR8aFR-1681565530612)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00011.jpg)]代表名稱范圍的高級(jí)節(jié)點(diǎn)。 雙擊以展開一個(gè)高級(jí)節(jié)點(diǎn)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-RC5XEtyK-1681565530613)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00012.jpg)]彼此不連接的編號(hào)節(jié)點(diǎn)序列。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-zTMwlEEU-1681565530613)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00013.jpg)]彼此連接的編號(hào)節(jié)點(diǎn)序列。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-LSuiutTh-1681565530613)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00014.jpg)]單個(gè)操作節(jié)點(diǎn)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-o2jZ875R-1681565530613)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00015.jpg)]一個(gè)常數(shù)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BdjmIZo4-1681565530614)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00016.jpg)]摘要節(jié)點(diǎn)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-nDbbg9bc-1681565530614)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00017.jpg)]顯示操作之間的數(shù)據(jù)流的邊。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-laxcpqhV-1681565530614)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00018.jpg)]顯示操作之間的控制依賴項(xiàng)的邊。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-7ep4LJ4P-1681565530614)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00019.jpg)]顯示輸出操作節(jié)點(diǎn)可以改變輸入張量的參考邊。

與 TensorBoard 的 GUI 交互

通過(guò)平移和縮放來(lái)瀏覽圖形。單擊并拖動(dòng)以進(jìn)行平移,然后使用滾動(dòng)手勢(shì)進(jìn)行縮放。 雙擊節(jié)點(diǎn),或單擊其+按鈕,以展開表示操作代碼的名稱范圍。 為了輕松跟蹤縮放時(shí)的當(dāng)前視點(diǎn),右下角有一個(gè)小地圖:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8OKka8Oe-1681565530615)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00020.jpg)]

具有一個(gè)擴(kuò)展的操作組和圖例的 Openflow

要關(guān)閉打開的節(jié)點(diǎn),請(qǐng)?jiān)俅坞p擊它或單擊其-按鈕。 您也可以單擊一次以選擇一個(gè)節(jié)點(diǎn)。 它將變?yōu)檩^暗的顏色,有關(guān)該顏色及其連接的節(jié)點(diǎn)的詳細(xì)信息將顯示在可視化文件右上角的信息卡中。

選擇還有助于理解高級(jí)節(jié)點(diǎn)。 選擇任何高度節(jié)點(diǎn),其他連接的相應(yīng)節(jié)點(diǎn)圖標(biāo)也會(huì)被選擇。 例如,這可以輕松查看正在保存的節(jié)點(diǎn)和未保存的節(jié)點(diǎn)。

單擊信息卡中的節(jié)點(diǎn)名稱將其選中。 如有必要,視點(diǎn)將自動(dòng)平移以使該節(jié)點(diǎn)可見。

最后,您可以使用圖例上方的顏色菜單為圖形選擇兩種配色方案。 默認(rèn)的“結(jié)構(gòu)視圖”顯示結(jié)構(gòu):當(dāng)兩個(gè)高級(jí)節(jié)點(diǎn)具有相同的結(jié)構(gòu)時(shí),它們以相同的彩虹色顯示。 唯一結(jié)構(gòu)化的節(jié)點(diǎn)為灰色。 第二個(gè)視圖顯示了不同操作在哪個(gè)設(shè)備上運(yùn)行。 名稱范圍的顏色與設(shè)備中用于其內(nèi)部操作的部分的比例成比例。

從磁盤讀取信息

TensorFlow 讀取許多最標(biāo)準(zhǔn)的格式,包括眾所周知的 CSV,圖像文件(JPG 和 PNG 解碼器)以及標(biāo)準(zhǔn) TensorFlow 格式。

列表格式 – CSV

為了讀取眾所周知的 CSV 格式,TensorFlow 有自己的方法。 與其他庫(kù)(例如熊貓)相比,讀取簡(jiǎn)單 CSV 文件的過(guò)程稍微復(fù)雜一些。

讀取 CSV 文件需要完成前面的幾個(gè)步驟。 首先,我們必須使用要使用的文件列表創(chuàng)建文件名隊(duì)列對(duì)象,然后創(chuàng)建TextLineReader。 使用此行讀取器,剩下的操作將是解碼 CSV 列,并將其保存在張量上。 如果我們想將同類數(shù)據(jù)混合在一起,則pack方法將起作用。

鳶尾花數(shù)據(jù)集

鳶尾花數(shù)據(jù)集或費(fèi)舍爾鳶尾花數(shù)據(jù)集是分類問(wèn)題的眾所周知基準(zhǔn)。 這是羅納德·費(fèi)舍爾(Ronald Fisher)在 1936 年的論文中引入的多元數(shù)據(jù)集,該分類法是將生物分類問(wèn)題中的多次測(cè)量用作線性判別分析的示例。

數(shù)據(jù)集包含來(lái)自三種鳶尾花(鳶尾鳶尾,初春鳶尾和雜色鳶尾)中每種的 50 個(gè)樣本。 在每個(gè)樣本中測(cè)量了四個(gè)特征:萼片和花瓣的長(zhǎng)度和寬度,以厘米為單位。 基于這四個(gè)特征的組合,Fisher 開發(fā)了一個(gè)線性判別模型以區(qū)分物種。 (您可以在書的代碼包中獲取此數(shù)據(jù)集的.csv文件。)

為了讀取 CSV 文件,您必須下載它并將其放在與 Python 可執(zhí)行文件運(yùn)行所在的目錄中。

在下面的代碼示例中,我們將從知名的鳶尾數(shù)據(jù)庫(kù)中讀取和打印前五個(gè)記錄:

import tensorflow as tf 
sess = tf.Session() 
filename_queue = tf.train.string_input_producer( 
tf.train.match_filenames_once("./*.csv"), 
shuffle=True) 
reader = tf.TextLineReader(skip_header_lines=1) 
key, value = reader.read(filename_queue) 
record_defaults = [[0.], [0.], [0.], [0.], [""]] 
col1, col2, col3, col4, col5 = tf.decode_csv(value, record_defaults=record_defaults)  # Convert CSV records to tensors. Each column maps to one tensor. 
features = tf.pack([col1, col2, col3, col4]) tf.initialize_all_variables().run(session=sess) 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord, sess=sess) for iteration in range(0, 5):example = sess.run([features])print(example)coord.request_stop()coord.join(threads)

這就是輸出的樣子:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3q4Nsw8x-1681565530615)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00021.jpg)]

讀取圖像數(shù)據(jù)

TensorFlow 允許從圖像格式導(dǎo)入數(shù)據(jù),這對(duì)于導(dǎo)入面向圖像的模型的自定義圖像輸入將非常有用??山邮艿膱D像格式將為 JPG 和 PNG,內(nèi)部表示形式為uint8張量,每個(gè)張量為圖片通道的二階張量:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-WMslfSfa-1681565530620)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00022.jpg)]

要讀取的樣本圖像

加載和處理圖像

在此示例中,我們將加載示例圖像并對(duì)其進(jìn)行一些其他處理,將生成的圖像保存在單獨(dú)的文件中:

import tensorflow as tf 
sess = tf.Session() 
filename_queue = tf.train.string_input_producer(tf.train.match_filenames_once("./blue_jay.jpg")) 
reader = tf.WholeFileReader() 
key, value = reader.read(filename_queue) 
image=tf.image.decode_jpeg(value) 
flipImageUpDown=tf.image.encode_jpeg(tf.image.flip_up_down(image)) 
flipImageLeftRight=tf.image.encode_jpeg(tf.image.flip_left_right(image)) 
tf.initialize_all_variables().run(session=sess) 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord, sess=sess) 
example = sess.run(flipImageLeftRight) 
print example 
file=open ("flippedUpDown.jpg", "wb+") 
file.write (flipImageUpDown.eval(session=sess)) 
file.close() 
file=open ("flippedLeftRight.jpg", "wb+") 
file.write (flipImageLeftRight.eval(session=sess)) 
file.close() 

print example行將逐行顯示圖像中 RGB 值的摘要:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-cZGUla29-1681565530621)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00023.jpg)]

最終圖像如下所示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-rAzkoNAL-1681565530621)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00024.jpg)]

比較原始圖像和變更后的圖像(上下翻轉(zhuǎn)和左右翻轉(zhuǎn))

從標(biāo)準(zhǔn) TensorFlow 格式讀取

另一種方法是將您擁有的任意數(shù)據(jù)轉(zhuǎn)換為正式格式。 這種方法使混合和匹配數(shù)據(jù)集和網(wǎng)絡(luò)架構(gòu)變得更加容易。

您可以編寫一個(gè)獲取數(shù)據(jù)的小程序,將其填充到示例協(xié)議緩沖區(qū)中,將協(xié)議緩沖區(qū)序列化為字符串,然后使用tf.python_io.TFRecordWriter類將字符串寫入TFRecords文件。

要讀取TFRecords的文件,請(qǐng)將tf.TFRecordReadertf.parse_single_example解碼器一起使用。 parse_single_example op將示例協(xié)議緩沖區(qū)解碼為張量。

總結(jié)

在本章中,我們學(xué)習(xí)了可應(yīng)用于數(shù)據(jù)的主要數(shù)據(jù)結(jié)構(gòu)和簡(jiǎn)單操作,并對(duì)計(jì)算圖的各個(gè)部分進(jìn)行了簡(jiǎn)要總結(jié)。

這些操作將成為即將出現(xiàn)的技術(shù)的基礎(chǔ)。 通過(guò)這些類,數(shù)據(jù)科學(xué)家可以在查看當(dāng)前數(shù)據(jù)的總體特征之后,確定類的分離或調(diào)整特征是否足夠清晰,或者直接使用更復(fù)雜的工具,從而決定是否使用更簡(jiǎn)單的模型。

在下一章中,我們將開始構(gòu)建和運(yùn)行圖,并使用本章中介紹的某些方法來(lái)解決問(wèn)題。

二、聚類

在本章中,我們將開始應(yīng)用在上一章中學(xué)到的數(shù)據(jù)轉(zhuǎn)換操作,并開始使用聚類技術(shù)在某些給定信息中找到有趣的模式,發(fā)現(xiàn)數(shù)據(jù)組或集群。

在此過(guò)程中,我們還將獲得兩個(gè)新工具:能夠通過(guò) scikit-learn 庫(kù)從一組代表性數(shù)據(jù)結(jié)構(gòu)中生成合成樣本集,并且能夠通過(guò) matplotlib 庫(kù)以圖形方式繪制我們的數(shù)據(jù)和模型結(jié)果 。

我們將在本章中介紹的主題如下:

  • 了解群集的工作原理,并將其與替代的現(xiàn)有分類技術(shù)進(jìn)行比較
  • 使用 scikit-learn 和 matplotlib 豐富數(shù)據(jù)集選擇的可能性,并獲得看起來(lái)專業(yè)的數(shù)據(jù)圖形表示
  • 實(shí)現(xiàn) K 均值聚類算法
  • 實(shí)現(xiàn)最近鄰法,并將結(jié)果與??K 均值進(jìn)行比較

從數(shù)據(jù)中學(xué)習(xí) – 無(wú)監(jiān)督學(xué)習(xí)

在本章中,我們將回顧兩種無(wú)監(jiān)督學(xué)習(xí)的情況。

無(wú)監(jiān)督學(xué)習(xí)基本上包括在先前的數(shù)據(jù)集中查找模式。 通常,很少或沒有信息提供給該技術(shù),并且該過(guò)程應(yīng)該能夠自動(dòng)確定信息的組織方式,并識(shí)別數(shù)據(jù)組織中的不同結(jié)構(gòu)。

聚類

最初可用于未標(biāo)記數(shù)據(jù)集的最簡(jiǎn)單的操作之一是嘗試了解數(shù)據(jù)集成員共同特征的可能組。

為此,可以將數(shù)據(jù)集劃分為任意數(shù)量的段,其中每個(gè)段都可以表示為中心質(zhì)量(質(zhì)心)點(diǎn),該點(diǎn)代表屬于已確定組或聚類的點(diǎn)。

為了定義將同一組分配給不同組成員的標(biāo)準(zhǔn),我們需要定義一個(gè)表示數(shù)據(jù)元素之間距離的概念,因此我們可以簡(jiǎn)單地說(shuō),所有類成員比任何其他質(zhì)心更接近自己的質(zhì)心 。

在下圖中,我們可以看到典型聚類算法的結(jié)果以及聚類中心的表示形式:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-TveK6NMx-1681565530621)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00025.jpg)]

樣本聚類算法輸出

K 均值

K 均值是一種非常流行的聚類算法,可以輕松實(shí)現(xiàn)。 這非常簡(jiǎn)單,將它作為具有良好類分離性的數(shù)據(jù)集的第一個(gè)過(guò)程應(yīng)用,可以對(duì)數(shù)據(jù)有很好的先驗(yàn)理解。

K 均值的原理

K 均值嘗試使用成員的平均值作為主要指標(biāo),將一組樣本分成 k 個(gè)不相交的組或簇。 這一點(diǎn)通常稱為質(zhì)心,指代具有相同名稱的算術(shù)實(shí)體,并表示為任意尺寸空間中的向量。

K 均值是一種幼稚的方法,因?yàn)樗ㄟ^(guò)查找適當(dāng)?shù)馁|(zhì)心而起作用,但是不知道先驗(yàn)簇的數(shù)量是多少。

為了評(píng)估多少簇能夠很好地表示所提供的數(shù)據(jù),Elbow 方法是一種比較流行的方法。

算法迭代準(zhǔn)則

此方法的標(biāo)準(zhǔn)和目標(biāo)是最小化從群集成員到所有包含群集的樣本的實(shí)際質(zhì)心的平方距離之和。 這也稱為慣性最小化。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Neyjnkdl-1681565530621)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00026.jpg)]

K 均值的誤差最小化準(zhǔn)則

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-i7ambpyY-1681565530622)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/tex-1.gif)]

K 均值算法細(xì)分

K 均值算法的機(jī)制可以通過(guò)以下流程圖總結(jié):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-73yV5sC6-1681565530622)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00027.jpg)]

K 均值過(guò)程的簡(jiǎn)化流程圖

該算法可以簡(jiǎn)化如下:

  1. 我們從未分類的樣本開始,以 k 個(gè)元素為起始質(zhì)心。 為了簡(jiǎn)潔起見,也可以簡(jiǎn)化此算法,使元素列表中的第一個(gè)元素成為第一個(gè)元素。
  2. 然后,我們計(jì)算樣本與首先選擇的樣本之間的距離,并獲得第一個(gè)計(jì)算出的質(zhì)心(或其他代表值)。 您可以看到圖中的質(zhì)心向著更常識(shí)的質(zhì)心移動(dòng)。
  3. 形心更改后,它們的位移將引起各個(gè)距離發(fā)生更改,因此群集成員身份可能會(huì)更改。
  4. 這是我們重新計(jì)算質(zhì)心并在不滿足停止條件的情況下重復(fù)第一步的時(shí)候。

停止條件可以有多種類型:

  • 在 N 次迭代之后,可能是要么我們選擇了一個(gè)非常大的數(shù),然后我們將進(jìn)行不必要的計(jì)算,否則它可能會(huì)收斂得很慢,并且如果質(zhì)心沒有非常穩(wěn)定的方法,我們將得到非常令人難以置信的結(jié)果。 如果我們有一個(gè)很長(zhǎng)的迭代過(guò)程,那么這個(gè)停止條件也可以作為最后的手段。
  • 參考先前的平均結(jié)果,可能的更好的迭代收斂標(biāo)準(zhǔn)是看重心的變化,無(wú)論是在總位移還是總簇元切換中。 最后一個(gè)通常被使用,因此一旦沒有更多元素從其當(dāng)前群集更改為另一個(gè)群集,我們將停止該過(guò)程。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-RepKPOFg-1681565530622)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00028.jpg)]

K 均值簡(jiǎn)化圖形

K 均值的優(yōu)缺點(diǎn)

這種方法的優(yōu)點(diǎn)是:

  • 它可以很好地?cái)U(kuò)展(大多數(shù)計(jì)算可以并行運(yùn)行)
  • 它已經(jīng)被用于很多應(yīng)用中

但是,簡(jiǎn)單性也要付出代價(jià)(沒有適用的規(guī)則):

  • 它需要先驗(yàn)知識(shí)(可能的簇?cái)?shù)應(yīng)事先知道)
  • 離群值可以推入質(zhì)心的值,因?yàn)樗鼈兊闹蹬c任何其他樣本相同
  • 由于我們假設(shè)該圖是凸且各向同性的,因此對(duì)于非圓形定界簇來(lái)說(shuō)效果不佳

K 最近鄰

K 最近鄰(KNN)是一種簡(jiǎn)單的經(jīng)典聚類方法,它將很好地介紹此類技術(shù),著眼于每個(gè)樣本的附近,并假設(shè)每個(gè)新樣本都應(yīng)屬于的類別。 已經(jīng)知道的數(shù)據(jù)點(diǎn)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6HRxPz32-1681565530622)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00029.jpg)]

K 最近鄰的原理

KNN 可以在我們的多種配置中實(shí)現(xiàn),但是在本章中,我們將使用“半監(jiān)督”方法。 我們將從一定數(shù)量的已分配樣本開始,稍后我們將根據(jù)訓(xùn)練集的特征猜測(cè)集群成員。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-V0LMg7RM-1681565530622)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00030.jpg)]

最近鄰算法

在上圖中,我們可以看到該算法的細(xì)分。 可以通過(guò)以下步驟進(jìn)行總結(jié):

  1. 我們將先前已知的樣本放在數(shù)據(jù)結(jié)構(gòu)上。
  2. 然后,我們讀取要分類的下一個(gè)樣本,并計(jì)算從新樣本到訓(xùn)練集的每個(gè)樣本的歐幾里得距離。
  3. 我們通過(guò)根據(jù)歐幾里得距離選擇最近的樣本的類別來(lái)確定新元素的類別。 KNN 方法需要對(duì) k 個(gè)最接近的樣本進(jìn)行投票。
  4. 我們重復(fù)該過(guò)程,直到?jīng)]有剩余的樣本為止。

KNN 的優(yōu)缺點(diǎn)

這種方法的優(yōu)點(diǎn)是:

  • 簡(jiǎn)單; 無(wú)需調(diào)整參數(shù)
  • 沒有正規(guī)訓(xùn)練; 我們只需要更多的訓(xùn)練實(shí)例來(lái)改進(jìn)模型

缺點(diǎn):

  • 計(jì)算昂貴(必須計(jì)算點(diǎn)與每個(gè)新樣本之間的所有距離)

有用庫(kù)的實(shí)用示例

在以下各節(jié)中,我們將討論一些有用的庫(kù)。

matplotlib 繪圖庫(kù)

數(shù)據(jù)繪圖是數(shù)據(jù)科學(xué)學(xué)科不可或缺的一部分。 因此,我們需要一個(gè)非常強(qiáng)大的框架來(lái)繪制結(jié)果。 對(duì)于此任務(wù),我們沒有在 TensorFlow 中實(shí)現(xiàn)的通用解決方案,我們將使用 matplotlib 庫(kù)。

在 matplotlib 站點(diǎn)(http://matplotlib.org/)中,定義為:

matplotlib 是一個(gè) Python 2D 繪圖庫(kù),它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版物質(zhì)量的圖形。

合成樣本的數(shù)據(jù)繪圖

在此示例中,我們將生成一個(gè)包含 100 個(gè)隨機(jī)數(shù)的列表,生成樣本圖,并將結(jié)果保存在圖形文件中:

    import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltwith tf.Session() as sess:fig, ax = plt.subplots()ax.plot(tf.random_normal([100]).eval(), tf.random_normal([100] ).eval(),'o')ax.set_title('Sample random plot for TensorFlow')plt.savefig("result.png")

這是結(jié)果圖像:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-noBteruc-1681565530623)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00031.jpg)]

使用 TensorFlow 和 matplotlib 生成的示例圖

提示

為了查看 scikit 數(shù)據(jù)集模塊的更一般的解釋,請(qǐng)參考 matplotlib.org。

scikit-learn 數(shù)據(jù)集模塊

TensorFlow 當(dāng)前未實(shí)現(xiàn)用于輕松生成合成數(shù)據(jù)集的方法。 因此,我們將使用sklearn庫(kù)作為幫助程序。

關(guān)于 scikit-learn 庫(kù)

從其網(wǎng)站:

scikit-learn(以前為scikits.learn)是針對(duì) Python 編程語(yǔ)言的開源機(jī)器學(xué)習(xí)庫(kù)。它具有各種分類,回歸和聚類模型,旨在與 Python 數(shù)字和科學(xué)庫(kù) NumPy 和 SciPy 互操作。

在此示例中,我們將使用數(shù)據(jù)集模塊,該模塊處理許多眾所周知的合成和現(xiàn)場(chǎng)提取的數(shù)據(jù)集的生成和加載。

提示

為了查看 scikit 數(shù)據(jù)集模塊的更一般的解釋,請(qǐng)參考此鏈接。

合成數(shù)據(jù)集類型

我們將使用一些生成的數(shù)據(jù)集類型:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-xzxspPqP-1681565530623)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00032.jpg)]

Blob,圓圈和月亮數(shù)據(jù)集類型

Blob 數(shù)據(jù)集

該數(shù)據(jù)集是測(cè)試簡(jiǎn)單聚類算法的理想選擇。 不會(huì)出現(xiàn)問(wèn)題,因?yàn)閿?shù)據(jù)是一致地分組的,并且類別的分離很明確。

采用的方法

以下方法用于所采用的方法:

sklearn.datasets.make_blobs(n_samples=100, n_features=2,  centers=3, cluster_std=1.0, center_box=(-10.0, 10.0),  shuffle=True, random_state=None) 

在這里,n_samples是數(shù)據(jù)總數(shù),n_features是數(shù)據(jù)的列數(shù)或特征數(shù),centers是中心列表或許多隨機(jī)中心,cluster_std是標(biāo)準(zhǔn)偏差,center_box是隨機(jī)生成中心時(shí)每個(gè)聚類中心的邊界框,shuffle指示是否必須對(duì)樣本進(jìn)行混洗,random_state是隨機(jī)種子。

圓圈數(shù)據(jù)集

這是在其他圓圈中具有圓圈的數(shù)據(jù)集。 這是一個(gè)非線性的,可分離的問(wèn)題,因此需要通過(guò)非線性模型來(lái)解決。 這排除了諸如 K 均值的簡(jiǎn)單算法。 在本章中,我們將嘗試使用它來(lái)闡明觀點(diǎn)。

采用的方法

以下方法用于所采用的方法:

sklearn.datasets.make_circles(n_samples=100,shuffle=True,noise=None, random_state=None,factor=0.8) 

在這里,n_samples是數(shù)據(jù)總數(shù),shuffle表示是否必須對(duì)樣本進(jìn)行混洗,noise是要應(yīng)用于循環(huán)數(shù)據(jù)的隨機(jī)量的數(shù)量,random_state是隨機(jī)種子,并且factor是圓之間的比例因子。

月亮數(shù)據(jù)集

這是另一個(gè)非線性問(wèn)題,但是具有另一種類型的類分離,因?yàn)闆]有諸如圓環(huán)之類的閉合。

項(xiàng)目 1 – 合成數(shù)據(jù)集上的 K 均值聚類

數(shù)據(jù)集說(shuō)明和加載

在本章中,我們將使用生成的數(shù)據(jù)集,這些數(shù)據(jù)集經(jīng)過(guò)特殊設(shè)計(jì)以具有特殊的屬性。 目標(biāo)屬性中的兩個(gè)是類別線性分離的可能性以及是否存在明顯分離的群集。

生成數(shù)據(jù)集

通過(guò)這些行,我們創(chuàng)建了數(shù)據(jù)結(jié)構(gòu),其中將包含用于解決方案的所有元素,即:

centers = [(-2, -2), (-2, 1.5), (1.5, -2), (2, 1.5)] 
data, features = make_blobs (n_samples=200, centers=centers, n_features = 2, cluster_std=0.8, shuffle=False, random_state=42) 

通過(guò) matplotlib 繪制數(shù)據(jù)集圖:

    ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250)plt.plot()

模型架構(gòu)

points變量包含數(shù)據(jù)集點(diǎn)的 2D 坐標(biāo),質(zhì)心變量將包含組中心點(diǎn)的坐標(biāo),cluster_assignments變量包含每個(gè)數(shù)據(jù)元素的質(zhì)心索引。

例如,cluster_assignments[2] = 1表示data[2]數(shù)據(jù)點(diǎn)屬于具有中心重心1的群集。 重心1的位置位于centroids[1]中。

points=tf.Variable(data) 
cluster_assignments = tf.Variable(tf.zeros([N], dtype=tf.int64)) 
centroids = tf.Variable(tf.slice(points.initialized_value(), [0,0], [K,2])) 

然后,我們可以使用 matplotlib 繪制這些質(zhì)心的位置:

fig, ax = plt.subplots() 
ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250) 
plt.show() 

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-wexLkox2-1681565530623)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00033.jpg)]

初始中心播種

損失函數(shù)描述和優(yōu)化器循環(huán)

然后,我們將對(duì)所有質(zhì)心進(jìn)行 N 份復(fù)制,對(duì)每個(gè)點(diǎn)進(jìn)行 K 份復(fù)制,對(duì)每個(gè)點(diǎn)進(jìn)行N x K份復(fù)制,因此我們可以針對(duì)每個(gè)維度計(jì)算出每個(gè)點(diǎn)與每個(gè)質(zhì)心之間的距離:

rep_centroids = tf.reshape(tf.tile(centroids, [N, 1]), [N, K, 2]) 
rep_points = tf.reshape(tf.tile(points, [1, K]), [N, K, 2]) 
sum_squares = tf.reduce_sum(tf.square(rep_points - rep_centroids),  
reduction_indices=2) 

然后,我們對(duì)所有維度執(zhí)行總和,并獲得最低總和的索引(這將是分配給每個(gè)點(diǎn)的質(zhì)心或聚類的索引):

best_centroids = tf.argmin(sum_squares, 1) 

質(zhì)心也將使用完整源代碼中定義的bucket:mean函數(shù)進(jìn)行更新。

停止條件

這是新質(zhì)心和分配不變的停止條件:

did_assignments_change = tf.reduce_any(tf.not_equal(best_centroids, cluster_assignments)) 

在這里,我們使用control_dependencies來(lái)計(jì)算是否需要更新質(zhì)心:

with tf.control_dependencies([did_assignments_change]): do_updates = tf.group( centroids.assign(means), cluster_assignments.assign(best_centroids)) 

結(jié)果描述

程序執(zhí)行后,我們得到以下輸出:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-LixPNUW2-1681565530624)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00034.jpg)]

這是一輪迭代后質(zhì)心變化的匯總圖,其中繪制了從算法生成的原始聚類。

在下圖中,我們針對(duì)這種明顯分離的情況表示了 K 均值算法在應(yīng)用中的不同階段:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-HbVFgnBV-1681565530624)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00035.jpg)]

每次迭代的質(zhì)心變化

完整源代碼

以下是完整的源代碼:

import tensorflow as tf 
import numpy as np 
import time import matplotlib 
import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_blobs 
from sklearn.datasets.samples_generator import make_circles DATA_TYPE = 'blobs' # Number of clusters, if we choose circles, only 2 will be enough 
if (DATA_TYPE == 'circle'): K=2 
else: K=4 # Maximum number of iterations, if the conditions are not met 
MAX_ITERS = 1000 start = time.time() centers = [(-2, -2), (-2, 1.5), (1.5, -2), (2, 1.5)] 
if (DATA_TYPE == 'circle'): data, features = make_circles(n_samples=200, shuffle=True, noise= 0.01, factor=0.4) 
else: data, features = make_blobs (n_samples=200, centers=centers, n_features = 2, cluster_std=0.8, shuffle=False, random_state=42) fig, ax = plt.subplots() 
ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250) 
plt.show() fig, ax = plt.subplots() 
if (DATA_TYPE == 'blobs'): 
ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250) 
ax.scatter(data.transpose()[0], data.transpose()[1], marker = 'o', s = 100, c = features, cmap=plt.cm.coolwarm ) 
plt.plot() points=tf.Variable(data) 
cluster_assignments = tf.Variable(tf.zeros([N], dtype=tf.int64)) 
centroids = tf.Variable(tf.slice(points.initialized_value(), [0,0], [K,2])) sess = tf.Session() 
sess.run(tf.initialize_all_variables()) rep_centroids = tf.reshape(tf.tile(centroids, [N, 1]), [N, K, 2]) 
rep_points = tf.reshape(tf.tile(points, [1, K]), [N, K, 2]) 
sum_squares = tf.reduce_sum(tf.square(rep_points - rep_centroids),  
reduction_indices=2) 
best_centroids = tf.argmin(sum_squares, 1) did_assignments_change = tf.reduce_any(tf.not_equal(best_centroids, cluster_assignments)) def bucket_mean(data, bucket_ids, num_buckets): 
total = tf.unsorted_segment_sum(data, bucket_ids, num_buckets) 
count = tf.unsorted_segment_sum(tf.ones_like(data), bucket_ids, num_buckets) 
return total / count means = bucket_mean(points, best_centroids, K) with tf.control_dependencies([did_assignments_change]): 
do_updates = tf.group( 
centroids.assign(means), 
cluster_assignments.assign(best_centroids)) changed = True 
iters = 0 fig, ax = plt.subplots() 
if (DATA_TYPE == 'blobs'): colourindexes=[2,1,4,3] 
else: colourindexes=[2,1] 
while changed and iters < MAX_ITERS: 
fig, ax = plt.subplots() 
iters += 1 
[changed, _] = sess.run([did_assignments_change, do_updates]) 
[centers, assignments] = sess.run([centroids, cluster_assignments]) 
ax.scatter(sess.run(points).transpose()[0], sess.run(points).transpose()[1], marker = 'o', s = 200, c = assignments, cmap=plt.cm.coolwarm ) 
ax.scatter(centers[:,0],centers[:,1], marker = '^', s = 550, c = colourindexes, cmap=plt.cm.plasma) 
ax.set_title('Iteration ' + str(iters)) 
plt.savefig("kmeans" + str(iters) +".png") ax.scatter(sess.run(points).transpose()[0], sess.run(points).transpose()[1], marker = 'o', s = 200, c = assignments, cmap=plt.cm.coolwarm ) 
plt.show() end = time.time() 
print ("Found in %.2f seconds" % (end-start)), iters, "iterations" 
print "Centroids:" 
print centers 
print "Cluster assignments:", assignments 

這是觀察算法機(jī)制的最簡(jiǎn)單情況。 當(dāng)數(shù)據(jù)來(lái)自真實(shí)世界時(shí),這些類通常沒有那么清晰地分開,并且標(biāo)記數(shù)據(jù)樣本更加困難。

圓圈合成數(shù)據(jù)上的 K 均值

對(duì)于圓圖,我們觀察到這種數(shù)據(jù)表征并不容易用一組簡(jiǎn)單的方法表示。 如圖所示,兩個(gè)圓要么共享一個(gè)質(zhì)心的位置,要么真的很接近,因此我們無(wú)法預(yù)測(cè)明確的結(jié)果:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-MHNb0rva-1681565530624)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00036.jpg)]

圓型數(shù)據(jù)集

對(duì)于此數(shù)據(jù)集,我們僅使用兩個(gè)類來(lái)確保了解此算法的主要缺點(diǎn):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-IfHfBWga-1681565530624)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00037.jpg)]

K 均值應(yīng)用于圓形綜合數(shù)據(jù)集

如我們所見,初始中心向樣本數(shù)量最集中的區(qū)域漂移,因此將數(shù)據(jù)線性劃分。 這是我們現(xiàn)階段使用的簡(jiǎn)單模型的局限性之一。 為了處理非線性可分離性樣本,我們可以嘗試本章范圍以外的其他統(tǒng)計(jì)方法,例如基于密度的帶噪應(yīng)用空間聚類(DBSCAN)。

項(xiàng)目 2 – 合成數(shù)據(jù)集上的最近鄰

在這個(gè)項(xiàng)目中,我們將加載一個(gè)數(shù)據(jù)集,使用該數(shù)據(jù)集,以前的算法(K 均值)在分離類時(shí)遇到問(wèn)題。

數(shù)據(jù)集生成

該數(shù)據(jù)集是第一個(gè)示例中具有兩個(gè)類的相同循環(huán)類數(shù)據(jù)集,但是這次我們將通過(guò)增加一些噪聲(從0.010.12)來(lái)增加錯(cuò)誤概率:

data, features = make_circles(n_samples=N, shuffle=True, noise=0.12,factor=0.4)

這是生成的訓(xùn)練數(shù)據(jù)圖:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-yBwTSwrV-1681565530625)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00038.jpg)]

模型架構(gòu)

將保留數(shù)據(jù)的變量只是原始數(shù)據(jù)和測(cè)試列表,其中將包含計(jì)算出的測(cè)試數(shù)據(jù)類:

data, features = make_circles(n_samples=N, shuffle=True, noise= 0.12, factor=0.4)
tr_data, tr_features= data[:cut], features[:cut]
te_data,te_features=data[cut:], features[cut:]
test=[]

損失函數(shù)說(shuō)明

在聚類中,我們將使用函數(shù)來(lái)優(yōu)化為歐式距離,與第 1 章,探索和轉(zhuǎn)換數(shù)據(jù)相同。 它是在集群分配循環(huán)上計(jì)算的,獲取從新點(diǎn)到現(xiàn)有訓(xùn)練點(diǎn)的距離,要求最小值的索引,然后使用該索引搜索最近的鄰居的類:

distances = tf.reduce_sum(tf.square(tf.sub(i , tr_data)),reduction_indices=1)
neighbor = tf.arg_min(distances,0)

停止條件

在這個(gè)簡(jiǎn)單的示例中,一旦訪問(wèn)了測(cè)試分區(qū)的所有元素,我們將完成操作。

結(jié)果描述

這是測(cè)試數(shù)據(jù)類分布的圖形,在這里我們可以看到清晰分開的類。 我們可以觀察到,至少在此有限的數(shù)據(jù)集范圍內(nèi),此方法比非重疊,斑點(diǎn)優(yōu)化,K 均值方法更好。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ub2Iok7M-1681565530625)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00039.jpg)]

完整源代碼

以下是完整的源代碼:

import tensorflow as tf 
import numpy as np 
import time import matplotlib 
import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_circles N=210 
K=2 
# Maximum number of iterations, if the conditions are not met 
MAX_ITERS = 1000 
cut=int(N*0.7) start = time.time() data, features = make_circles(n_samples=N, shuffle=True, noise= 0.12, factor=0.4) 
tr_data, tr_features= data[:cut], features[:cut] 
te_data,te_features=data[cut:], features[cut:] 
test=[] fig, ax = plt.subplots() 
ax.scatter(tr_data.transpose()[0], tr_data.transpose()[1], marker = 'o', s = 100, c = tr_features, cmap=plt.cm.coolwarm ) 
plt.plot() sess = tf.Session() 
sess.run(tf.initialize_all_variables()) for i, j in zip(te_data, te_features): distances = tf.reduce_sum(tf.square(tf.sub(i , tr_data)),reduction_indices=1) neighbor = tf.arg_min(distances,0) test.append(tr_features[sess.run(neighbor)]) 
print test 
fig, ax = plt.subplots() 
ax.scatter(te_data.transpose()[0], te_data.transpose()[1], marker = 'o', s = 100, c = test, cmap=plt.cm.coolwarm ) 
plt.plot() end = time.time() 
print ("Found in %.2f seconds" % (end-start)) print "Cluster assignments:", test 

總結(jié)

在本章中,我們簡(jiǎn)單地概述了一些我們可以實(shí)現(xiàn)的最基本的模型,但是嘗試在解釋中盡可能地詳細(xì)。

從現(xiàn)在開始,我們將能夠生成綜合數(shù)據(jù)集,從而使我們能夠快速測(cè)試模型對(duì)于不同數(shù)據(jù)配置的適當(dāng)性,從而評(píng)估它們的優(yōu)缺點(diǎn),而不必加載具有大量未知特征的模型。

此外,我們已經(jīng)實(shí)現(xiàn)了第一個(gè)迭代方法并測(cè)試了收斂性,該任務(wù)將以類似的方式在后續(xù)章節(jié)中繼續(xù)進(jìn)行,但是將使用更精細(xì),更精確的方法。

在下一章中,我們將使用線性函數(shù)解決分類問(wèn)題,并且首次使用訓(xùn)練集中的先前數(shù)據(jù)來(lái)學(xué)習(xí)其特征。 這是監(jiān)督學(xué)習(xí)技術(shù)的目標(biāo),通常對(duì)于解決許多現(xiàn)實(shí)生活中的問(wèn)題更有用。

三、線性回歸

在本章中,我們將開始應(yīng)用機(jī)器學(xué)習(xí)項(xiàng)目中使用的所有標(biāo)準(zhǔn)步驟,以便使用一條使誤差和損失函數(shù)最小化的線來(lái)擬合先前給定的數(shù)據(jù)。

在上一章中,我們看到了范圍有限和許多可能解決方案的問(wèn)題。 這些類型的模型還與定性評(píng)估類型相關(guān),即基于先前的標(biāo)簽為樣本分配標(biāo)簽。 通常在與社會(huì)領(lǐng)域有關(guān)的問(wèn)題中發(fā)現(xiàn)該結(jié)果。

我們還可能對(duì)預(yù)測(cè)(先前建模的)函數(shù)的確切數(shù)字輸出值感興趣。 這種方法類似于物理領(lǐng)域,可用于在事先了解一系列歷史值的情況下預(yù)測(cè)溫度或濕度或某種商品的價(jià)值,這稱為回歸分析。

在線性回歸的情況下,我們?cè)谳斎胱兞亢洼敵鲎兞恐g尋找線性關(guān)系表示的確定關(guān)系。

單變量線性建模函數(shù)

如前所述,在線性回歸中,我們嘗試找到一個(gè)線性方程,以最小化數(shù)據(jù)點(diǎn)和建模線之間的距離。

此關(guān)系可以用以下標(biāo)準(zhǔn)線性函數(shù)表示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BiDyoZ8l-1681565530625)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00040.jpg)]

模型函數(shù)采用以下形式:

在這里,ss0bias是截距,x的函數(shù)值為零,ss1是建模線的斜率。 變量x通常被稱為自變量,y被稱為因變量,但它們也可以分別稱為回歸變量和響應(yīng)變量。

樣本數(shù)據(jù)生成

在下面的示例中,我們將基于ss0 = 2.0的線,加上最大幅度為0.4的垂直噪聲,生成近似樣本隨機(jī)分布。

In[]: 
#Indicate the matplotlib to show the graphics inline 
%matplotlib inline  
import matplotlib.pyplot as plt # import matplotlib 
import numpy as np # import numpy 
trX = np.linspace(-1, 1, 101) # Linear space of 101 and [-1,1] 
#Create The y function based on the x axis 
trY = 2 * trX + np.random.randn(*trX.shape) * 0.4 + 0.2  
plt.figure() # Create a new figure 
plt.scatter(trX,trY) #Plot a scatter draw of the random datapoints 
# Draw one line with the line function 
plt.plot (trX, .2 + 2 * trX)

結(jié)果圖將如下所示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-OtKxcx3k-1681565530625)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00041.jpg)]

加噪聲線性采樣和線性函數(shù)

成本函數(shù)的確定

與所有機(jī)器學(xué)習(xí)技術(shù)一樣,我們必須確定一個(gè)誤差函數(shù),我們需要將其最小化,這表明解決問(wèn)題的適當(dāng)性。

用于線性回歸的最常用的cost函數(shù)稱為最小二乘。

最小二乘

為了計(jì)算函數(shù)的最小二乘誤差,我們通常會(huì)尋找一種測(cè)量點(diǎn)與建模線的接近程度的方法。 因此,我們定義了一個(gè)函數(shù),用于測(cè)量每個(gè)元組x[n]y[n]與建模線的對(duì)應(yīng)值之間的距離。

對(duì)于 2D 回歸,我們有一個(gè)數(shù)字元組(X[0],Y[0]),(X[1],Y[1])...(X[n],Y[n])的列表,通過(guò)最小化以下函數(shù),可以找到β[0]β[1]的值:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ewRtXkK5-1681565530625)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00042.jpg)]

簡(jiǎn)單來(lái)說(shuō),求和代表預(yù)測(cè)值與實(shí)際值之間的歐幾里得距離之和。

進(jìn)行運(yùn)算的原因是,平方誤差的總和為我們提供了一個(gè)唯一且簡(jiǎn)單的全局?jǐn)?shù),預(yù)期數(shù)與實(shí)數(shù)之差為我們提供了適當(dāng)?shù)木嚯x,平方冪為我們提供了一個(gè)正數(shù),這會(huì)懲罰一個(gè)整數(shù)。 多于線性的時(shí)尚。

最小化成本函數(shù)

下一步是設(shè)置最小化cost函數(shù)的方法。 在線性演算中,定位極小值任務(wù)的基本特征之一被簡(jiǎn)化為計(jì)算函數(shù)的導(dǎo)數(shù)并尋找其零點(diǎn)。 為此,該函數(shù)必須具有導(dǎo)數(shù),最好是凸的。 可以證明最小二乘函數(shù)符合這兩個(gè)條件。 這對(duì)于避免已知的局部極小問(wèn)題非常有用。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-OGaQ1rPK-1681565530626)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00043.jpg)]

損失函數(shù)表示

最小二乘的一般最小值

我們嘗試解決的問(wèn)題(最小二乘)可以用矩陣形式表示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-5JYg54Ax-1681565530626)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00044.jpg)]

在此,J是成本函數(shù),具有以下解決方案:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-lO55DBc4-1681565530626)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00045.jpg)]

在本章中,我們將使用迭代方法梯度下降,該方法將在以后的章節(jié)中以更通用的方式使用。

迭代方法 – 梯度下降

梯度下降本身就是一種迭代方法,并且是機(jī)器學(xué)習(xí)領(lǐng)域中最常用的優(yōu)化算法。 考慮到可以用它優(yōu)化的參數(shù)組合的復(fù)雜性,它結(jié)合了簡(jiǎn)單的方法和良好的收斂速度。

2D 線性回歸從具有隨機(jī)定義的權(quán)重或線性系數(shù)乘數(shù)的函數(shù)開始。 定義第一個(gè)值后,第二步是以以下形式應(yīng)用迭代函數(shù):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-qLbFPjl2-1681565530626)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00046.jpg)]

在該方程式中,我們可以輕松推導(dǎo)該方法的機(jī)理。 我們從一組初始系數(shù)開始,然后朝函數(shù)最大變化的相反方向移動(dòng)。 α變量被稱為步長(zhǎng),將影響我們?cè)谔荻人阉鞣较蛏弦苿?dòng)最小的距離。

最后一步是可選地測(cè)試迭代之間的更改,并查看更改是否大于epsilon或檢查是否達(dá)到了迭代次數(shù)。

如果函數(shù)不是凸函數(shù),建議使用隨機(jī)值多次運(yùn)行梯度下降,然后選擇成本值最低的系數(shù)。 在非凸函數(shù)的情況下,梯度下降最終以最小值出現(xiàn),這可能是局部的。 因此,對(duì)于非凸函數(shù),結(jié)果取決于初始值,建議將它們隨機(jī)設(shè)置多次,并在所有解決方案中選擇成本最低的解決方案。

示例部分

現(xiàn)在讓我們討論有用的庫(kù)和模塊。

TensorFlow 中的優(yōu)化器方法 – train模塊

訓(xùn)練或參數(shù)優(yōu)化階段是機(jī)器學(xué)習(xí)工作流程的重要組成部分。

為此,TensorFlow 具有一個(gè)tf.train模塊,該模塊是一組對(duì)象的幫助程序,致力于實(shí)現(xiàn)數(shù)據(jù)科學(xué)家所需的各種不同優(yōu)化策略。 此模塊提供的主要對(duì)象稱為優(yōu)化器。

tf.train.Optimizer

Optimizer類允許您為loss函數(shù)計(jì)算梯度并將其應(yīng)用于模型的不同變量。 在最著名的算法子類中,我們找到了梯度下降,Adam 和 Adagrad。

關(guān)于該類的一個(gè)主要提示是Optimizer類本身無(wú)法實(shí)例化。 子類之一。

如前所述,TensorFlow 允許您以符號(hào)方式定義函數(shù),因此梯度也將以符號(hào)方式應(yīng)用,從而提高了結(jié)果的準(zhǔn)確率以及要應(yīng)用于數(shù)據(jù)的操作的通用性。

為了使用Optimizer類,我們需要執(zhí)行以下步驟:

  1. 創(chuàng)建具有所需參數(shù)的Optimizer(在這種情況下為梯度下降)。

            opt = GradientDescentOptimizer(learning_rate= [learning rate]) 
  2. cost函數(shù)創(chuàng)建一個(gè)調(diào)用minimize方法的操作。

            optimization_op = opt.minimize(cost, var_list=[variables list]) 

minimize方法具有以下形式:

tf.train.Optimizer.minimize(loss, global_step=None, var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, name=None) 

主要參數(shù)如下:

  • loss:這是一個(gè)張量,其中包含要最小化的值。
  • global_stepOptimizer工作后,此變量將增加 1。
  • var_list:包含要優(yōu)化的變量。

提示

實(shí)際上,optimize方法結(jié)合了對(duì)compute_gradients()apply_gradients()的調(diào)用。 如果要在應(yīng)用梯度之前對(duì)其進(jìn)行處理,請(qǐng)顯式調(diào)用compute_gradients()apply_gradients(),而不要使用此函數(shù)。 如果我們只想進(jìn)行一步訓(xùn)練,就必須以opt_op.run().的形式執(zhí)行run方法

其他優(yōu)化器實(shí)例類型

以下是其他Optimizer實(shí)例類型:

  • tf.train.AdagradOptimizer:這是一種基于參數(shù)頻率的自適應(yīng)方法,學(xué)習(xí)率單調(diào)下降。
  • tf.train.AdadeltaOptimizer:這是對(duì) Adagrad 的改進(jìn),它的學(xué)習(xí)率沒有下降。
  • tf.train.MomentumOptimizer:這是一種適應(yīng)性方法,可解決尺寸之間的不同變化率。
  • 并且還有其他更具體的參數(shù),例如tf.train.AdamOptimizertf.train.FtrlOptimizertf.train.RMSPropOptimizer。

示例 1 – 單變量線性回歸

現(xiàn)在,我們將在一個(gè)項(xiàng)目中工作,在該項(xiàng)目中,我們將應(yīng)用前面幾頁(yè)中簡(jiǎn)要介紹的所有概念。 在此示例中,我們將創(chuàng)建一個(gè)近似線性分布; 之后,我們將創(chuàng)建一個(gè)回歸模型,該模型試圖擬合線性函數(shù)以最小化誤差函數(shù)(由最小二乘法定義)。

給定一個(gè)新樣本,該模型將使我們能夠預(yù)測(cè)輸入值的結(jié)果。

數(shù)據(jù)集說(shuō)明

對(duì)于此示例,我們將生成一個(gè)包含線性函數(shù)并添加噪聲的合成數(shù)據(jù)集:

import TensorFlow as tf
import numpy as np
trX = np.linspace(-1, 1, 101)
trY = 2 * trX + np.random.randn(*trX.shape) * 0.4 + 0.2 # create a y value which is approximately linear but with some random noise

使用這些線,我們可以將線表示為散點(diǎn)圖和理想線函數(shù)。

import matplotlib.pyplot as plt 
plt.scatter(trX,trY) 
plt.plot (trX, .2 + 2 * trX)  

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-rPf1zr2D-1681565530627)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00047.jpg)]

生成的樣本和原始線性函數(shù)無(wú)噪聲

模型架構(gòu)

  1. 現(xiàn)在,我們創(chuàng)建一個(gè)變量來(lái)保存xy軸中的值。 然后,我們將模型定義為X和權(quán)重w的乘積。

  2. 然后,我們生成一些變量,并為其分配初始值以啟動(dòng)模型:

            In[]: X = tf.placeholder("float", name="X") # create symbolic variables Y = tf.placeholder("float", name = "Y") 
  3. 現(xiàn)在,我們通過(guò)將name_scope聲明為Model來(lái)定義模型。 此作用域?qū)⑵浒乃凶兞糠纸M,以形成具有同類實(shí)體的唯一實(shí)體。 在此范圍內(nèi),我們首先定義一個(gè)函數(shù),該函數(shù)接收x軸坐標(biāo),權(quán)重(斜率)和偏差的變量。 然后,我們創(chuàng)建一個(gè)新變量objects,來(lái)保存不斷變化的參數(shù),并使用y_model變量實(shí)例化該模型:

             with tf.name_scope("Model"):def model(X, w, b):return tf.mul(X, w) + b # just define the line as X*w + b0 w = tf.Variable(-1.0, name="b0") # create a shared variableb = tf.Variable(-2.0, name="b1") # create a shared variabley_model = model(X, w, b)

在儀表板上,您可以看到我們一直在收集的損失函數(shù)的圖像。 在圖部分中,放大模型時(shí),您可以看到求和與乘法運(yùn)算,參數(shù)變量b0b1以及應(yīng)用于模型的梯度運(yùn)算,如下所示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-udHxxWyp-1681565530627)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00048.jpg)]

成本函數(shù)描述和優(yōu)化器循環(huán)

  1. Cost Function中,我們創(chuàng)建了一個(gè)新的范圍以包括該組的所有操作,并使用先前創(chuàng)建的y_model來(lái)說(shuō)明用于計(jì)算損失的計(jì)算出的y軸值。

            with tf.name_scope("CostFunction"): cost = (tf.pow(Y-y_model, 2)) # use sqr error for cost  
  2. 為了定義選擇的optimizer,,我們初始化一個(gè)GradientDescentOptimizer,步驟將是0.01,這似乎是收斂的合理起點(diǎn)。

             train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost) 
  3. 現(xiàn)在是時(shí)候創(chuàng)建會(huì)話并初始化要保存在 TensorBoard 中進(jìn)行查看的變量了。 在此示例中,我們將為每個(gè)迭代保存一個(gè)標(biāo)量變量以及最后一個(gè)樣本的誤差結(jié)果。 我們還將圖結(jié)構(gòu)保存在文件中以供查看。

            sess = tf.Session() init = tf.initialize_all_variables()tf.train.write_graph(sess.graph,'/home/ubuntu/linear','graph.pbtxt')cost_op = tf.scalar_summary("loss", cost) merged = tf.merge_all_summaries() sess.run(init) writer = tf.train.SummaryWriter('/home/ubuntu/linear',sess.graph) 
  4. 對(duì)于模型訓(xùn)練,我們將目標(biāo)設(shè)置為 100 次迭代,然后將每個(gè)樣本發(fā)送到梯度下降的train操作。 每次迭代后,我們繪制建模線并將最后一個(gè)誤差的值添加到summary中。

            In[]:for i in range(100):for (x, y) in zip(trX, trY): sess.run(train_op, feed_dict={X: x, Y: y}) summary_str = sess.run(cost_op, feed_dict={X: x, Y: y})writer.add_summary(summary_str, i) b0temp=b.eval(session=sess)b1temp=w.eval(session=sess)plt.plot (trX, b0temp + b1temp * trX )
    

結(jié)果圖如下: 我們可以看到初始行如何迅速收斂為更合理的結(jié)果:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Fbxa1EWB-1681565530627)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00049.jpg)]

放大損失函數(shù)范圍后,我們可以看到冪和減法運(yùn)算以及書面摘要,如下圖所示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-s7znSKfY-1681565530627)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00050.jpg)]

停止條件

結(jié)果描述

現(xiàn)在讓我們檢查參數(shù)結(jié)果,打印wb變量的run輸出:

printsess.run(w) # Should be around 2  
printsess.run(b) #Should be around 0.2 
2.09422 
0.256044 

現(xiàn)在是時(shí)候再次以圖形方式查看數(shù)據(jù)和建議的最后一行。

plt.scatter(trX,trY) 
plt.plot (trX, testb + trX * testw) 

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-7i47QqWa-1681565530627)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00051.jpg)]

使用 TensorBoard 查看結(jié)果

現(xiàn)在,讓我們回顧一下保存在 TensorBoard 中的數(shù)據(jù)。

為了啟動(dòng) TensorBoard,您可以轉(zhuǎn)到logs目錄并執(zhí)行以下行:

$ tensorboard --logdir=. 

TensorBoard 將加載事件和圖形文件,并且將在6006端口上監(jiān)聽。 然后,您可以從瀏覽器轉(zhuǎn)到localhost:6000,然后查看 TensorBoard 儀表板,如下圖所示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Eeq6kVOq-1681565530628)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00052.jpg)]

完整源代碼

以下是完整的源代碼:

import matplotlib.pyplot as plt # import matplotlib 
import numpy as np # import numpy 
import tensorflow as tf 
import numpy as np trX = np.linspace(-1, 1, 101) #Create a linear space of 101 points between 1 and 1 
trY = 2 * trX + np.random.randn(*trX.shape) * 0.4 + 0.2 #Create The y function based on the x axis 
plt.figure() # Create a new figure 
plt.scatter(trX,trY) #Plot a scatter draw of the random datapoints 
plt.plot (trX, .2 + 2 * trX) # Draw one line with the line function get_ipython().magic(u'matplotlib inline') import matplotlib.pyplot as plt 
import tensorflow as tf 
import numpy as np trX = np.linspace(-1, 1, 101) 
trY = 2 * trX + np.random.randn(*trX.shape) * 0.4 + 0.2 # create a y value which is approximately linear but with some random noise plt.scatter(trX,trY) 
plt.plot (trX, .2 + 2 * trX) X = tf.placeholder("float", name="X") # create symbolic variables 
Y = tf.placeholder("float", name = "Y") withtf.name_scope("Model"): def model(X, w, b): returntf.mul(X, w) + b # We just define the line as X*w + b0   w = tf.Variable(-1.0, name="b0") # create a shared variable b = tf.Variable(-2.0, name="b1") # create a shared variable y_model = model(X, w, b) withtf.name_scope("CostFunction"): cost = (tf.pow(Y-y_model, 2)) # use sqr error for cost function train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost) sess = tf.Session() 
init = tf.initialize_all_variables() 
tf.train.write_graph(sess.graph, '/home/ubuntu/linear','graph.pbtxt') 
cost_op = tf.scalar_summary("loss", cost) 
merged = tf.merge_all_summaries() 
sess.run(init) 
writer = tf.train.SummaryWriter('/home/ubuntu/linear', sess.graph) fori in range(100): 
for (x, y) in zip(trX, trY): 
sess.run(train_op, feed_dict={X: x, Y: y})     
summary_str = sess.run(cost_op, feed_dict={X: x, Y: y}) 
writer.add_summary(summary_str, i)        b0temp=b.eval(session=sess) b1temp=w.eval(session=sess) 
plt.plot (trX, b0temp + b1temp * trX ) printsess.run(w) # Should be around 2  
printsess.run(b) #Should be around 0.2 plt.scatter(trX,trY) 
plt.plot (trX, sess.run(b) + trX * sess.run(w)) 

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-CVrbB2Gs-1681565530628)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00053.jpg)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6IbbuUeH-1681565530628)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00051.jpg)]

示例 2 – 多元線性回歸

在此示例中,我們將處理涉及多個(gè)變量的回歸問(wèn)題。

這將基于 1993 年波士頓某些郊區(qū)不同價(jià)格的研究數(shù)據(jù)集。 它最初包含 13 個(gè)變量以及該處房產(chǎn)的平均價(jià)格。

與原始文件相比,文件中唯一的變化是刪除了一個(gè)變量(b),該變量在種族上對(duì)不同的郊區(qū)進(jìn)行了概述。

除此之外,我們將選擇一些我們認(rèn)為具有線性條件可以建模的良好條件的變量。

有用的庫(kù)和方法

本部分包含一個(gè)有用的庫(kù)列表,我們將在此示例中以及本書其余部分中 TensorFlow 之外的部分中使用這些庫(kù),以幫助解決我們將要解決的各種問(wèn)題。

Pandas 庫(kù)

當(dāng)我們想快速讀取并獲得有關(guān)正常大小的數(shù)據(jù)文件的提示時(shí),創(chuàng)建讀取緩沖區(qū)和其他附加機(jī)制可能會(huì)減少開銷。 這是熊貓當(dāng)前的現(xiàn)實(shí)生活用例之一。

這是 Pandas 網(wǎng)站的摘錄:

Pandas 是 BSD 許可的開放源代碼庫(kù),為 Python 提供了高表現(xiàn),易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具。

熊貓的主要特征如下:

  • 它具有 CSV 和文本文件,MS Excel,SQL 數(shù)據(jù)庫(kù)甚至面向科學(xué)的 HDF5 格式的讀寫文件功能。
  • CSV 文件加載例程自動(dòng)識(shí)別列標(biāo)題并支持更直接的列尋址
  • 數(shù)據(jù)結(jié)構(gòu)自動(dòng)轉(zhuǎn)換為 NumPy 多維數(shù)組

數(shù)據(jù)集說(shuō)明

數(shù)據(jù)集以 CSV 文件表示,我們將使用 Pandas 庫(kù)打開它。

數(shù)據(jù)集包含以下變量:

  • CRIM:按城鎮(zhèn)劃分的人均犯罪率
  • ZN:劃定面積超過(guò) 25,000 平方英尺的住宅用地的比例。
  • INDUS:每個(gè)城鎮(zhèn)的非零售業(yè)務(wù)英畝比例
  • CHAS:查爾斯河虛擬變量(如果區(qū)域限制河流,則為 1;否則為 0)
  • NOX:一氧化氮濃度(百萬(wàn)分之幾)
  • RM:每個(gè)住宅的平均房間數(shù)
  • AGE:1940 年之前建造的自有住房的比例
  • DIS:到五個(gè)波士頓就業(yè)中心的加權(quán)距離
  • RAD:徑向公路的可達(dá)性指數(shù)
  • TAX:每 10,000 美元的全值財(cái)產(chǎn)稅率
  • PTRATIO:按城鎮(zhèn)劃分的師生比率
  • LSTAT:人口狀況降低百分比
  • MEDV:自有住房的中位數(shù)價(jià)值,以 1000 美元為單位

在這里,我們有一個(gè)簡(jiǎn)單的程序,它將讀取數(shù)據(jù)集并創(chuàng)建數(shù)據(jù)的詳細(xì)說(shuō)明:

import tensorflow.contrib.learn as skflow 
fromsklearn import datasets, metrics, preprocessing 
import numpy as np 
import pandas as pd df = pd.read_csv("data/boston.csv", header=0) 
printdf.describe() 

這將輸出數(shù)據(jù)集變量的統(tǒng)計(jì)摘要。 前六個(gè)結(jié)果如下:


CRIM         ZN       INDUS         CHAS         NOX          RM  \ 
count  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000    
mean     3.613524   11.363636   11.136779    0.069170    0.554695    6.284634    
std      8.601545   23.322453    6.860353    0.253994    0.115878    0.702617    
min      0.006320    0.000000    0.460000    0.000000    0.385000    3.561000    
25%      0.082045    0.000000    5.190000    0.000000    0.449000    5.885500   
50%      0.256510    0.000000    9.690000    0.000000    0.538000    6.208500    
75%      3.677082   12.500000   18.100000    0.000000    0.624000    6.623500    
max     88.976200  100.000000   27.740000    1.000000    0.871000    8.780000    

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8c6Trn4Q-1681565530628)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00054.jpg)]

模型架構(gòu)

在此示例中,我們將使用的模型很簡(jiǎn)單,但是幾乎包含了處理更復(fù)雜模型所需的所有元素。

在下圖中,我們看到了整個(gè)設(shè)置的不同參與者:模型,損失函數(shù)和梯度。 TensorFlow 真正有用的功能是能夠自動(dòng)微分模型和函數(shù)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-XFlW4Noc-1681565530629)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00055.jpg)]

在這里,我們可以找到上一節(jié)中表示的變量的定義:wb和模型線性方程。

X = tf.placeholder("float", name="X") # create symbolic variables 
Y = tf.placeholder("float", name = "Y") withtf.name_scope("Model"): w = tf.Variable(tf.random_normal([2], stddev=0.01), name="b0") # create a shared variable b = tf.Variable(tf.random_normal([2], stddev=0.01), name="b1") # create a shared variable 
def model(X, w, b): 
returntf.mul(X, w) + b # We just define the line as X*w + b0   
y_model = model(X, w, b)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-0ND9lfEc-1681565530629)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00056.jpg)]

損失函數(shù)說(shuō)明和優(yōu)化器循環(huán)

在此示例中,我們將使用常用的均方誤差,但是這次使用了多變量; 因此我們應(yīng)用reduce_mean來(lái)收集不同維度上的誤差值:

withtf.name_scope("CostFunction"): cost = tf.reduce_mean(tf.pow(Y-y_model, 2)) # use sqr error for cost function 
train_op = tf.train.AdamOptimizer(0.1).minimize(cost)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-mkhyVQjR-1681565530629)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00057.jpg)]

 for a in range (1,10): cost1=0.0 
fori, j in zip(xvalues, yvalues):    
sess.run(train_op, feed_dict={X: i, Y: j})  cost1+=sess.run(cost, feed_dict={X: i, Y: i})/506.00 #writer.add_summary(summary_str, i)  
xvalues, yvalues = shuffle (xvalues, yvalues) 

停止條件

停止條件將僅由針對(duì)所有數(shù)據(jù)樣本訓(xùn)練參數(shù)來(lái)確定外循環(huán)中確定的周期數(shù)。

結(jié)果描述

結(jié)果如下:

1580.53295174 
[ 2.25225258  1.30112672] 
[ 0.80297691  0.22137061] 
1512.3965525 
[ 4.62365675  2.90244412] 
[ 1.16225874  0.28009811] 
1495.47174799 
[ 6.52791834  4.29297304] 
[ 0.824792270.17988272] 
... 
1684.6247849 
[ 29.71323776  29.96078873] 
[-0.68271929 -0.13493828] 
1688.25864746 
[ 29.78564262  30.09841156] 
[-0.58272243 -0.08323665] 
1684.27538102 
[ 29.75390816  30.13044167] 
[-0.59861398 -0.11895057] 

從結(jié)果中我們可以看到,在訓(xùn)練的最后階段,建模線同時(shí)基于以下系數(shù):

price = 0.6 x Industry + 29.75

price = 0.1 x Age + 30.13

完整源代碼

以下是完整的源代碼:

import matplotlib.pyplot as plt 
import tensorflow as tf 
import tensorflow.contrib.learn as skflow 
from sklearn.utils import shuffle 
import numpy as np 
import pandas as pd df = pd.read_csv("data/boston.csv", header=0) 
printdf.describe() f, ax1 = plt.subplots() 
plt.figure() # Create a new figure y = df['MEDV'] for i in range (1,8): number = 420 + i ax1.locator_params(nbins=3) ax1 = plt.subplot(number) plt.title(list(df)[i]) ax1.scatter(df[df.columns[i]],y) #Plot a scatter draw of the datapoints 
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0) X = tf.placeholder("float", name="X") # create symbolic variables 
Y = tf.placeholder("float", name = "Y") with tf.name_scope("Model"): w = tf.Variable(tf.random_normal([2], stddev=0.01), name="b0") # create a shared variable b = tf.Variable(tf.random_normal([2], stddev=0.01), name="b1") # create a shared variable def model(X, w, b): return tf.mul(X, w) + b # We just define the line as X*w + b0   y_model = model(X, w, b) with tf.name_scope("CostFunction"): cost = tf.reduce_mean(tf.pow(Y-y_model, 2)) # use sqr error for cost function train_op = tf.train.AdamOptimizer(0.001).minimize(cost) sess = tf.Session() 
init = tf.initialize_all_variables() 
tf.train.write_graph(sess.graph, '/home/bonnin/linear2','graph.pbtxt') 
cost_op = tf.scalar_summary("loss", cost) 
merged = tf.merge_all_summaries() 
sess.run(init) 
writer = tf.train.SummaryWriter('/home/bonnin/linear2', sess.graph) xvalues = df[[df.columns[2], df.columns[4]]].values.astype(float) 
yvalues = df[df.columns[12]].values.astype(float) 
b0temp=b.eval(session=sess) 
b1temp=w.eval(session=sess) for a in range (1,10): cost1=0.0 
for i, j in zip(xvalues, yvalues):    
sess.run(train_op, feed_dict={X: i, Y: j})  cost1+=sess.run(cost, feed_dict={X: i, Y: i})/506.00 #writer.add_summary(summary_str, i)  
xvalues, yvalues = shuffle (xvalues, yvalues) 
print (cost1) 
b0temp=b.eval(session=sess) 
b1temp=w.eval(session=sess) 
print (b0temp) 
print (b1temp) 
#plt.plot (trX, b0temp + b1temp * trX ) 

總結(jié)

在本章中,我們使用 TensorFlow 的訓(xùn)練工具構(gòu)建了第一個(gè)具有標(biāo)準(zhǔn)損失函數(shù)的完整模型。 我們還建立了一個(gè)多元模型來(lái)說(shuō)明多個(gè)維度來(lái)計(jì)算回歸。 除此之外,我們使用 TensorBoard 在訓(xùn)練階段觀察變量的行為。

在下一章中,我們將開始使用非線性模型,通過(guò)它我們將更接近神經(jīng)網(wǎng)絡(luò)領(lǐng)域,這是 TensorFlow 的主要支持領(lǐng)域,其效用提供了巨大價(jià)值。

四、邏輯回歸

在上一章中,我們已經(jīng)看到了一種將現(xiàn)實(shí)的一部分建模為線性函數(shù)的方法,該函數(shù)具有獨(dú)立變量,并且偏差最小化了誤差函數(shù)。

除了某些非常明確定義的問(wèn)題(預(yù)期結(jié)果是連續(xù)的變量和函數(shù))之外,這種特殊的分析還不夠。

但是,如果我們面對(duì)具有定性因變量的數(shù)據(jù),將會(huì)發(fā)生什么? 例如,是否存在確定的特征; 受試者有金色的頭發(fā)嗎? 病人以前有病嗎?

這些是我們將在本章中處理的問(wèn)題。

問(wèn)題描述

線性回歸旨在解決的問(wèn)題不是基于連續(xù)函數(shù)的值預(yù)測(cè),這一次,我們想知道樣本屬于確定類別的可能性。

在本章中,我們將依靠線性模型的一般化來(lái)解決回歸問(wèn)題,但最終目標(biāo)是解決分類問(wèn)題,我們必須應(yīng)用標(biāo)簽或?qū)⒂^察集中的所有元素分配給預(yù)定義的組。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-4ifUV32H-1681565530630)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00058.jpg)]

在上圖中,我們可以看到如何對(duì)舊問(wèn)題和新問(wèn)題進(jìn)行分類。 第一個(gè)(線性回歸)可以想象為值不斷增長(zhǎng)的連續(xù)體。

另一個(gè)是基于x值的輸出只能具有兩個(gè)不同值的域。 在第二張圖的特定情況下,我們可以看到對(duì)其中一個(gè)選項(xiàng)的特定偏向極端:在左側(cè),y值偏向 0,在右側(cè)偏向 1。

鑒于即使在進(jìn)行回歸從而尋找連續(xù)值的情況下,這種項(xiàng)也可能有些棘手,實(shí)際上,最終目標(biāo)是為具有離散變量的分類問(wèn)題建立預(yù)測(cè)。

此處的關(guān)鍵是要了解我們將獲得與類有關(guān)的項(xiàng)目的概率,而不是完全離散的值。

sigmoid 函數(shù)的前身 – 對(duì)率(Logit)函數(shù)

在研究邏輯函數(shù)之前,我們將回顧該函數(shù)所基于的原始函數(shù),并為其提供一些更一般的屬性。

本質(zhì)上,當(dāng)我們談?wù)?code>logit函數(shù)時(shí),我們正在使用隨機(jī)變量p的函數(shù),更具體地說(shuō),是與伯努利分布相對(duì)應(yīng)的函數(shù)。

伯努利分布

在解釋理論細(xì)節(jié)之前,值得注意的是伯努利分布是一個(gè)隨機(jī)變量,它具有:

  • 取值為 0 且失敗概率為q = 1 - p

  • 取值為 1,成功概率為p

可以表示如下(對(duì)于具有伯努利分布的隨機(jī)變量X):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-sxWmkKuM-1681565530630)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00059.jpg)]

這是一種概率分布,它將以二元選項(xiàng)的形式表示事件的發(fā)生概率,就像我們要表示自己的變量(特征的存在,事件的發(fā)生,現(xiàn)象的因果關(guān)系等)一樣。

鏈接函數(shù)

在嘗試建立廣義線性模型時(shí),我們要從線性函數(shù)開始,并從因變量開始,獲取到概率分布的映射。

由于選項(xiàng)具有二元性質(zhì),因此通常選擇的分布是最近提到的伯努利分布,而傾向于 logistic 函數(shù)的鏈接函數(shù)是logit函數(shù)。

Logit 函數(shù)

我們可以利用的可能變量之一是p等于 1 的幾率的自然對(duì)數(shù)。 此函數(shù)稱為logit函數(shù):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Phep35l4-1681565530630)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00060.jpg)]

我們也可以將logit函數(shù)稱為對(duì)數(shù)奇數(shù)函數(shù),因?yàn)閷?duì)于給定的概率p,我們正在計(jì)算賠率的對(duì)數(shù)(p/1-p)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-pzmX4keW-1681565530630)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00061.jpg)]

因此,正如我們可以直觀地推斷出的那樣,用自變量的組合替換X,無(wú)論它們的值是什么,用從負(fù)無(wú)窮大到無(wú)窮大的任何出現(xiàn)替換X,我們將響應(yīng)縮放到01

Logit 反函數(shù)的重要性

假設(shè)我們計(jì)算logit函數(shù)的逆。 這將使我們編寫以下函數(shù):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-gi8M9DTK-1681565530631)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00062.jpg)]

此函數(shù)是sigmoid函數(shù)。

sigmoid 函數(shù)

邏輯函數(shù)將幫助我們?cè)谛碌幕貧w任務(wù)中表示二元類別。

在下圖中,您將找到sigmoid函數(shù)的圖形表示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Nij3F5jG-1681565530631)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00063.jpg)]

邏輯函數(shù)或 Sigmoid 的圖形表示

Logistic 函數(shù)作為線性建模的泛化

邏輯函數(shù)δ(t)定義如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-F0n8kyOi-1681565530631)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00064.jpg)]

該方程式的正常解釋是t代表一個(gè)簡(jiǎn)單的自變量。 但是,我們將改進(jìn)此模型,并假定t是單個(gè)解釋變量x的線性函數(shù)(對(duì)t是多個(gè)解釋變量的線性組合的情況進(jìn)行類似處理)。

然后,我們將t表示為:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-TQ4V6qZQ-1681565530631)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00065.jpg)]

最終估計(jì)的回歸方程

因此,我們從以下等式開始:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-wZbVQUVE-1681565530631)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00066.jpg)]

使用所有這些元素,我們可以計(jì)算回歸方程,這將為我們提供回歸概率:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-bPzorWNP-1681565530632)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00067.jpg)]

下圖將顯示如何將從任意范圍的映射最終轉(zhuǎn)換為范圍[0, 1],該范圍可以解釋為表示事件發(fā)生的概率p

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-tSJNFqD1-1681565530632)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00068.jpg)]

什么影響會(huì)改變線性函數(shù)的參數(shù)? 它們是將更改sigmoid函數(shù)的中心斜率和從零開始的位移的值,從而使其可以更精確地減小回歸值與實(shí)際數(shù)據(jù)點(diǎn)之間的誤差。

Logistic 函數(shù)的屬性

函數(shù)空間中的每條曲線都可以通過(guò)可能適用的目標(biāo)來(lái)描述。 對(duì)于 logistic 函數(shù),它們是:

  • 根據(jù)一個(gè)或多個(gè)獨(dú)立變量對(duì)事件的概率p進(jìn)行建模。 例如,鑒于先前的資格,被授予獎(jiǎng)品的可能性。
  • 對(duì)確定的觀測(cè)值進(jìn)行估計(jì)(這是回歸部分)p,與事件未發(fā)生的可能性有關(guān)。
  • 預(yù)測(cè)自變量變化對(duì)二元響應(yīng)的影響。
  • 通過(guò)計(jì)算某項(xiàng)屬于確定類別的概率對(duì)觀察進(jìn)行分類。

損失函數(shù)

在上一節(jié)中,我們看到了近似的p^函數(shù),該函數(shù)將對(duì)樣本屬于特定類別的概率進(jìn)行建模。 為了衡量我們對(duì)解的近似程度,我們將尋找精心選擇的損失函數(shù)。

該損失函數(shù)表示為:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-L25QSOMs-1681565530632)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00069.jpg)]

該損失函數(shù)的主要特性是它不會(huì)以類似的方式懲罰誤差,當(dāng)誤差增加到遠(yuǎn)遠(yuǎn)超過(guò) 0.5 時(shí),誤差懲罰因子會(huì)漸近增長(zhǎng)。

多類應(yīng)用 – softmax 回歸

到目前為止,我們僅針對(duì)兩個(gè)類的情況進(jìn)行分類,或者以概率語(yǔ)言對(duì)事件發(fā)生概率p進(jìn)行分類。

在要決定兩個(gè)以上類別的情況下,有兩種主要方法: 一對(duì)一,一對(duì)剩余。

  • 第一種技術(shù)包括計(jì)算許多模型,這些模型代表每個(gè)類別相對(duì)于所有其他類別的概率。
  • 第二個(gè)由一組概率組成,其中我們代表一個(gè)類別相對(duì)于所有其他類別的概率。
  • 第二種方法是softmax回歸的輸出格式,它是 n 個(gè)類的邏輯回歸的概括。

因此,為了訓(xùn)練樣本,我們將使用句柄y(i)ε{1,...,K},將二元標(biāo)簽( y(i)ε{0,1})更改為向量標(biāo)簽,其中K是類別數(shù),標(biāo)簽Y可以采用K不同的值, 而不是只有兩個(gè)。

因此,對(duì)于這種特定技術(shù),給定測(cè)試輸入X,我們想要針對(duì)k=1,...,K的每個(gè)值估計(jì)Py=k|x)的概率。 softmax回歸將輸出K維向量(其元素總和為 1),從而為我們提供了K估計(jì)的概率。

在下圖中,我們表示在單類和多類邏輯回歸的概率映射上發(fā)生的映射:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-CdzE9OFP-1681565530632)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00070.jpg)]

成本函數(shù)

softmax函數(shù)的成本函數(shù)是自適應(yīng)的交叉熵函數(shù),該函數(shù)不是線性的,因此對(duì)大階函數(shù)差異的懲罰要比對(duì)小階函數(shù)的懲罰更大。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-NaqLMQwz-1681565530633)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00071.jpg)]

在這里,c是類別編號(hào),I是各個(gè)訓(xùn)練樣本索引,yc對(duì)于期望的類別為 1,對(duì)于其余類別為 0。

擴(kuò)展這個(gè)方程,我們得到以下結(jié)果:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-k6NvbKDg-1681565530633)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00072.jpg)]

迭代方法的數(shù)據(jù)標(biāo)準(zhǔn)化

正如我們將在以下各節(jié)中看到的那樣,對(duì)于邏輯回歸,我們將使用gradient descent方法來(lái)最小化成本函數(shù)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-zIoGFCDt-1681565530633)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00073.jpg)]

此方法對(duì)特征數(shù)據(jù)的形式和分布非常敏感。

因此,我們將進(jìn)行一些預(yù)處理,以便獲得更好,更快的收斂結(jié)果。

我們將把這種方法的理論原因留給其他書籍,但我們將總結(jié)其原因,即通過(guò)歸一化可以平滑誤差表面,使迭代gradient descent更快地達(dá)到最小誤差。

輸出的單熱表示

為了將softmax函數(shù)用作回歸函數(shù),我們必須使用一種稱為單熱編碼的編碼。 這種編碼形式只是將變量的數(shù)字整數(shù)值轉(zhuǎn)換為數(shù)組,其中將值列表轉(zhuǎn)換為數(shù)組列表,每個(gè)數(shù)組的長(zhǎng)度與該列表的最大值相同,并且每個(gè)數(shù)組的表示方式是在值的索引上添加 1,其余元素保持為 0。

例如,這將是單熱編碼形式的列表[1, 3, 2, 4]的表示形式:

[[0 1 0 0 0] 
[0 0 0 1 0] 
[0 0 1 0 0]
[0 0 0 0 1]]

示例 1 – 單變量 logistic 回歸

在第一個(gè)示例中,我們將使用單變量 logistic 回歸(患者年齡)來(lái)估計(jì)心臟病的概率。

有用的庫(kù)和方法

從 0.8 版開始,TensorFlow 提供了一種生成熱點(diǎn)的方法。 用于此生成的函數(shù)是tf.one_hot,其形式如下:

tf.one_hot(indices, depth, on_value=1, off_value=0, axis=None, dtype=tf.float32, name=None)

此函數(shù)生成通用的單熱編碼數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)可以指定值,生成軸,數(shù)據(jù)類型等。

在生成的張量中,索引的指示值將采用on_value(默認(rèn)值為1),其他值將具有off_value(默認(rèn)0)。

Dtype是生成的張量的數(shù)據(jù)類型; 默認(rèn)值為float32。

depth變量定義每個(gè)元素將具有多少列。 我們假設(shè)它在邏輯上應(yīng)該為max(indices) + 1,但也可以將其切掉。

TensorFlow 的 softmax 實(shí)現(xiàn)

在 TensorFlow 中應(yīng)用softmax回歸的方法包括tf.nn.log_softmax, with the following form:

tf.nn.log_softmax(logits, name=None)

在這里,參數(shù)為:

  • logits:張量必須為以下類型之一:float32float64 形狀為[batch_size, num_classes]的 2D
  • name:操作的名稱(可選)

此函數(shù)返回具有與logits相同類型和形狀的張量。

數(shù)據(jù)集說(shuō)明和加載

我們將討論的第一種情況是我們要擬合邏輯回歸的方法,僅測(cè)量一個(gè)變量,并且只有兩個(gè)可能的結(jié)果。

CHDAGE 數(shù)據(jù)集

對(duì)于第一個(gè)簡(jiǎn)單的示例,我們將使用一個(gè)非常簡(jiǎn)單且經(jīng)過(guò)研究的數(shù)據(jù)集,該數(shù)據(jù)集以在書中出版而聞名。 應(yīng)用邏輯回歸第三版,David W. Hosmer Jr.,Stanley Lemeshow,Rodney X. Sturdivant,作者:Wiley。

列出age的年限(AGE),以及對(duì)心臟病風(fēng)險(xiǎn)因素進(jìn)行假設(shè)性研究的 100 名受試者是否患有嚴(yán)重冠心病(CHD)的證據(jù)。 該表還包含一個(gè)標(biāo)識(shí)符變量(ID)和一個(gè)年齡組變量(AGEGRP)。 結(jié)果變量是 CHD,它用0值編碼以表示不存在 CHD,或用1編碼以指示其存在于個(gè)體中。 通常,可以使用任何兩個(gè)值,但是我們發(fā)現(xiàn)使用零和一最為方便。 我們將此數(shù)據(jù)集稱為 CHDAGE 數(shù)據(jù)。

CHDAGE 數(shù)據(jù)集格式

CHDAGE 數(shù)據(jù)集是一個(gè)兩列的 CSV 文件,我們將從外部倉(cāng)庫(kù)下載該文件。

在第 1 章(探索和轉(zhuǎn)換數(shù)據(jù))中,我們使用了本機(jī) TensorFlow 方法來(lái)讀取數(shù)據(jù)集。 在本章中,我們將使用一個(gè)互補(bǔ)且流行的庫(kù)來(lái)獲取數(shù)據(jù)。

進(jìn)行此新添加的原因是,鑒于數(shù)據(jù)集只有 100 個(gè)元組,實(shí)際上只需要一行讀取即可,而且pandas庫(kù)提供了免費(fèi)但簡(jiǎn)單但強(qiáng)大的分析方法 。

因此,在該項(xiàng)目的第一階段,我們將開始加載 CHDAGE 數(shù)據(jù)集的實(shí)例,然后將打印有關(guān)數(shù)據(jù)的重要統(tǒng)計(jì)信息,然后進(jìn)行預(yù)處理。

在對(duì)數(shù)據(jù)進(jìn)行一些繪制之后,我們將構(gòu)建一個(gè)由激活函數(shù)組成的模型,該激活函數(shù)將在特殊情況下成為softmax函數(shù),在特殊情況下它將變?yōu)闃?biāo)準(zhǔn)邏輯回歸。 那就是只有兩個(gè)類別(疾病的存在與否)。

數(shù)據(jù)集加載和預(yù)處理實(shí)現(xiàn)

首先,我們導(dǎo)入所需的庫(kù),并指示所有matplotlib程序都將內(nèi)聯(lián)(如果我們使用 Jupyter):

>>> import pandas as pd 
>>> import numpy as np 
>>> %matplotlib inline 
>>> import matplotlib.pyplot as plt 

然后,我們讀取數(shù)據(jù)并要求pandas檢查有關(guān)數(shù)據(jù)集的重要統(tǒng)計(jì)信息:

>>> df = pd.read_csv("data/CHD.csv", header=0) 
>>> print df.describe() 
    age        chdcount  100.000000  100.00000mean    44.380000    0.43000std     11.721327    0.49757min     20.000000    0.0000025%     34.750000    0.0000050%     44.000000    0.0000075%     55.000000    1.00000max     69.000000    1.000000

然后,我們繼續(xù)繪制數(shù)據(jù)以了解數(shù)據(jù):

plt.figure() # Create a new figure 
plt.scatter(df['age'],df['chd']) #Plot a scatter draw of the random datapoints 

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-sxa02vg9-1681565530633)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00074.jpg)]

模型架構(gòu)

在這里,我們從以下變量開始,描述將在其中構(gòu)建模型元素的代碼部分:

learning_rate = 0.8 #Learning speed 
batch_size = 100 #number of samples for the batch 
display_step = 2 #number of steps before showing progress

在這里,我們?yōu)閳D創(chuàng)建初始變量和占位符,即單變量xy浮點(diǎn)值:

x = tf.placeholder("float", [None, 1]) # Placeholder for the 1D data 
y = tf.placeholder("float", [None, 2]) # Placeholder for the classes (2)

現(xiàn)在,我們將創(chuàng)建線性模型變量,隨著模型擬合的進(jìn)行,將對(duì)其進(jìn)行修改和更新:

W = tf.Variable(tf.zeros([1, 2])) 
b = tf.Variable(tf.zeros([2]))

最后,我們將對(duì)線性函數(shù)應(yīng)用softmax操作來(lái)構(gòu)建激活函數(shù):

activation = tf.nn.softmax(tf.matmul(x, W) + b) 

損失函數(shù)描述和優(yōu)化器循環(huán)

在這里,我們僅將互相關(guān)函數(shù)定義為loss函數(shù),并定義optimizer操作,即gradient descent。 以下各章將對(duì)此進(jìn)行解釋; 現(xiàn)在,您可以看到它是一個(gè)黑框,它將改變變量,直到損失最小:

cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(activation), reduction_indices=1)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 
#Iterate through all the epochs 
for epoch in range(training_epochs): avg_cost = 0\. total_batch = 400/batch_size 
# Loop over all batches for i in range(total_batch): # Transform the array into a one hot format temp=tf.one_hot(indices = df['chd'].values, depth=2, on_value = 1, off_value = 0, axis = -1 , name = "a")       batch_xs, batch_ys =(np.transpose([df['age']])-44.38)/11.721327, temp # Fit training using batch data sess.run(optimizer, feed_dict={x: batch_xs.astype(float), y: batch_ys.eval()}) # Compute average loss, suming the corrent cost divided by the batch total number avg_cost += sess.run(cost, feed_dict={x: batch_xs.astype(float), y: batch_ys.eval()})/total_batch 

停止條件

一旦根據(jù)訓(xùn)練周期對(duì)數(shù)據(jù)進(jìn)行了訓(xùn)練,該過(guò)程將簡(jiǎn)單地停止。

結(jié)果描述

這將是程序的輸出:

Epoch: 0001 cost= 0.638730764
[ 0.04824295 -0.04824295]
[[-0.17459483  0.17459483]]
Epoch: 0002 cost= 0.589489654
[ 0.08091066 -0.08091066]
[[-0.29231569  0.29231566]]
Epoch: 0003 cost= 0.565953553
[ 0.10427245 -0.10427245]
[[-0.37499282  0.37499279]]
Epoch: 0004 cost= 0.553756475
[ 0.12176144 -0.12176143]
[[-0.43521613  0.4352161 ]]
Epoch: 0005 cost= 0.547019333
[ 0.13527818 -0.13527818]
[[-0.48031801  0.48031798]]

擬合函數(shù)的跨周期表示

在下圖中,我們表示了擬合函數(shù)在不同周期之間的進(jìn)展:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3z25VL4q-1681565530633)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00075.jpg)]

完整源代碼

這是完整的源代碼:

import pandas as pd 
import numpy as np 
get_ipython().magic(u'matplotlib inline') 
import matplotlib.pyplot as plt 
import tensorflow as tf df = pd.read_csv("data/CHD.csv", header=0) 
# Parameters learning_rate = 0.2 
training_epochs = 5 
batch_size = 100 
display_step = 1 
sess = tf.Session() 
b=np.zeros((100,2)) # tf Graph Input x = tf.placeholder("float", [None, 1]) 
y = tf.placeholder("float", [None, 2]) # Create model 
# Set model weights 
W = tf.Variable(tf.zeros([1, 2])) 
b = tf.Variable(tf.zeros([2])) # Construct model 
activation = tf.nn.softmax(tf.matmul(x, W) + b) 
# Minimize error using cross entropy 
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(activation), reduction_indices=1)) # Cross entropy 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) # Gradient Descent # Initializing the variables 
init = tf.initialize_all_variables() # Launch the graph with tf.Session() as sess: tf.train.write_graph(sess.graph, './graphs','graph.pbtxt') sess.run(init) writer = tf.train.SummaryWriter('./graphs', sess.graph) #Initialize the graph structure graphnumber=321 #Generate a new graph plt.figure(1) #Iterate through all the epochs for epoch in range(training_epochs): avg_cost = 0\. total_batch = 400/batch_size # Loop over all batches for i in range(total_batch): # Transform the array into a one hot format temp=tf.one_hot(indices = df['chd'].values, depth=2, on_value = 1, off_value = 0, axis = -1 , name = "a")       batch_xs, batch_ys = (np.transpose([df['age']])-44.38)/11.721327, temp # Fit training using batch data sess.run(optimizer, feed_dict={x: batch_xs.astype(float), y: batch_ys.eval()}) # Compute average loss, suming the corrent cost divided by the batch total number avg_cost += sess.run(cost, feed_dict={x: batch_xs.astype(float), y: batch_ys.eval()})/total_batch # Display logs per epoch step if epoch % display_step == 0: print "Epoch:", '%05d' % (epoch+1), "cost=", "{:.8f}".format(avg_cost) #Generate a new graph, and add it to the complete graph trX = np.linspace(-30, 30, 100) print (b.eval()) print (W.eval()) Wdos=2*W.eval()[0][0]/11.721327 bdos=2*b.eval()[0] # Generate the probabiliy function trY = np.exp(-(Wdos*trX)+bdos)/(1+np.exp(-(Wdos*trX)+bdos) ) # Draw the samples and the probability function, whithout the normalization plt.subplot(graphnumber) graphnumber=graphnumber+1 #Plot a scatter draw of the random datapoints plt.scatter((df['age']),df['chd']) plt.plot(trX+44.38,trY) #Plot a scatter draw of the random datapoints plt.grid(True) #Plot the final graph plt.savefig("test.svg")  

圖形表示

使用 TensorBoard 工具,我們將看到操作鏈。 請(qǐng)注意,在一半的操作圖中,我們定義了主要的全局操作(“小數(shù)點(diǎn)”)以及應(yīng)用于其余項(xiàng)的梯度操作,這是進(jìn)行loss函數(shù)最小化所必需的。 這是接下來(lái)幾章要討論的主題。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-wuki5HeP-1681565530634)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00076.jpg)]

示例 2 – skflow 中的單變量 logistic 回歸

在此示例中,我們將探索單變量示例域,但是這次我們將使用來(lái)自新庫(kù)的幫助,該庫(kù)為我們簡(jiǎn)化了模型構(gòu)建,稱為skflow

有用的庫(kù)和方法

在機(jī)器學(xué)習(xí)庫(kù)領(lǐng)域中,有很多選擇。 最知名的之一是sklearn,我們?cè)诘?2 章聚類中討論過(guò)。

在 TensorFlow 發(fā)布之后的很早,一個(gè)新的貢獻(xiàn)庫(kù)就出現(xiàn)了,叫做skflow,其主要目的是模擬sklearn的接口和工作流程,在這個(gè) TensorFlow 會(huì)話環(huán)境中工作更簡(jiǎn)潔。

在下面的示例中,我們將使用skflow接口重復(fù)先前回歸的分析。

在示例中,我們還將看到 skflow 如何為回歸模型自動(dòng)生成詳細(xì)且組織良好的圖,只需將日志目錄設(shè)置為參數(shù)即可。

數(shù)據(jù)集說(shuō)明

使用pandas庫(kù),數(shù)據(jù)集加載階段與前面的示例相同:

import pandas as pd df = pd.read_csv("data/CHD.csv", header=0) 
print df.describe() 

模型架構(gòu)

這是my_model的代碼段:

 def my_model(X, y): return skflow.models.logistic_regression(X, y) X1 =a.fit_transform(df['age'].astype(float)) 
y1 = df['chd'].values 
classifier = skflow.TensorFlowEstimator(model_fn=my_model, n_classes=2) 

在這里,我們可以使用softmax分類器查看邏輯回歸階段的詳細(xì)視圖:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-DjDDufc7-1681565530634)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00077.jpg)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-VRjSeN5w-1681565530634)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00078.jpg)]

結(jié)果描述

score = metrics.accuracy_score(df['chd'].astype(float), classifier.predict(X)) 
print("Accuracy: %f" % score) 

輸出結(jié)果可觀(為了簡(jiǎn)化模型)74% 的準(zhǔn)確率:

Accuracy: 0.740000

完整源代碼

這是完整的源代碼:

import tensorflow.contrib.learn as skflow 
from sklearn import datasets, metrics, preprocessing 
import numpy as np 
import pandas as pd df = pd.read_csv("data/CHD.csv", header=0) 
print df.describe() def my_model(X, y): return skflow.models.logistic_regression(X, y) a = preprocessing.StandardScaler() X1 =a.fit_transform(df['age'].astype(float)) y1 = df['chd'].values classifier = skflow.TensorFlowEstimator(model_fn=my_model, n_classes=2) 
classifier.fit(X1,y1 , logdir='/tmp/logistic') score = metrics.accuracy_score(df['chd'].astype(float), classifier.predict(X)) 
print("Accuracy: %f" % score) 

總結(jié)

在本章中,我們學(xué)習(xí)了一種新的建模技術(shù),即邏輯函數(shù),并從一種簡(jiǎn)單的分類任務(wù)入手。

我們還學(xué)習(xí)了一種通過(guò)pandas庫(kù)讀取基于文本的數(shù)據(jù)的新方法。

此外,我們還看到了與skflow庫(kù)一起使用的經(jīng)典工作流的一種補(bǔ)充方法。

在下一章中,我們將開始處理更復(fù)雜的架構(gòu),并進(jìn)入 TensorFlow 庫(kù)擅長(zhǎng)的領(lǐng)域:訓(xùn)練,測(cè)試和最終實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)以解決實(shí)際問(wèn)題。

五、簡(jiǎn)單的前饋神經(jīng)網(wǎng)絡(luò)

神經(jīng)網(wǎng)絡(luò)確實(shí)是 Tensorflow 擅長(zhǎng)的機(jī)器學(xué)習(xí)領(lǐng)域。 可以用它實(shí)現(xiàn)多種類型的架構(gòu)和算法,以及結(jié)合了符號(hào)引擎的其他優(yōu)點(diǎn),這實(shí)際上將有助于訓(xùn)練更復(fù)雜的設(shè)置。

在本章中,我們開始利用高表現(xiàn)原語(yǔ)的功能來(lái)解決大量支持輸入變量的日益復(fù)雜的問(wèn)題。

在本章中,我們將介紹以下主題:

  • 神經(jīng)網(wǎng)絡(luò)的初步概念
  • 非線性一般函數(shù)回歸的神經(jīng)網(wǎng)絡(luò)項(xiàng)目
  • 利用非線性回歸預(yù)測(cè)汽車燃油效率的項(xiàng)目
  • 學(xué)習(xí)葡萄酒的分類和多分類

初步概念

為了將簡(jiǎn)單的框架構(gòu)建到神經(jīng)網(wǎng)絡(luò)的組件和架構(gòu)中,我們將對(duì)原始概念進(jìn)行簡(jiǎn)單明了的構(gòu)建,這些原始概念為當(dāng)前,復(fù)雜而多樣的神經(jīng)網(wǎng)絡(luò)格局鋪平了道路。

人工神經(jīng)元

人工神經(jīng)元是一種數(shù)學(xué)函數(shù),被視為真實(shí)生物神經(jīng)元的模型。

它的主要特征是它接收一個(gè)或多個(gè)輸入(訓(xùn)練數(shù)據(jù)),并對(duì)它們求和以產(chǎn)生輸出。 此外,通常對(duì)總和進(jìn)行加權(quán)(權(quán)重和偏差),然后將總和傳遞給非線性函數(shù)(激活函數(shù)或傳遞函數(shù))。

原始示例 – 感知器

感知器是實(shí)現(xiàn)人工神經(jīng)元的最簡(jiǎn)單方法之一,并且它的算法可以追溯到 1950 年代,最早是在 1960 年代實(shí)現(xiàn)的。

從本質(zhì)上講,它是一種學(xué)習(xí)二分類函數(shù)的算法,該算法將一個(gè)實(shí)數(shù)映射為兩個(gè)數(shù):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-1Iml1Nkg-1681565530634)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00079.jpg)]

下圖顯示了單層感知器

感知機(jī)算法

感知器的簡(jiǎn)化算法為:

  1. 用隨機(jī)分布初始化權(quán)重(通常為低值)

  2. 選擇一個(gè)輸入向量并將其呈現(xiàn)給網(wǎng)絡(luò),

  3. 為指定的輸入向量和權(quán)重值計(jì)算網(wǎng)絡(luò)的輸出y'。

  4. 用于感知機(jī)的函數(shù)是:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-fn66L6jG-1681565530635)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00080.jpg)]

  5. 如果y' ≠ y,則通過(guò)添加更改Δw = yx[i]修改所有連接w[i]

  6. 返回步驟 2。

神經(jīng)網(wǎng)絡(luò)層

單層感知器可以推廣到彼此連接的多個(gè)層,但是仍然存在問(wèn)題;表示函數(shù)是輸入的線性組合,并且感知器只是一種線性分類器,不可能正確擬合非線性函數(shù)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-xqeTeIVG-1681565530635)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00081.jpg)]

神經(jīng)網(wǎng)絡(luò)激活函數(shù)

僅靠單變量線性分類器,神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)表現(xiàn)就不會(huì)那么好。 甚至機(jī)器學(xué)習(xí)中的一些輕微復(fù)雜的問(wèn)題都涉及多個(gè)非線性變量,因此開發(fā)了許多變體來(lái)替代感知器的傳遞函數(shù)。

為了表示非線性模型,可以在激活函數(shù)中使用許多不同的非線性函數(shù)。 這意味著神經(jīng)元將對(duì)輸入變量的變化做出反應(yīng)的方式發(fā)生變化。 實(shí)際上,最常用的激活函數(shù)是:

  • Sigmoid: 規(guī)范的激活函數(shù),對(duì)于計(jì)算分類屬性的概率具有很好的屬性。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3fbEdJJb-1681565530635)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00082.jpg)]

  • Tanh: 與 Sigmoid 非常相似,但其值范圍是[-1,1]而不是[0,1]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Rj0tb9lI-1681565530635)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00083.jpg)]

  • Relu: 這稱為整流線性單元,其主要優(yōu)點(diǎn)之一是它不受“梯度消失”問(wèn)題的影響,該問(wèn)題通常存在于網(wǎng)絡(luò)的第一層,趨向于 0 或很小的epsilon值:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-1312xAmw-1681565530635)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00084.jpg)]

梯度和反向傳播算法

當(dāng)我們描述感知器的學(xué)習(xí)階段時(shí),我們描述了根據(jù)權(quán)重對(duì)最終誤差的“責(zé)任”來(lái)按比例調(diào)整權(quán)重的階段。

在這個(gè)復(fù)雜的神經(jīng)元網(wǎng)絡(luò)中,誤差的責(zé)任將分布在整個(gè)架構(gòu)中應(yīng)用于數(shù)據(jù)的所有函數(shù)之間。

因此,一旦我們計(jì)算了總誤差,并且將整個(gè)函數(shù)應(yīng)用于原始數(shù)據(jù),我們現(xiàn)在就必須嘗試調(diào)整方程式中的所有變量以將其最小化。

正如最優(yōu)化領(lǐng)域所研究的那樣,我們需要知道的是能夠使該誤差最小化的是損失函數(shù)的梯度。

鑒于數(shù)據(jù)要經(jīng)過(guò)許多權(quán)重和傳遞函數(shù),因此必須通過(guò)鏈?zhǔn)椒▌t來(lái)解決合成函數(shù)的梯度。

最小化損失函數(shù):梯度下降

讓我們看下圖以了解損失函數(shù):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-VJVT0Xkp-1681565530636)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00085.jpg)]

神經(jīng)網(wǎng)絡(luò)問(wèn)題的選擇 – 分類與回歸

神經(jīng)網(wǎng)絡(luò)可用于回歸問(wèn)題和分類問(wèn)題。 架構(gòu)上的共同差異在于輸出層:為了能夠帶來(lái)實(shí)數(shù)為基礎(chǔ)的結(jié)果,不應(yīng)應(yīng)用諸如 Sigmoid 之類的標(biāo)準(zhǔn)化函數(shù),這樣我們就不會(huì)將變量的結(jié)果更改為許多可能的類別值之一,獲得了可能的連續(xù)結(jié)果。

有用的庫(kù)和方法

在本章中,我們將使用 TensorFlow 和工具庫(kù)中的一些新工具,這些是最重要的工具:

TensorFlow 激活函數(shù)

TensorFlow 導(dǎo)航中最常用的函數(shù):

  • tf.sigmoid(x):標(biāo)準(zhǔn) Sigmoid 函數(shù)
  • tf.tanh(x):雙曲正切
  • tf.nn.relu(features):Relu 傳遞函數(shù)

TensorFlow 導(dǎo)航的其他函數(shù):

  • tf.nn.elu(features):計(jì)算指數(shù)線性:如果< 0則為exp(features) - 1,否則為features
  • tf.nn.softsign(features):計(jì)算 softsign:features / (abs(features) + 1)
  • tf.nn.bias_add(value, bias):為值增加偏差

TensorFlow 損失優(yōu)化方法

TensorFlow 損失優(yōu)化方法如下所述:

  • tf.train.GradientDescentOptimizer(learning_rate, use_locking, name):這是原始的梯度下降方法,僅具有學(xué)習(xí)率參數(shù)
  • tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value, use_locking, name):此方法使學(xué)習(xí)率適應(yīng)參數(shù)的頻率,從而提高了最小搜索稀疏參數(shù)的效率
  • tf.train.AdadeltaOptimizer(learning_rate, rho, epsilon, use_locking, name):這是改良的 AdaGrad,它將限制頻繁參數(shù)的累積到最大窗口,因此它考慮了一定數(shù)量的步驟,而不是整個(gè)參數(shù)歷史記錄。
  • tf.train.AdamOptimizer tf.train.AdamOptimizer.__init__(learning_rate, beta1, beta2, epsilon, use_locking, name):此方法在計(jì)算梯度時(shí)會(huì)添加一個(gè)因子,該因子對(duì)應(yīng)于過(guò)去梯度的平均值,等同于動(dòng)量因子。 因此,來(lái)自自適應(yīng)矩估計(jì)的亞當(dāng)這個(gè)名字。

Sklearn 預(yù)處理工具

讓我們看一下以下 Sklearn 預(yù)處理工具:

  • preprocessing.StandardScaler():數(shù)據(jù)集的正則化是許多機(jī)器學(xué)習(xí)估計(jì)器的普遍要求,因此,為了使收斂更加直接,數(shù)據(jù)集將必須更像是標(biāo)準(zhǔn)正態(tài)分布,即具有零均值和單位方差的高斯曲線。 在實(shí)踐中,我們通常會(huì)忽略分布的形狀,而只是通過(guò)刪除每個(gè)特征的平均值來(lái)變換數(shù)據(jù)以使其居中,然后通過(guò)將非恒定特征除以它們的標(biāo)準(zhǔn)偏差來(lái)縮放它。 對(duì)于此任務(wù),我們使用StandardScaler,它實(shí)現(xiàn)了前面提到的任務(wù)。 它還存儲(chǔ)轉(zhuǎn)換,以便能夠?qū)⑵渲匦聭?yīng)用于測(cè)試集。
  • StandardScaler 。 fit_transform():簡(jiǎn)單地將數(shù)據(jù)調(diào)整為所需格式。 StandardScaler對(duì)象將保存轉(zhuǎn)換變量,因此您將能夠取回非規(guī)格化數(shù)據(jù)。
  • cross_validation.train_test_split:此方法將數(shù)據(jù)集分為訓(xùn)練和測(cè)試段,我們只需要提供分配給每個(gè)階段的數(shù)據(jù)集的百分比即可。

第一個(gè)項(xiàng)目 – 非線性一般函數(shù)回歸

人工神經(jīng)網(wǎng)絡(luò)示例通常包含絕大多數(shù)分類問(wèn)題,但實(shí)際上有大量應(yīng)用可以表示為回歸。

用于回歸的網(wǎng)絡(luò)架構(gòu)與用于分類問(wèn)題的網(wǎng)絡(luò)架構(gòu)沒有很大不同:它們可以采用多變量輸入,也可以使用線性和非線性激活函數(shù)。

在某些情況下,唯一必要的情況是僅在層的末尾刪除類似于 Sigmoid 的函數(shù),以允許出現(xiàn)所有選項(xiàng)。

在第一個(gè)示例中,我們將對(duì)一個(gè)簡(jiǎn)單的,有噪聲的二次函數(shù)進(jìn)行建模,并將嘗試通過(guò)單個(gè)隱藏層網(wǎng)絡(luò)對(duì)其進(jìn)行回歸,并查看我們可以多么接近地預(yù)測(cè)從測(cè)試總體中得出的值。

數(shù)據(jù)集說(shuō)明和加載

在這種情況下,我們將使用生成的數(shù)據(jù)集,該數(shù)據(jù)集與第 3 章的線性回歸中的數(shù)據(jù)集非常相似。

我們將使用常見的 Numpy 方法生成二次函數(shù),然后添加隨機(jī)噪聲,這將有助于我們了解線性回歸如何推廣。

核心樣本創(chuàng)建例程如下:

import numpy as np 
trainsamples = 200 
testsamples = 60 
dsX = np.linspace(-1, 1, trainsamples + testsamples).transpose() 
dsY = 0.4* pow(dsX,2) +2 * dsX + np.random.randn(*dsX.shape) * 0.22 + 0.8  

數(shù)據(jù)集預(yù)處理

該數(shù)據(jù)集在生成時(shí)不需要進(jìn)行預(yù)處理,并且具有良好的屬性,例如居中并具有-1, 1的樣本分布。

模型架構(gòu) – 損失函數(shù)描述

此設(shè)置的損耗將簡(jiǎn)單地用均方根誤差表示,如下所示:

cost = tf.pow(py_x-Y, 2)/(2)  

損失函數(shù)優(yōu)化器

在這種情況下,我們將使用梯度下降成本優(yōu)化器,可以通過(guò)以下代碼調(diào)用該優(yōu)化器:

train_op = tf.train.AdamOptimizer(0.5).minimize(cost)  

準(zhǔn)確率和收斂性測(cè)試

predict_op = tf.argmax(py_x, 1)

cost1 += sess.run(cost, feed_dict={X: [[x1]], Y: y1}) / testsamples 

示例代碼

讓我們看一下下面顯示的示例代碼:

import tensorflow as tf
import numpy as np
from sklearn.utils import shuffle
%matplotlib inline
import matplotlib.pyplot as plt
trainsamples = 200
testsamples = 60
#Here we will represent the model, a simple imput, a hidden layer of sigmoid activation
def model(X, hidden_weights1, hidden_bias1, ow):hidden_layer =  tf.nn.sigmoid(tf.matmul(X, hidden_weights1)+ b)return tf.matmul(hidden_layer, ow)  
dsX = np.linspace(-1, 1, trainsamples + testsamples).transpose()
dsY = 0.4* pow(dsX,2) +2 * dsX + np.random.randn(*dsX.shape) * 0.22 + 0.8
plt.figure() # Create a new figure
plt.title('Original data')
plt.scatter(dsX,dsY) #Plot a scatter draw of the datapoints

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3lmExNM5-1681565530636)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00086.jpg)]

X = tf.placeholder("float")
Y = tf.placeholder("float")
# Create first hidden layer
hw1 = tf.Variable(tf.random_normal([1, 10], stddev=0.1))
# Create output connection
ow = tf.Variable(tf.random_normal([10, 1], stddev=0.0))
# Create bias
b = tf.Variable(tf.random_normal([10], stddev=0.1))
model_y = model(X, hw1, b, ow)
# Cost function
cost = tf.pow(model_y-Y, 2)/(2)
# construct an optimizer
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)
# Launch the graph in a session
with tf.Session() as sess:tf.initialize_all_variables().run() #Initialize all variablesfor i in range(1,100):dsX, dsY = shuffle (dsX.transpose(), dsY) #We randomize the samples to mplement a better trainingtrainX, trainY =dsX[0:trainsamples], dsY[0:trainsamples]for x1,y1 in zip (trainX, trainY):sess.run(train_op, feed_dict={X: [[x1]], Y: y1})testX, testY = dsX[trainsamples:trainsamples + testsamples], dsY[0:trainsamples:trainsamples+testsamples]cost1=0.for x1,y1 in zip (testX, testY):cost1 += sess.run(cost, feed_dict={X: [[x1]], Y: y1}) / testsamples      if (i%10 == 0):print "Average cost for epoch " + str (i) + ":" + str(cost1)

結(jié)果描述

這是不同周期的結(jié)果的副本。請(qǐng)注意,由于這是一個(gè)非常簡(jiǎn)單的函數(shù),因此即使第一次迭代也具有非常好的結(jié)果:

Average cost for epoch 1:[[ 0.00753353]]
Average cost for epoch 2:[[ 0.00381996]]
Average cost for epoch 3:[[ 0.00134867]]
Average cost for epoch 4:[[ 0.01020064]]
Average cost for epoch 5:[[ 0.00240157]]
Average cost for epoch 6:[[ 0.01248318]]
Average cost for epoch 7:[[ 0.05143405]]
Average cost for epoch 8:[[ 0.00621457]]
Average cost for epoch 9:[[ 0.0007379]]

第二個(gè)項(xiàng)目 – 非線性回歸和汽車的燃油效率建模

在此示例中,我們將進(jìn)入一個(gè)區(qū)域,其中神經(jīng)網(wǎng)絡(luò)可提供大部分附加價(jià)值; 解決非線性問(wèn)題。 為了開始這一旅程,我們將基于幾個(gè)變量對(duì)幾種汽車模型的燃油效率建模一個(gè)回歸模型,該變量可以更好地用非線性函數(shù)表示。

數(shù)據(jù)集說(shuō)明和加載

對(duì)于這個(gè)問(wèn)題,我們將分析一個(gè)非常著名的,標(biāo)準(zhǔn)的,格式正確的數(shù)據(jù)集,該數(shù)據(jù)集將使我們能夠分析一個(gè)多變量問(wèn)題:根據(jù)離散和連續(xù)的一些相關(guān)變量來(lái)猜測(cè)汽車的 MPG。

這可以被認(rèn)為是一個(gè)玩具,并且有些過(guò)時(shí)了,但是它將為更復(fù)雜的問(wèn)題鋪平道路,并且具有已經(jīng)被眾多書目分析的優(yōu)勢(shì)。

屬性信息

該數(shù)據(jù)集具有以下數(shù)據(jù)列:

  • mpg:連續(xù)
  • cylinders:多值離散
  • displacement:連續(xù)
  • horsepower:連續(xù)
  • weight:連續(xù)
  • acceleration:連續(xù)
  • model year:多值離散
  • origin:多值離散
  • car name:字符串(將不使用)

我們將不對(duì)數(shù)據(jù)進(jìn)行詳細(xì)的分析,但是我們可以非正式地推斷出所有連續(xù)變量都與增加或減少目標(biāo)變量相關(guān):

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-W2qcZeUu-1681565530636)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00087.jpg)]

數(shù)據(jù)集預(yù)處理

對(duì)于此任務(wù),我們將使用來(lái)自 sklearn 的上述縮放器對(duì)象:

  • scaler = preprocessing.StandardScaler()
  • X_train = scaler.fit_transform(X_train)

模型架構(gòu)

我們將要構(gòu)建的是一個(gè)前饋神經(jīng)網(wǎng)絡(luò),具有多變量輸入和簡(jiǎn)單輸出:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-KIplme6u-1681565530636)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00088.jpg)]

收斂性測(cè)試

score = metrics.mean_squared_error(regressor.predict(scaler.transform(X_test)), y_test)
print('MSE: {0:f}'.format(score))

結(jié)果描述

Step #99, avg. train loss: 182.33624
Step #199, avg. train loss: 25.09151
Step #300, epoch #1, avg. train loss: 11.92343
Step #400, epoch #1, avg. train loss: 11.20414
Step #500, epoch #1, avg. train loss: 5.14056
Total Mean Squared Error: 15.0792258911
%matplotlib inline  
import matplotlib.pyplot as plt 
import pandas as pd from sklearn import datasets, cross_validation, metrics 
from sklearn import preprocessing 
from tensorflow.contrib import skflow # Read the original dataset 
df = pd.read_csv("data/mpg.csv", header=0) 
# Convert the displacement column as float 
df['displacement']=df['displacement'].astype(float) 
# We get data columns from the dataset 
# First and last (mpg and car names) are ignored for X 
X = df[df.columns[1:8]] 
y = df['mpg'] plt.figure() # Create a new figure for i in range (1,8): number = 420 + i ax1.locator_params(nbins=3) ax1 = plt.subplot(number) plt.title(list(df)[i]) ax1.scatter(df[df.columns[i]],y) #Plot a scatter draw of the  datapoints 
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0) 
# Split the datasets X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, 
test_size=0.25) # Scale the data for convergency optimization 
scaler = preprocessing.StandardScaler() # Set the transform parameters 
X_train = scaler.fit_transform(X_train) # Build a 2 layer fully connected DNN with 10 and 5 units respectively 
regressor = skflow.TensorFlowDNNRegressor(hidden_units=[10, 5], 
steps=500, learning_rate=0.051, batch_size=1) # Fit the regressor 
regressor.fit(X_train, y_train) # Get some metrics based on the X and Y test data 
score = metrics.mean_squared_error(regressor.predict(scaler.transform(X_test)), y_test) print(" Total Mean Squared Error: " + str(score)) 

第三個(gè)項(xiàng)目 – 葡萄酒分類:多類分類的學(xué)習(xí)

在本節(jié)中,我們將使用更復(fù)雜的數(shù)據(jù)集,嘗試根據(jù)產(chǎn)地對(duì)葡萄酒進(jìn)行分類。

數(shù)據(jù)集說(shuō)明和加載

該數(shù)據(jù)包含對(duì)來(lái)自意大利同一地區(qū)但來(lái)自三個(gè)不同品種的葡萄酒進(jìn)行化學(xué)分析的結(jié)果。 分析確定了三種葡萄酒中每種所含 13 種成分的數(shù)量。

數(shù)據(jù)變量:

  • 蘋果酸
  • 灰的堿度
  • 總酚
  • 黃酮
  • 非類黃酮酚
  • 花青素
  • 色彩強(qiáng)度
  • 色調(diào)
  • 稀釋酒的 OD280/OD315
  • 脯氨酸

要讀取數(shù)據(jù)集,我們將僅使用提供的 CSV 文件和熊貓:

df = pd.read_csv("./wine.csv", header=0)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-y93UBK0U-1681565530637)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/build-ml-proj-tf-zh/img/00089.jpg)]

數(shù)據(jù)集預(yù)處理

隨著 csv 上的值從 1 開始,我們將歸一化帶有偏差的值:

y = df['Wine'].values-1 

對(duì)于結(jié)果,我們將這些選項(xiàng)表示為一個(gè)數(shù)組的熱門列表:

Y = tf.one_hot(indices = y, depth=3, on_value = 1., off_value = 0., axis = 1 , name = "a").eval() 

我們還將預(yù)先洗凈值:

X, Y = shuffle (X, Y) 
scaler = preprocessing.StandardScaler() 
X = scaler.fit_transform(X) 

模型架構(gòu)

這個(gè)特定的模型將由一個(gè)單層,全連接的神經(jīng)網(wǎng)絡(luò)組成:

  • x = tf.placeholder(tf.float32, [None, 12])
  • W = tf.Variable(tf.zeros([12, 3]))
  • b = tf.Variable(tf.zeros([3]))
  • y = tf.nn.softmax(tf.matmul(x, W) + b)

損失函數(shù)說(shuō)明

我們將使用交叉熵函數(shù)來(lái)衡量損失:

y_ = tf.placeholder(tf.float32, [None, 3]) 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 

損失函數(shù)優(yōu)化器

同樣,將使用“梯度下降”方法來(lái)減少損失函數(shù):

train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy) 

收斂測(cè)試

在收斂性測(cè)試中,我們將每個(gè)良好的回歸均轉(zhuǎn)換為 1,將每個(gè)錯(cuò)誤的回歸均轉(zhuǎn)換為 0,然后獲取值的平均值來(lái)衡量模型的準(zhǔn)確率:

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
print(accuracy.eval({x: Xt, y_: Yt})) 

結(jié)果描述

如我們所見,隨著歷時(shí)的發(fā)展,我們具有可變精度,但是它總是優(yōu)于 90% 的精度,具有 30% 的隨機(jī)基數(shù)(如果我們生成 0 到 3 之間的隨機(jī)數(shù)來(lái)猜測(cè)結(jié)果)。

0.973684
0.921053
0.921053
0.947368
0.921053

完整源代碼

讓我們看一下完整的源代碼:

sess = tf.InteractiveSession() 
import pandas as pd 
# Import data 
from tensorflow.examples.tlutorials.mnist import input_data 
from sklearn.utils import shuffle 
import tensorflow as tf from sklearn import preprocessing flags = tf.app.flags 
FLAGS = flags.FLAGS df = pd.read_csv("./wine.csv", header=0) 
print (df.describe()) 
#df['displacement']=df['displacement'].astype(float) 
X = df[df.columns[1:13]].values 
y = df['Wine'].values-1 
Y = tf.one_hot(indices = y, depth=3, on_value = 1., off_value = 0., axis = 1 , name = "a").eval() 
X, Y = shuffle (X, Y) scaler = preprocessing.StandardScaler() 
X = scaler.fit_transform(X) # Create the model 
x = tf.placeholder(tf.float32, [None, 12]) 
W = tf.Variable(tf.zeros([12, 3])) 
b = tf.Variable(tf.zeros([3])) 
y = tf.nn.softmax(tf.matmul(x, W) + b) # Define loss and optimizer 
y_ = tf.placeholder(tf.float32, [None, 3]) 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy) 
# Train 
tf.initialize_all_variables().run() 
for i in range(100): 
X,Y =shuffle (X, Y, random_state=1) Xtr=X[0:140,:] 
Ytr=Y[0:140,:] Xt=X[140:178,:] 
Yt=Y[140:178,:] 
Xtr, Ytr = shuffle (Xtr, Ytr, random_state=0) 
#batch_xs, batch_ys = mnist.train.next_batch(100) 
batch_xs, batch_ys = Xtr , Ytr 
train_step.run({x: batch_xs, y_: batch_ys}) 
cost = sess.run (cross_entropy, feed_dict={x: batch_xs, y_: batch_ys}) 
# Test trained model 
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
print(accuracy.eval({x: Xt, y_: Yt})) 

總結(jié)

在本章中,我們已經(jīng)開始著手實(shí)現(xiàn) TensorFlow 能力的真正替代物:神經(jīng)網(wǎng)絡(luò)模型。

我們還看到了在回歸和分類任務(wù)中使用簡(jiǎn)單神經(jīng)網(wǎng)絡(luò),簡(jiǎn)單生成模型和實(shí)驗(yàn)?zāi)P偷那闆r。

在下一章中,我們將以卷積神經(jīng)網(wǎng)絡(luò)的形式提高新架構(gòu)的知識(shí)以及將神經(jīng)網(wǎng)絡(luò)范式應(yīng)用于其他知識(shí)領(lǐng)域(例如計(jì)算機(jī)視覺)的方式。

http://www.risenshineclean.com/news/39871.html

相關(guān)文章:

  • 南京疫情最新google seo是什么
  • 潮州專業(yè)網(wǎng)站建設(shè)制作百度競(jìng)價(jià)排名黑幕
  • 網(wǎng)站鏈接查詢seo快速排名軟件首頁(yè)
  • 天津企業(yè)網(wǎng)站設(shè)計(jì)報(bào)價(jià)搜索引擎技術(shù)
  • 做招聘網(wǎng)站賺錢么百度知道推廣軟件
  • 上饒做網(wǎng)站網(wǎng)站備案流程
  • 網(wǎng)站備案號(hào)位置免費(fèi)關(guān)鍵詞優(yōu)化工具
  • 網(wǎng)站開發(fā)實(shí)驗(yàn)報(bào)告可行性分析簡(jiǎn)單網(wǎng)站建設(shè)優(yōu)化推廣
  • asp 做購(gòu)物網(wǎng)站成都全網(wǎng)營(yíng)銷推廣
  • 模板商城建站網(wǎng)絡(luò)營(yíng)銷的概念
  • 個(gè)人網(wǎng)站開發(fā)永久免費(fèi)google搜索引擎
  • 延邊州建設(shè)局網(wǎng)站上海平臺(tái)推廣的公司
  • 用什么軟件做網(wǎng)站布局seo優(yōu)化主要做什么
  • 做網(wǎng)站 售后服務(wù)里都寫啥商丘網(wǎng)站seo
  • 無(wú)錫網(wǎng)站設(shè)計(jì)哪里靠譜大數(shù)據(jù)營(yíng)銷平臺(tái)那么多
  • 025網(wǎng)站建設(shè)電工培訓(xùn)機(jī)構(gòu)
  • 網(wǎng)站部署到終端機(jī)怎么做旅游產(chǎn)品推廣有哪些渠道
  • 淘寶做短視頻網(wǎng)站百度第三季度財(cái)報(bào)2022
  • 南充 網(wǎng)站開發(fā)蘇州關(guān)鍵詞優(yōu)化怎樣
  • 傳媒網(wǎng)站建設(shè)網(wǎng)站推廣排名服務(wù)
  • wordpress 3306優(yōu)化工具箱下載
  • 做網(wǎng)站是做廣告嗎網(wǎng)站流量數(shù)據(jù)
  • 世界杯網(wǎng)站開發(fā)長(zhǎng)春網(wǎng)站建設(shè)設(shè)計(jì)
  • 網(wǎng)站制作ppt抖音怎么推廣
  • 護(hù)膚品網(wǎng)站建設(shè)分析網(wǎng)頁(yè)制作工具有哪些
  • 武漢網(wǎng)站建設(shè)前十杭州seo代理公司
  • wordpress文章加密搜索不到優(yōu)化排名工具
  • 做網(wǎng)站如何分類產(chǎn)品百度seo排名優(yōu)化教程
  • 搜索網(wǎng)站排名軟件公司開發(fā)設(shè)計(jì)推薦
  • 做圖標(biāo)去什么網(wǎng)站找最新實(shí)時(shí)新聞