2.理解張量
-
- 張量(Tensors)介紹
張量是物理和工程領域的基礎數學結構。但是過去張量很少在計算機科學里使用。它與離散數學和邏輯學有更多的聯系。隨著機器學習的出現,這種狀態開始顯著的改變,成為連續向量的計算基礎。現代機器學習以張量的操作和微積分為基礎。
張量是TensorFlow工作的基本計算單元。假如你用語句 import tensorflow as tf導入tensorflow,它的基本的對象是張量 tensor,是類tf.tensor。 tf.tensor有兩個特性:
- 數據類型 (例如, float32)
- 形狀 (例如, [2,3],意味著張量有2行和3列)
張量有靜態的數據類型和動態的維。在評估的時候你不能改變它的數據類型但是在評估前可以動態的改變它的維 (基本上,你聲明張量時可以不用指明維,TensorFlow會從輸入值推斷維)。
簡單的來說張量只不過是原始數據類型的集合 (例如,浮點數)是形狀為 n-維的數組。這里是一些張量的例子 (以及相關的 Python定義) :
?1 → 一個標量
?[1,2,3] → 一個向量
?[[1,2,3], [4,5,6]] → 一個矩陣或兩維數組
一個重要的方面是張量的每一個元素總是有相同的類據類型,而形狀不一定要在聲明時定義。 (后面的實例會更清楚些。)。
通常人們討論張量的 rank,shape數組的長度稱為tensor的rank。簡單的來說它就是張量維的數目(而標量的 rank為 0)。Ranking tensors的意思是包含于張量本身的數組的維。張量的形狀表示每一個維的數值。如
Scalar—32:rank 0張量的形狀(shape)為 [ ].
Vector—[3, 4, 5]: rank 1張量的形狀(shape)為[3].
Matrix =1 2 3
4 5 6
7 8 9??? : rank 2 張量的形狀(shape)[3, 3]。
表2-1有助于理解張量的不同 ranks是什么。
表 2-1. ?Ranks為 0, 1, 2,和 3的 Tensors的例子
Rank?????? 數學實體???????????????????????????????????????????????????????????? Python示例
0???????????? 標量 (例如,長度或重量)???????????????? l=30
1???????????? 向量 (例如,物體在二維平面上的速度)???? s=[10.2,12.6]
2???????????? 矩陣????????????????????????????????? m=[[23.2, 44.2], [12.2, 55.6]]
3??????????? 3d矩陣 (有三個維)????????????????? C = [[[1],[2]],[[3],[4]], [[5], [6]]]
可以用a.get_shape()來得到張量a的shape。a.reshape()可以改變張量a的shape。
記住張量(tensor)只是數據的容器。它有兩個基本的特征:數據類型(dtype)和型狀(shape)。dtype用來控制數據的類型,一個給定的tensor只能存貯一種類型的數據。Shape是整數數組,用來指示tensor里有多少個元素以及元素是如何組織的。可以把它當作容器的“形狀和大小”(見圖2-5)。
???????
??????????????????? 圖2-5? rank 為0,1,2,3,4的tensor
例如,一個1D tensor,也稱為向量(vector),它的rank為1。1D tensor的shape是一個只含有一個數字的數組,這個數字告訴我們1D tensor的長度是多少。將rank增加1,我們得到2D tensor,可以把它看作2D平面上的數字的網格(像灰度圖像)。2D tensor的shape有兩個數字,它告訴我們網格的高度和寬度。習慣上,rank-2 tensor被稱為矩陣,它由行和列組成。 再將rank增加1,我們得到3D tensor。如上圖,你可以把3D tensor看作數字的3D網格。3D tensor的shape有三個整數;它們分別告訴我們3D網格沿三個維度的大小。通常彩色圖像可以用3D tensor編碼。Rank為4的tensor(4D tensor)難于直接可視化,因為我們生活在三維空間里。4D tensors經常用在許多模型里,例如,深層卷積(deep convnets)。一個時長為10分鐘的video可以認為是一個4D tensors。TensorFlow里支持的tensors可以多達rank 6。實踐中, rank-5 tensors只用于一些合適的場合(例如,包含多個video的數據), 而rank-6 tensors更為少用。
張量的主要類型有
- tf.Variable
- tf.constant
- tf.placeholder(雖然TensorFlow v2不再使用)
tf.constant和tf.placeholder的值是在一個session運行過程中不可以改變的。 一旦它們有了值,它們就不能改變。例如,tf.placeholder可能包含你想在訓練神經網絡時使用的數據集。一旦賦值,它不會在評估階段改變。tf.Variable可能包含你的神經網絡的權重,它們會在訓練過程中改變,從而找到針對你的問題的最佳值。最后 tf.constant永遠不會改變。下一節告訴你如何使用這三種類型的張量,并在開發模型要注意什么。
2.1.1標量(Scalars),向量 Vectors, 和矩陣(Matrices)
我們以你可能已經熟悉的張量的例子開始,最簡單的張量是標量,它是來自實數域的一個常數(記住實數是任意精度的小數,正數和負數都可以)。數學上,我們記實數為R。更正式地,我們稱scalar為rank-0 張量。
精通數學的讀者可能會抗議,基于復數或二進制數定義張量完全有意義。一般地,只要0,1,加、減、乘、除有定義的數都可以構成張量,包括實數R,有理數Q,復數C, 和有限域例如Z2。
為了簡單起見,我們只假定實數張量,但是用其它域的數代替也是合理的。
如果標量是rank-0 張量,那rank-1張量是什么呢?正規的說,rank-1張量是向量,是實數的列表。習慣地,向量寫作列向量
?????????????????????????
或行向量
?????????????????????
標記上,所有的長度為2的列向量記為R2 × 1而長度為2的行向量記為R1 × 2。計算上,我們說列向量的形狀為 (2, 1), 而行向量的形狀為 (1, 2)。如果我們不想指明向量是行向量還是列向量,我們可以說它來自 R2集合且形狀為 (2)。張量的形狀對于理解TensorFlow的計算很重要,后面我們還會返回它。 向量的最簡單的用途是作為現實世界的坐標。
假如我們確定原點(你當前的地點),則世界上任意一點可以用相對于你當前地點的三個位移值來呈現(左右,前后,上下位移)。因此向量集R3可以呈現世界上的任意一點。
舉不同的例子,我們假定用高,寬,和顏色來描述貓。則視頻游戲貓可以用R3向量來表示。
????????????????????
這種表示通常稱為特征化(featurization)。即特征化是用向量表示真實世界中的一個實體。幾乎所有的機器學習算法都操作向量或張量。因此,特征化的過程是機器學習管線的重要部分。通常,特征化系統是機器學習系統中最為復雜的部分。假如我們有圖2-5所示的苯酚分子。
????????????????????????
圖2-5. 苯酚分子的表示.
我們要如何將這個分子式轉換為適合機器學習系統查詢的向量呢?有多種可能的方案,大部分方案使用分子片斷。用 1/0二值向量 ( 0, 1n)標記特定的片斷的存在與否。這個過程用圖Figure 2-2表示。
???????????????????
圖 2-2. 用于特征化的片斷的選擇(那些包含OH)。這些片斷被哈希到固定長度的向量的索此中。這些位置被設置為1而其它位置設置為零。注意,這個過程聽起來很復雜。實際上構建機器學習系統最為困難的是確定如何將數據轉換為張量形式。對于某些數據,這種轉換是很顯然的。而對于別的數據(如分子式),轉換很復雜。對于機器學習的實踐者,沒有必要發明新的特征化方法因為學術文獻里有現存的,但是有必要讀研究論文來理解轉換數據流的最佳實踐。
現在我們已經確定rank-0張量為標量 (R)以及rank-1張量為向量 (Rn),那 rank-2張量是什么呢? 習慣上,rank-2張量是matrix:
???????????????????????????
這個矩陣有2行和2列。這種矩陣的集合稱為R2 × 2。返回到前面張量形狀的標記,這種矩陣的形狀為(2, 2)。習慣上,矩陣用來表示向量的變換。例如,在一個平面上旋轉一個向量一個角度 α可以用矩陣來進行
??????????????????????
為了理解這一點,我們記x單位向量 (1, 0)被矩陣乘轉換為向量(cos (α), sin (α))。 (我們后面講矩陣乘的定義,現在只簡單的講結果)。
????????????????????
這種變換可以用圖形展示。圖2-3展示原始的單位向量旋轉后的最終向量。
???????????????
圖2-3. 單位元的位置用cosine和sine參數化。
前面我們介紹了標量為rank-0 張量,向量為rank-1張量,矩陣為rank-2 張量。那么rank-3 張量是什么?在給出定義之前,想一下標量,向量,矩陣的共性是有幫助的。標量是一個數,向是多個數的列素。要找到向量里的某個數,需要知道它的索引。因此需要給向量一個索引元素(也是rank-1張量)。矩陣是多個數組成的表。要找到矩陣中的元素需要知道它所在的行和列。回此需要二個索引元素(也是 rank-2 張量)。很自然, rank-3張量是有三個索引元素的多個數的集合。把rank-3張量想像為長方體是很有幫助的,如圖2-4所示。
圖 2-4.一個rank-3張量可以看作多個數組成的長方體.
圖中rank-3張量 T的形狀為 (N, N, N)。可以通過指明 (i, j, k)作為索引得到任意元素。
張量與形狀之間存在一定的聯系。一個rank-1張量有一個維素數為1的形狀,一個rank-2 張量有一個維數為2的形狀,一個rank-3張量有一個維數為3的形狀。你會抗議,這與我們前面討論的行向量和列向量相反。通過我們的定義,列向量的形狀為(n, 1)。這不是讓列向量成為rank-2張量 (或矩陣嗎)? 正是這樣。記住不指明行向量或列向量的向量的形狀為 (n)。當我們指明一個向量是行向量或列向量時,我們實際上指明了將向量轉為矩陣的方法。
這種類型的維擴展是張量操作的一個常見技巧。 注意,另一種想像rank-3 張量的方法是把它當作相同形狀的矩陣的列表。假如W是形狀為(n, n)的矩陣,則張量Tijk = W1, ?,Wn 包含n個矩陣W。注意黑白圖像可以表示為rank-2張量。假如我們有224 × 224-像素的黑白圖像。則pixel (i, j)為1/0 以編碼黑/白像素。黑白圖像可以用形狀為 (224, 224)的矩陣表示。現在考慮一個224 × 224 的彩色圖像,指定像素的色彩用三個獨立的RGB通道表示,即pixel (i, j)表示為元組 (r, g, b)來編碼這像素的紅、綠、藍的多少。 r, g, b是從0 到255的整數。現在彩色圖像可以用形狀為 (224, 224, 3)的rank-3張量表示。繼續分析,考慮彩色視頻。假如視頻的每一幀是224 × 224的彩色圖像,則一分鐘視頻 ( 60 fps)是形狀為 (224, 224, 3, 3600)的rank-4張量。進一步,10個這樣的視頻形成形狀為 (10, 224, 224, 3,3600)的 rank-5張量。通常,張量可以方便的表示數值數據。實踐中,大于rank-5 的張量很少見,但是設計允許任意張量的張量系統是明智的,因為聰明的用戶總會遇到設計者不會考慮到的情況。