網(wǎng)站建設(shè)課程 谷建軟文推廣服務(wù)
原文: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]] |
3 | 3 階張量 | tensor = [[[4], [3], [2]], [[6], [100], [4]], [[5], [1], [4]]] |
n | n 階張量 | … |
張量形狀
TensorFlow 文檔使用三種符號(hào)約定來(lái)描述張量維數(shù):階數(shù),形狀和維數(shù)。 下表顯示了它們之間的相互關(guān)系:
秩 | 形狀 | 維度數(shù)量 | 示例 |
---|---|---|---|
0 | [] | 0 | 4 |
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_FLOAT | tf.float32 | 32 位浮點(diǎn)。 |
DT_DOUBLE | tf.float64 | 64 位浮點(diǎn)。 |
DT_INT8 | tf.int8 | 8 位有符號(hào)整數(shù)。 |
DT_INT16 | tf.int16 | 16 位有符號(hào)整數(shù)。 |
DT_INT32 | tf.int32 | 32 位有符號(hào)整數(shù)。 |
DT_INT64 | tf.int64 | 64 位有符號(hào)整數(shù)。 |
DT_UINT8 | tf.uint8 | 8 位無(wú)符號(hào)整數(shù)。 |
DT_STRING | tf.string | 可變長(zhǎng)度字節(jié)數(shù)組。 張量的每個(gè)元素都是一個(gè)字節(jié)數(shù)組。 |
DT_BOOL | tf.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
類型的操作,該操作將張量a
和b
作為輸入并產(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)
序列
序列工具包括諸如argmin
和argmax
(顯示維度的最小值和最大值),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)它的一些信息。
然后,我們將探討按維度修改矩陣的操作,包括添加或刪除維度,例如squeeze
和expand_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.TFRecordReader
與tf.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)化如下:
- 我們從未分類的樣本開始,以 k 個(gè)元素為起始質(zhì)心。 為了簡(jiǎn)潔起見,也可以簡(jiǎn)化此算法,使元素列表中的第一個(gè)元素成為第一個(gè)元素。
- 然后,我們計(jì)算樣本與首先選擇的樣本之間的距離,并獲得第一個(gè)計(jì)算出的質(zhì)心(或其他代表值)。 您可以看到圖中的質(zhì)心向著更常識(shí)的質(zhì)心移動(dòng)。
- 形心更改后,它們的位移將引起各個(gè)距離發(fā)生更改,因此群集成員身份可能會(huì)更改。
- 這是我們重新計(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é):
- 我們將先前已知的樣本放在數(shù)據(jù)結(jié)構(gòu)上。
- 然后,我們讀取要分類的下一個(gè)樣本,并計(jì)算從新樣本到訓(xùn)練集的每個(gè)樣本的歐幾里得距離。
- 我們通過(guò)根據(jù)歐幾里得距離選擇最近的樣本的類別來(lái)確定新元素的類別。 KNN 方法需要對(duì) k 個(gè)最接近的樣本進(jìn)行投票。
- 我們重復(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.01
到0.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ù)采用以下形式:
在這里,ss0
或 bias
是截距,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í)行以下步驟:
-
創(chuàng)建具有所需參數(shù)的
Optimizer
(在這種情況下為梯度下降)。opt = GradientDescentOptimizer(learning_rate= [learning rate])
-
為
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_step
:Optimizer
工作后,此變量將增加 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.AdamOptimizer
,tf.train.FtrlOptimizer
和tf.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)
-
現(xiàn)在,我們創(chuàng)建一個(gè)變量來(lái)保存
x
和y
軸中的值。 然后,我們將模型定義為X
和權(quán)重w
的乘積。 -
然后,我們生成一些變量,并為其分配初始值以啟動(dòng)模型:
In[]: X = tf.placeholder("float", name="X") # create symbolic variables Y = tf.placeholder("float", name = "Y")
-
現(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ù)變量b0
和b1
以及應(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)
-
在
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
-
為了定義選擇的
optimizer,
,我們初始化一個(gè)GradientDescentOptimizer
,步驟將是0.01
,這似乎是收斂的合理起點(diǎn)。train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)
-
現(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)
-
對(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é)果,打印w
和b
變量的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é)中表示的變量的定義:w
,b
和模型線性方程。
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)縮放到0
和1
。
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ì)P
(y=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
:張量必須為以下類型之一:float32
,float64
形狀為[batch_size, num_classes]
的 2Dname
:操作的名稱(可選)
此函數(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)建初始變量和占位符,即單變量x
和y
浮點(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)化算法為:
-
用隨機(jī)分布初始化權(quán)重(通常為低值)
-
選擇一個(gè)輸入向量并將其呈現(xiàn)給網(wǎng)絡(luò),
-
為指定的輸入向量和權(quán)重值計(jì)算網(wǎng)絡(luò)的輸出
y'
。 -
用于感知機(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)]
-
如果
y' ≠ y
,則通過(guò)添加更改Δw = yx[i]
修改所有連接w[i]
-
返回步驟 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ī)視覺)的方式。