張量這一概念的核心在于俺附,它是一個(gè)數(shù)據(jù)容器。它包含的數(shù)據(jù)幾乎總是數(shù)值數(shù)據(jù)溪掀,因此它是數(shù)字的容器事镣。
你可能對矩陣很熟悉, 它是二維張量揪胃。 張量是矩陣向任意維度的推廣[注意璃哟, 張量的維度(dimension)通常叫作軸(axis)]氛琢。
張量的維度
- 包含一個(gè)數(shù)字的張量叫作標(biāo)量(scalar,也叫標(biāo)量張量随闪、零維張量阳似、0D 張量)。
張量有 0 個(gè)軸( ndim == 0 )铐伴。張量軸的個(gè)數(shù)也叫作階(rank)撮奏。下面是一個(gè) Numpy 標(biāo)量。
>>> import numpy as np
>>> x = np.array(12)
>>> x array(12)
>>> x.ndim
0
- 向量(1D 張量)
數(shù)字組成的數(shù)組叫作向量(vector)或一維張量(1D 張量)当宴。一維張量只有一個(gè)軸畜吊。
>>> x = np.array([12, 3, 6, 14, 7])
>>> x array([12, 3, 6, 14, 7])
>>> x.ndim
1
- 矩陣(2D 張量)
向量組成的數(shù)組叫作矩陣(matrix)或二維張量(2D 張量)。矩陣有 2 個(gè)軸(通常叫作行和列)
第一個(gè)軸上的元素叫作行(row)即供,第二個(gè)軸上的元素叫作列(column)定拟。
>>> x = np.array([[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]])
>>> x.ndim
2
- 3D 張量與更高維張量
將多個(gè)矩陣組合成一個(gè)新的數(shù)組,可以得到一個(gè) 3D 張量逗嫡,你可以將其直觀地理解為數(shù)字 組成的立方體青自。
>>> x = 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]]])
>>> x.ndim
3
將多個(gè) 3D 張量組合成一個(gè)數(shù)組,可以創(chuàng)建一個(gè) 4D 張量驱证,以此類推延窜。深度學(xué)習(xí)處理的一般 是 0D 到 4D 的張量,但處理視頻數(shù)據(jù)時(shí)可能會(huì)遇到 5D 張量抹锄。
關(guān)鍵屬性
軸的個(gè)數(shù)(階)逆瑞。 例如,3D 張量有 3 個(gè)軸伙单, 矩陣有 2 個(gè)軸获高。 這在 Numpy 等 Python 庫中也叫張量的 ndim 。 ?
形狀吻育。 這是一個(gè)整數(shù)元組念秧, 表示張量沿每個(gè)軸的維度大小(元素個(gè)數(shù))布疼。 例如摊趾, 前面矩陣示例的形狀為 (3, 5) ,3D 張量示例的形狀為 (3, 3, 5) 游两。向量的形狀只包含一個(gè)元素砾层,比如 (5,) ,而標(biāo)量的形狀為空贱案,即 () 肛炮。
數(shù)據(jù)類型(在 Python 庫中通常叫作 dtype )。這是張量中所包含數(shù)據(jù)的類型,例如铸董,張量的類型可以是 float32 祟印、 uint8 、 float64 等粟害。在極少數(shù)情況下蕴忆,你可能會(huì)遇到字符 ( char )張量。
張量的切片同python數(shù)組的切片一樣悲幅。
數(shù)據(jù)批量的概念
通常來說套鹅,深度學(xué)習(xí)中所有數(shù)據(jù)張量的第一個(gè)軸(0 軸,因?yàn)樗饕龔?0 開始)都是樣本軸 (samples axis汰具,有時(shí)也叫樣本維度)卓鹿。
>>> my_slice = train_images[10:100]
>>> print(my_slice.shape) (90, 28, 28)
上面的例子表示 :在MNIST數(shù)據(jù)集中,將 10~100 個(gè)數(shù)字(不包括第 100 個(gè))留荔, 并將其放在形狀為 (90, 28, 28) 的數(shù)組中吟孙。
>>> my_slice = train_images[10:100, :, :]
>>> my_slice.shape (90, 28, 28)
>>> my_slice = train_images[10:100, 0:28, 0:28]
>>> my_slice.shape (90, 28, 28)
這些代碼效果都是等同的。
此外聚蝶,深度學(xué)習(xí)模型不會(huì)同時(shí)處理整個(gè)數(shù)據(jù)集杰妓,而是將數(shù)據(jù)拆分成小批量。
比如下面的每個(gè)批量 大小是128.
batch = train_images[:128]
batch = train_images[128:256]
batch = train_images[128 * n:128 * (n + 1)]
對于這種批量張量碘勉,第一個(gè)軸(0 軸)叫作批量軸(batch axis)或批量維度(batch dimension)巷挥。
現(xiàn)實(shí)世界中的數(shù)據(jù)張量
向量數(shù)據(jù):2D 張量,形狀為 (samples, features) 验靡。
時(shí)間序列數(shù)據(jù)或序列數(shù)據(jù):3D 張量倍宾,形狀為 (samples, timesteps, features) 。
圖像:4D 張量胜嗓,形狀為 (samples, height, width, channels) 或 (samples, channels, height, width) 高职。
視頻:5D 張量,形狀為 (samples, frames, height, width, channels) 或 (samples, frames, channels, height, width) 辞州。
舉例:
-
時(shí)間序列組成的3D張量
根據(jù)慣例初厚,時(shí)間軸始終是第 2 個(gè)軸(索引為 1 的軸) -
圖像數(shù)據(jù)組成的4D張量
圖像張量的形狀有兩種約定:通道在后(channels-last)的約定(在 TensorFlow 中使用)和通道在前(channels-first)的約定(在 Theano 中使用)。
Google 的 TensorFlow 機(jī)器學(xué)習(xí)框架將顏色深度軸放在最后: (samples, height, width, color_depth) 孙技。 與此相反,Theano 將圖像深度軸放在批量軸之后: (samples, color_depth, height, width) 排作。 視頻數(shù)據(jù)組成的5D張量
視頻數(shù)據(jù)是現(xiàn)實(shí)生活中需要用到 5D 張量的少數(shù)數(shù)據(jù)類型之一牵啦。 視頻可以看作一系列幀, 每一幀都是一張彩色圖像妄痪。由于每一幀都可以保存在一個(gè)形狀為 (height, width, color_ depth) 的 3D 張量中哈雏, 因此一系列幀可以保存在一個(gè)形狀為 (frames, height, width, color_depth) 的 4D 張量中,而不同視頻組成的批量則可以保存在一個(gè) 5D 張量中,其形狀為 (samples, frames, height, width, color_depth) 裳瘪。
張量變形
張量變形是指改變張量的行和列土浸,以得到想要的形狀。變形后的張量的元素總個(gè)數(shù)與初始張量相同彭羹。
>>> x = np.array([[0., 1.],
[2., 3.],
[4., 5.]])
>>> print(x.shape) (3, 2)
>>> x = x.reshape((6, 1))
>>> x
array([[ 0.],
[ 1.],
[ 2.],
[ 3.],
[ 4.],
[ 5.]])
>>> x = x.reshape((2, 3))
>>> x
array([[ 0., 1., 2.],
[ 3., 4., 5.]])
經(jīng)常遇到的一種特殊的張量變形是轉(zhuǎn)置(transposition)黄伊。對矩陣做轉(zhuǎn)置是指將行和列互換, 使 x[i, :] 變?yōu)?x[:, i] 派殷。
>>> x = np.zeros((300, 20))
>>> x = np.transpose(x)
>>> print(x.shape)
(20, 300)