跳到主要内容

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向量的维度越高,代表数据的特征点角度越多)

张量运算

PyTorch官方文档

基础操作

张量切片

选择张量的特定元素叫作张量切片(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

加法运算