本文是《Python深度学习》一书的相关笔记。
张量(tensor)是一个数据容器,它所包含的一般是数值数据。下面是张量中的一些名词:
- 轴(axis):张量的维度( dimension);张量轴的个数也称作阶.
- 形状(shaple):这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。例如,某矩
阵的形状为 (3, 5)表示这个矩阵有3行5列 - 数据类型(dtype):张量中所包含数据的类型
1、标量(0D 张量)
- 仅包含一个数字的张量叫作标量(scalar)
- 可以用ndim属性来查看一个 Numpy 张量的轴的个数。
>>> import numpy as np
>>> x = np.array(12)
>>> x
array(12)
>>> x.ndim
0
2、向量(1D 张量)
- 数字组成的数组叫作向量(vector)
>>> x = np.array([12, 3, 6, 14, 7])
>>> x
array([12, 3, 6, 14, 7])
>>> x.ndim
1
这个向量有 5 个元素,所以被称为 5D 向量。不要把 5D 向量和 5D 张量弄混! 5D 向量只
有一个轴,沿着轴有 5 个维度,而 5D 张量有 5 个轴(沿着每个轴可能有任意个维度)。
3、矩阵(2D 张量)
- 向量组成的数组叫作矩阵(matrix)
- 第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)
>>> x = np.array([[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]])
>>> x.ndim
2
4、3D 张量与更高维张量
- 将多个矩阵组合成一个新的数组,可以得到一个 3D 张量,可以将其直观地理解为数字
组成的立方体。 - 将多个 3D 张量组合成一个数组,可以创建一个 4D 张量,以此类推。
>>> 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
5、Numpy张量切片
- 我们以Numpy 3D张量上的张量切片运算为例
- train_images[i] 表示沿着第一个轴的所有数字
#下面这个例子选择第 10~100 个数字,并将其放在形状为 (90, 28,28) 的数组中
>>> my_slice = train_images[10:100]
>>> print(my_slice.shape)
(90, 28, 28)
#下面的写法跟上面是等价的;其中:表示选取整个轴
>>> 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)
- 再以某个3D张量存储的图像为例
#你可以在所有图像的右下角选出 14 像素× 14 像素的区域:
my_slice = train_images[:, 14:, 14:]
#也可以使用负数索引。与 Python 列表中的负数索引类似,它表示与当前轴终点的相对位置。
#你可以在图像中心裁剪出 14 像素× 14 像素的区域:
my_slice = train_images[:, 7:-7, 7:-7]
6、常用张量表示
(1)向量数据: 2D 张量,形状为 (samples, features)
- 对于这种数据集,每个数据点都被编码为一个向量,因此一个数据批
量就被编码为 2D 张量(即向量组成的数组),其中第一个轴是样本轴,第二个轴是特征轴。
(2)时间序列数据或序列数据: 3D 张量,形状为 (samples, timesteps, features)
- 如时间序列数据或序列数据
(3)图像: 4D 张量,形状为 (samples, height, width, channels) 或 (samples, channels, height, width)
- 如图像数据,图像通常具有三个维度:高度、宽度和颜色深度。
(4) 视频: 5D 张量,形状为 (samples, frames, height, width, channels) 或 (samples, frames, channels, height, width)
- 如视频数据,频可以看作一系列帧,每一帧都是一张彩色图像。由于每一帧都可以保存在一个形状为 (height, width, color_depth) 的 3D 张量中,因此一系列帧可以保存在一个形状为 (frames, height, width, color_depth) 的 4D 张量中,而不同视频组成的批量则可以保存在一个 5D 张量中,其形状为(samples, frames, height, width, color_depth)。