7. PyTorch 张量的数学运算
在深度学习中,张量的数学运算是构建神经网络模型的核心部分。PyTorch 提供了丰富的张量数学运算功能,这些功能使得我们能够高效地进行张量之间的加、减、乘、除等操作,以及更复杂的数学变换,如矩阵乘法、求和、求平均等。本节将详细介绍 PyTorch 中张量的数学运算方法。
7.1 基本数学运算
7.1.1 加法
张量的加法操作可以对两个形状相同的张量逐元素进行相加。如果张量的形状不同,PyTorch 会尝试进行广播(Broadcasting)操作。
import torch
# 创建两个一维张量
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
# 逐元素相加
result = tensor1 + tensor2
print("逐元素相加的结果:", result)
# 广播加法
tensor3 = torch.tensor([1, 2, 3])
scalar = 2
result = tensor3 + scalar
print("广播加法的结果:", result)
输出结果为:
逐元素相加的结果: tensor([5, 7, 9])
广播加法的结果: tensor([3, 4, 5])
7.1.2 减法
张量的减法操作同样可以对两个形状相同的张量逐元素进行相减。如果张量的形状不同,PyTorch 也会尝试进行广播操作。
# 创建两个一维张量
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
# 逐元素相减
result = tensor1 - tensor2
print("逐元素相减的结果:", result)
# 广播减法
tensor3 = torch.tensor([1, 2, 3])
scalar = 2
result = tensor3 - scalar
print("广播减法的结果:", result)
输出结果为:
逐元素相减的结果: tensor([-3, -3, -3])
广播减法的结果: tensor([-1, 0, 1])
7.1.3 乘法
张量的乘法操作可以分为逐元素乘法和矩阵乘法。逐元素乘法对两个形状相同的张量逐元素进行相乘,而矩阵乘法则用于二维张量的矩阵运算。
# 创建两个一维张量
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
# 逐元素相乘
result = tensor1 * tensor2
print("逐元素相乘的结果:", result)
# 创建两个二维张量
tensor3 = torch.tensor([[1, 2], [3, 4]])
tensor4 = torch.tensor([[5, 6], [7, 8]])
# 矩阵乘法
result = torch.matmul(tensor3, tensor4)
print("矩阵乘法的结果:\n", result)
输出结果为:
逐元素相乘的结果: tensor([ 4, 10, 18])
矩阵乘法的结果:
tensor([[19, 22],
[43, 50]])
7.1.4 除法
张量的除法操作同样可以对两个形状相同的张量逐元素进行相除。如果张量的形状不同,PyTorch 会尝试进行广播操作。
# 创建两个一维张量
tensor1 = torch.tensor([1.0, 2.0, 3.0])
tensor2 = torch.tensor([4.0, 5.0, 6.0])
# 逐元素相除
result = tensor1 / tensor2
print("逐元素相除的结果:", result)
# 广播除法
tensor3 = torch.tensor([1.0, 2.0, 3.0])
scalar = 2.0
result = tensor3 / scalar
print("广播除法的结果:", result)
输出结果为:
逐元素相除的结果: tensor([0.2500, 0.4000, 0.5000])
广播除法的结果: tensor([0.5000, 1.0000, 1.5000])
7.2 高级数学运算
7.2.1 求和
PyTorch 提供了多种求和方法,可以对张量的全部元素求和,也可以按指定维度求和。
# 创建一个二维张量
tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 对全部元素求和
result = torch.sum(tensor)
print("对全部元素求和的结果:", result)
# 按指定维度求和
result = torch.sum(tensor, dim=0)
print("按列求和的结果:", result)
result = torch.sum(tensor, dim=1)
print("按行求和的结果:", result)
输出结果为:
对全部元素求和的结果: tensor(21)
按列求和的结果: tensor([5, 7, 9])
按行求和的结果: tensor([ 6, 15])
7.2.2 求平均
与求和类似,PyTorch 也提供了求平均的方法,可以对张量的全部元素求平均,也可以按指定维度求平均。
# 创建一个二维张量
tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 对全部元素求平均
result = torch.mean(tensor.float())
print("对全部元素求平均的结果:", result)
# 按指定维度求平均
result = torch.mean(tensor.float(), dim=0)
print("按列求平均的结果:", result)
result = torch.mean(tensor.float(), dim=1)
print("按行求平均的结果:", result)
输出结果为:
对全部元素求平均的结果: tensor(3.5000)
按列求平均的结果: tensor([2.5000, 3.5000, 4.5000])
按行求平均的结果: tensor([2., 5.])
7.2.3 最大值与最小值
PyTorch 提供了求最大值和最小值的方法,可以对张量的全部元素求最大值和最小值,也可以按指定维度求最大值和最小值。
# 创建一个二维张量
tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 对全部元素求最大值和最小值
max_value = torch.max(tensor)
min_value = torch.min(tensor)
print("最大值:", max_value)
print("最小值:", min_value)
# 按指定维度求最大值和最小值
max_value, max_indices = torch.max(tensor, dim=0)
min_value, min_indices = torch.min(tensor, dim=0)
print("按列求最大值的结果:", max_value)
print("按列求最大值的索引:", max_indices)
print("按列求最小值的结果:", min_value)
print("按列求最小值的索引:", min_indices)
输出结果为:
最大值: tensor(6)
最小值: tensor(1)
按列求最大值的结果: tensor([4, 5, 6])
按列求最大值的索引: tensor([1, 1, 1])
按列求最小值的结果: tensor([1, 2, 3])
按列求最小值的索引: tensor([0, 0, 0])
7.3 数学运算的注意事项
-
广播机制:在进行逐元素运算时,如果张量的形状不同,PyTorch 会尝试使用广播机制来匹配张量的形状。广播机制要求较小张量的维度能够与较大张量的维度兼容。例如,一个形状为
[3, 1]
的张量可以与一个形状为[3, 4]
的张量进行广播运算。 -
数据类型:在进行数学运算时,需要注意张量的数据类型。某些运算可能需要将张量转换为浮点类型,例如
torch.mean
。 -
原地操作:PyTorch 提供了一些原地操作(In-place operations),这些操作会直接修改原张量,而不是返回一个新的张量。例如,
tensor.add_(other)
会将other
加到tensor
上,而不会返回一个新的张量。原地操作在某些情况下可以节省内存,但需要谨慎使用,因为它们会改变原张量的值。
7.4 总结
本节详细介绍了
更多技术文章见公众号: 大城市小农民