Tensor
张量是矩阵的扩展,可以表示不同维度的数组。
定义
张量的阶
标量(0阶张量):仅包含一个数字 向量(1阶张量):由数字组成的数组 矩阵(2阶张量):由向量组成的数组 3阶张量及以上:由矩阵组成的数组
array0 = np.array(12)
# 五维向量
array1= np.array([1, 2, 3, 4, 5])
array2= np.array([[1, 2, 3, 4, 5], [5, 4, 3, 2, 1]])
array3= np.array([[[1, 2, 3, 4, 5], [5, 4, 3, 2, 1]],
[[1, 2, 3, 4, 5], [5, 4, 3, 2, 1]]])
print(f"dim0: {array0.ndim}, dim1: {array1.ndim}, dim2: {array2.ndim}, dim3: {array3.ndim}")
关键属性
- 轴的个数(阶数)
- 形状:表示张量沿每个轴的维度大小(元素个数)
- 数据类型:张量中所包含的数据类型(dtype)
数据张量实例
向量数据
形状为 (samples, features) 的 2 阶张量
-时间序列数据或序列数据
形状为 (samples, timesteps, features) 的 3 阶张量
图像数据
形状为 (samples, height, width, channels) 的 4 阶张量 图像的通道数据一般遵循后置(channels-last)原则
视频数据
形状为 (samples, frames, height, width, channels) 的 5 阶张量 (features向量的维度越高,代表数据的特征点角度越多)
张量运算
基础操作
张量切片
选择张量的特定元素叫作张量切片(tensor slicing)
tran_images.shape
# (60000, 28, 28)
# 选择第10~100个数字(不包括第100个)
my_slice = train_images[10:100]
my_slice.shape
# (90, 28, 28)
# 从所有图像的右下角选出 14 像素 ×14 像素的区域
my_slice = train_images[:, 14:, 14:]
# 在图像中心裁剪出 14 像素 ×14 像素的区域
my_slice = train_images[:, 7:-7, 7:-7]
数据批量
一般来说,深度学习中所有数据张量的第一个轴(也就是轴 0,因为索引从 0 开始)都是样本轴 (samples axis),有时也叫样本维度(samples dimension)]。
# 取前128条数据
batch = train_images[:128]
对于这种批量张量,第一个轴(轴 0)叫作批量轴(batch axis)或批量维度(batch dimension)。
张量变形
张量变形是指重新排列张量的行和列,以得到想要的形状,元素个数不变。
>>> x = np.array([[0., 1.],[2., 3.],[4., 5.]])
>>> 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.]])
常见的一种特殊的张量变形是转置(transpose)。矩阵转置是指将矩阵的行和列互换,即把 x[i, :]
变为 x[:, i]
。
>>> x = np.zeros((300, 20))
>>> x = np.transpose(x)
>>> x.shape
(20, 300)
相关概念
逐元素运算
逐元素(element-wise)运算,即该运算分别应用于张量的每个元素。 NumPy 内置函数。这些函数将大量运算交给基础线性代数程序集(Basic Linear Algebra Subprograms,BLAS)实现。BLAS 是低层次(low-level)、高度并行、高效的张量操作程序,通常用 Fortran 或 C 语言来实现。 因此,在 NumPy 中可以直接进行下列逐元素运算,速度非常快。
广播
不同形状的张量相加时,会发生: (1) 向较小张量添加轴 (广播轴(broadcast axis)),使其 ndim 与较大张量相同。 (2) 将较小张量沿着新轴重复,使其形状与较大张量相同。
张量积(点积)
1.点积与张量的顺序相关
2.对于向量x,y之间的点积运算:
- 两向量的元素个数必须相同
3.对矩阵 x,y 之间的点积运算:
- 矩阵形状必须符合:x(a,b),y(b, c)
![[Pasted image 20241228175950.png]]
张量函数
Relu运算
relu 代表“修正线性单元”(rectified linear unit), 它的主要作用是将输入值限制在一个非负的范围内,即当输入值小于0时,输出值为0;当输入值大于等于0时,输出值等于输入值本身。ReLU函数表达式为:f(x) = max(0, x)。
点积运算
dot