一、引言
在《张量的运算(1)》中我们已经学习了几种张量中常用的非算数运算如张量的索引与切片,张量的拼接等。本节我们继续学习张量的算术运算。
二、张量的算术运算
(一)对应元素的加减乘除
在 PyTorch 中,张量的对应元素的算术运算包括加法、减法、乘法、除法等常见的数学运算。这些运算可以对张量进行逐元素操作(element-wise),也可以进行张量之间的广播运算(broadcasting)。
1.逐元素操作
# 创建两个张量
t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])# 加法
result_add = t1 + t2
print("加法结果:")
print(result_add)# 减法
result_sub = t1 - t2
print("\n减法结果:")
print(result_sub)# 乘法
result_mul = t1 * t2
print("\n乘法结果:")
print(result_mul)# 除法
result_div = t1 / t2
print("\n除法结果:")
print(result_div)
运行结果为:
加法结果:
tensor([[ 6, 8],[10, 12]])减法结果:
tensor([[-4, -4],[-4, -4]])乘法结果:
tensor([[ 5, 12],[21, 32]])除法结果:
tensor([[0.2000, 0.3333],[0.4286, 0.5000]])
2.广播运算
# 创建一个张量
t1 = torch.tensor([[1, 2], [3, 4]])# 与标量相加
scalar = 5
result_scalar_add = t1.add(scalar)
print("与标量相加:")
print(result_scalar_add)# 与行向量相加
row_vector = torch.tensor([10, 20])
result_row_add = t1.add(row_vector)
print("\n与行向量相加:")
print(result_row_add)# 与列向量相加
col_vector = torch.tensor([[100], [200]])
result_col_add = t1.add(col_vector)
print("\n与列向量相加:")
print(result_col_add)
运行结果为:
与标量相加:
tensor([[6, 7],[8, 9]])与行向量相加:
tensor([[11, 22],[13, 24]])与列向量相加:
tensor([[101, 102],[203, 204]])
总结,对张量进行对应元素的加减乘除运算时我们既可以直接使用运算符+
、-
、*
、/
来运算,也可以使用tensor1.add(tensor2)
、tensor1.sub(tensor2)
、tensor1.mul(tensor2)
、tensor1.div(tensor2)
进行运算。
(二)其它算术运算
1.取绝对值tensor.abs()
t1 = torch.tensor([[-1, 2], [-3, 4]])
print(f"t1中的元素取绝对值为\n{t1.abs()}")
2.裁剪tensor.clamp()[1]
tensor.clamp()
是对输入参数按照自定义的范围进行裁剪,最后将参数裁剪的结果作为输出,所以输入参数一共有三个,分别是需要进行裁剪的Tensor数据类型的变量、裁剪的上上边界和裁剪的下边界,具体的裁剪过程是:使用变量中的每个元素分别和裁剪的上边界及裁剪的下边界的值进行比较,如果元素的值小于裁剪的下边界的值,该元素被重写成裁剪的下边界的值;同理,如果元素的值大于裁剪的上边界的值,该元素就被重写成裁剪的上边界的值。具体代码如下:
t1 = torch.tensor([[-1, 12], [-6, 4]])
print(f"将t1中元素进行裁剪,范围为[-5, 5]\n{t1.clamp(-5, 5)}")
运行结果为:
将t1中元素进行裁剪,范围为[-5, 5]
tensor([[-1, 5],[-5, 4]])
3.求幂运算tensor.pow(x)
tensor.pow(x)
为求幂运算,x为要求的几次幂:
#对张量中的元素求二次幂
t1 = torch.tensor([[1, 2], [3, 4]])
print(f"将t1中元素求2次幂\n{t1.pow(2)}")
运行结果为:
将t1中元素求2次幂
tensor([[ 1, 4],[ 9, 16]])
4.矩阵与矩阵乘法tensor.mm()
tensor1.mm(tensor2)
用来计算张量1与张量2之间的矩阵乘法,tensor1
与tensor2
需要满足矩阵乘法规则:
t1 = torch.tensor([[1, 2, 3],[4, 5, 6]])
t2 = torch.tensor([[1, 2],[3, 4],[5, 6]])
print(f"将t1与t2进行矩阵乘法结果为{t1.mm(t2)}")
运行结果为:
将t1与t2进行矩阵乘法结果为tensor([[22, 28],[49, 64]])
5.矩阵与向量乘法tensor.mv()
tensor1.mv(tensor2)
用来计算张量1与张量2(必须为一阶)之间的矩阵乘法,tensor2
在实际运算前进行了转置:
t1 = torch.tensor([[1, 2, 3],[4, 5, 6]])
t2 =torch.tensor([1, 3, 5])
print(f"将t1与t2进行矩阵乘法结果为{t1.mv(t2)}")
运算结果为:
将t1与t2进行矩阵乘法结果为tensor([22, 49])