張量(Tensor):Tensor = multi-dimensional array of numbers 張量是一個多維陣列,它是標量,向量,矩陣的高維擴充套件 ,是一個資料容器,張量是矩陣向任意維度的推廣
注意,張量的維度(dimension)通常叫作軸(axis), 張量軸的個數也叫作階(rank)]
標量(scalar):只有一個數位的張量叫標量(也叫標量張量、零維張量
、0D 張量)
x = np.array(12)
print(x.ndim) 可以用 ndim 屬性來檢視一個 Numpy 張量的軸的個數。標量張量有 0 個軸( ndim == 0 )。
向量(vector):數位組成的陣列叫作向量(vector)或一維張量
(1D 張量)。一維張量只有一個軸。下面是一個 Numpy 向量
np.array([12, 3, 6, 14, 7])
這個向量有 5 個元素,所以被稱為 5D 向量。不要把 5D 向量和 5D 張量弄混! 5D 向量只有一個軸,沿著軸有 5 個維度,而 5D 張量有 5 個軸(沿著每個軸可能有任意個維度)
矩陣(matrix):是一個按照長方陣列排列的複數或實數集合,矩陣是二維張量
(2D 張量)
np.array([[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]])
向量組成的陣列叫作矩陣(matrix)或二維張量(2D 張量)。矩陣有 2 個軸(通常叫作行和列)。你可以將矩陣直觀地理解為數位組成的矩形網格。下面是一個 Numpy 矩陣。
3D 張量
與n 維張量
將多個矩陣組合成一個新的陣列,可以得到一個 3D 張量,你可以將其直觀地理解為數位組成的立方體。下面是一個 Numpy 的 3D 張量。
np.array([[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]],
[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]],
[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]]])
將多個 3D 張量組合成一個陣列,可以建立一個 4D 張量,以此類推。深度學習處理的一般是 0D 到 4D 的張量,但處理視訊資料時可能會遇到 5D 張量。
張量是由以下三個關鍵屬性來定義的。
data: Tensor的值;
dtype: Tensor的資料型別;
shape: Tensor的形狀;
device: Tensor所在的裝置(CPU/GPU);
requires_grad: 是否需要梯度;
grad: Tensor的梯度;
grad_fn: 建立Tensor的函數;
is_leaf: 是否是葉子節點
這是最常見的資料。對於這種資料集,每個資料點都被編碼為一個向量,因此一個資料批次就被編碼為 2D 張量(即向量組成的陣列),其中第一個軸是樣本軸,第二個軸是特徵軸。
例子:
當時間(或序列順序)對於資料很重要時,應該將資料儲存在帶有時間軸的 3D 張量中。每個樣本可以被編碼為一個向量序列(即 2D 張量),因此一個資料批次就被編碼為一個 3D 張量(見下圖)
根據慣例,時間軸始終是第 2 個軸(索引為 1 的軸)。
我們來看幾個例子。
影象通常具有三個維度:高度、寬度和顏色深度。雖然灰度影象(比如 MNIST 數位影像)只有一個顏色通道,因此可以儲存在 2D 張量中,但按照慣例,影象張量始終都是 3D 張量,灰度影象的彩色通道只有一維。因此,如果影象大小為 256×256,那麼 128 張灰度影象組成的批次可以儲存在一個形狀為 (128, 256, 256, 1) 的張量中,而 128 張彩色影象組成的批次則可以儲存在一個形狀為 (128, 256, 256, 3) 的張量中。
影象張量的形狀有兩種約定:通道在後(channels-last)的約定(在 TensorFlow 中使用)和通道在前(channels-first)的約定(在 Theano 中使用)。Google 的 TensorFlow 機器學習框架將顏色深度軸放在最後: (samples, height, width, color_depth) 。與此相反,Theano將影象深度軸放在批次軸之後: (samples, color_depth, height, width) 。如果採用 Theano 約定,前面的兩個例子將變成 (128, 1, 256, 256) 和 (128, 3, 256, 256) 。Keras 框架同時支援這兩種格式。
如下圖所示是一張普通的水果圖片,按照RGB三原色表示,其可以拆分為紅色、綠色和藍色的三張灰度圖片,如果將這種表示方法用張量的形式寫出來,就是圖中最下方的那張表格
圖中只顯示了前5行、320列的資料,每個方格代表一個畫素點,其中的資料[1.0, 1.0, 1.0]即為顏色。假設用[1.0, 0, 0]表示紅色,[0, 1.0, 0]表示綠色,[0, 0, 1.0]表示藍色,那麼如圖所示,前面5行的資料則全是白色
用四階張量表示一個包含多張圖片的資料集,其中的四個維度分別是:圖片在資料集中的編號,圖片高度、寬度,以及色彩資料。
視訊資料是現實生活中需要用到 5D 張量的少數資料型別之一。視訊可以看作一系列幀,每一幀都是一張彩色影象。由於每一幀都可以儲存在一個形狀為 (height, width, color_depth) 的 3D 張量中,因此一系列幀可以儲存在一個形狀為 (frames, height, width,color_depth) 的 4D 張量中,而不同視訊組成的批次則可以儲存在一個 5D 張量中,其形狀為(samples, frames, height, width, color_depth) 。
舉個例子,一個以每秒 4 幀取樣的 60 秒 YouTube 視訊片段,視訊尺寸為 144×256,這個視訊共有 240 幀。4 個這樣的視訊片段組成的批次將儲存在形狀為 (4, 240, 144, 256, 3)的張量中。總共有 106 168 320 個值!如果張量的資料型別( dtype )是 float32 ,每個值都是32 位,那麼這個張量共有 405MB。好大!你在現實生活中遇到的視訊要小得多,因為它們不以float32 格式儲存,而且通常被大大壓縮,比如 MPEG 格式。