文章目录
- 一、简单运算
- 二、广播运算
- 1.广播的基本规则
- 2.广播操作的例子
- 三、运算函数
参考:与凤行
张量的数学运算是深度学习和科学计算中的基础。张量可以被视为一个多维数组,其在数学和物理学中有广泛的应用。这些运算包括但不限于加法、减法、乘法、除法、内积、外积、张量积、索引、切片以及各种变换等。运算的结果都是一个张量。 一维张量被称作向量。 下面,我们会详细介绍这些基础运算。
一、简单运算
import torch
tensor1=torch.tensor([1,2,3,4,5])
tensor2=torch.tensor([5,4,3,2,1])
- 1.加法+
- 对应位置的元素相加
- 要求参与运算的张量形状相同
print("加法结果:",tensor1+tensor2)
- 2.减法-
- 对应位置的元素相减
- 要求参与运算的张量形状相同
print("减法结果:",tensor1-tensor2)
- 3.逐元素乘法*
- 对应位置的元素相乘
- 要求参与运算的张量形状相同
print("乘法结果:",tensor1*tensor2)
- 3.逐元素除法/
- 对应位置的元素相除
- 要求参与运算的张量形状相同
print("除法结果:",tensor1/tensor2)
- 5.数乘,标量乘法*
- 标量乘以张量的每一个元素
print("数乘结果:",2*tensor1)
print("数乘结果:",2*tensor2)
- 6.点积@
- 和数学上向量的点积效果一致
- 用于计算两个矩阵乘法 或 向量的点积
- 要求参与运算的张量形状相同
print("点积结果:",tensor1@tensor2)
二、广播运算
广播(Broadcasting)是一种在不同形状的数组(张量)之间进行数学运算的方法,它允许逐元素操作自动扩展到不匹配的数组形状,无需显式复制数据。广播规则可以简化数组操作,使代码更简洁,同时提高运算效率。这在NumPy、TensorFlow、PyTorch等科学计算和深度学习库中非常常见。
1.广播的基本规则
广播遵循以下三条规则:
-
规则1:如果两个数组的维数不相同,那么小维度数组的形状将会在最左边补1。
举例来说,如果你有一个256×256×3的数组(比如一张256x256像素的彩色图像,3表示颜色通道)和一个3的数组(表示每个颜色通道的缩放因子),那么这个小维度数组的形状会在最左边补1直到两个数组的维数相同,即小数组的形状会被视为1 ×1 × 3。
-
规则2:对于每个维度,如果一个数组的大小在该维度上为1,而另一个数组的大小在该维度上大于1,那么首先数组会在该维度上扩展以匹配另一个数组的大小。
继续上面的例子,1 ×1 × 3的数组在前两个维度上大小为1,会被扩展为与另一个数组在这些维度上的大小相同,即扩展为256×256×3。
-
规则3:如果在所有维度上,大小匹配或其中一个数组的大小为1,则认为它们是兼容的。如果在某个维度上,两个数组的大小既不相等也不是其中一个为1,则会抛出异常,因为它们被认为是不兼容的。
在规则1和规则2的帮助下,大部分时候数组都能够兼容。但如果两个数组在某个维度上都不为1且不相等,比如一个形状为(2,3)的数组和一个形状为(3,3)的数组,那么它们就无法通过广播兼容。
2.广播操作的例子
假设我们有一个4×3的矩阵A
,想要逐元素加上一个长度为3的向量v
,即对A
的每一行都加上v
。按照传统方法,我们可能需要通过循环来实现;但利用广播,这个操作可以自动完成。
import torch
tensor1=torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
tensor2=torch.tensor([1, 0, 1])
# A是一个4x3的矩阵,v是一个长度为3的向量
# 通过广播,将v加到A的每一行上
# 利用广播,无需显式扩展v的形状
print("广播加法结果:\n",tensor1+tensor2)
print("广播乘法结果:\n",tensor1*tensor2)
这里,v
的形状被自动扩展到与A
一致,实际上相当于v
被复制成了一个4×3的矩阵,然后与A
进行逐元素相加。
三、运算函数
import torch
tensor1=torch.tensor([1,2,3,4,5])
tensor2=torch.tensor([5,4,3,2,1])
- 加法torch.add()
- 和直接加法是一样效果的,直接加法进行了函数重载而已。
print("加法结果:",torch.add(tensor1,tensor2))
- 减法torch.sub()
print("减法结果:",torch.sub(tensor1,tensor2))
- 乘法torch.mul()
print("乘法结果:",torch.mul(tensor1,tensor2))
- 除法torch.div()
print("除法结果:",torch.div(tensor1,tensor2))
- 点积torch.dot()
- 和数学上向量的点积效果一致
- 用于计算两个一维张量的点积
- 要求参与运算的张量形状相同
print("点积结果:",torch.dot(tensor1,tensor2))
-
高维张量的点积torch.matmul()
- 用于计算矩阵乘法
-
外积torch.cross()
- 外积(叉积)是定义在两个三维向量上的二元运算,结果是一个向量,而不是点积的标量结果。外积的结果向量垂直于原来的两个向量(假设两个原向量不平行),并遵循右手规则(即当你的右手的四指从第一个向量通过最短角度旋转到第二个向量时,你的大拇指指向的方向就是外积向量的方向)。
- 和数学上的外积一样
- 长度是原始向量 a 和 b 构成的平行四边形的面积。
import torch
tensor1=torch.tensor([1,2,3])
tensor2=torch.tensor([4,5,6])
print("外积结果:",torch.cross(tensor1,tensor2))
- 范数torch.norm()
norm
默认计算L2范数(欧几里得距离)。- vector_norm: Expected a floating point or complex tensor as input.(期望一个浮点或复数张量作为输入)
import torch
x = torch.tensor([1.0, -2.0, 3.0])
#等价于x = torch.tensor([1, -2, 3],dtype=torch.float)
# 计算L1范数
l1_norm = torch.norm(x, p=1)
print("L1 norm:", l1_norm)
# 计算L2范数
l2_norm = torch.norm(x, p=2)#等价于l2_norm = torch.norm(x)
print("L2 norm:", l2_norm)
# 计算无穷范数
inf_norm = torch.norm(x, p=float('inf'))
print("Infinity norm:", inf_norm)