【youcans的深度学习 10】PyTorch入门教程:张量的统计运算与比较运算

欢迎关注『youcans的深度学习』系列,持续更新中…
【youcans的深度学习 01】安装环境之 miniconda
【youcans的深度学习 02】PyTorch CPU版本安装与环境配置
【youcans的深度学习 03】PyTorch CPU版本安装与环境配置
【youcans的深度学习 04】PyTorch入门教程:基础知识
【youcans的深度学习 05】PyTorch入门教程:快速入门
【youcans的深度学习 06】PyTorch入门教程:张量的基本操作 1
【youcans的深度学习 07】PyTorch入门教程:张量的基本操作 2
【youcans的深度学习 08】PyTorch入门教程:张量的就地操作和广播机制
【youcans的深度学习 09】PyTorch入门教程:张量的逐点运算
【youcans的深度学习 10】PyTorch入门教程:张量的统计运算与比较运算

PyTorch 中支持 100 多种张量操作,包括转置、索引、切⽚、数学运算、线性代数、随机数等等,详见【PyTorch官方文档】

3. 张量的统计分析运算

张量的归约运算,是对张量进行某种聚合总结,而得到计算结果的函数。规约运算主要包含数据科学领域内的诸多统计分析函数,如均值、极值、方差、中位数函数等等。

3.1 均值、方差与求和

函数原型:

torch.sum(input, dim, keepdim=False, *, dtype=None) → Tensor # 张量求和
torch.mean(input, dim, keepdim=False, *, dtype=None, out=None) → Tensor # 张量的均值
torch.nanmean(input, dim=None, keepdim=False, *, dtype=None) → Tensor # 非Nan元素的均值
torch.var(input, dim=None, *, correction=1, keepdim=False, out=None) → Tensor # 张量的方差
torch.std(input, dim=None, *, correction=1, keepdim=False, out=None) → Tensor # 张量的标准差
torch.var_mean(input, dim=None, *, correction=1, keepdim=False, out=None) # 张量的方差和均值

参数说明:

  • input,张量,输入张量。
  • dim,整数或整型元组,指定维度。
  • out,张量,输出张量。
  • keepdim,布尔值,输出张量是否保留 dim,可选项,默认为 False
  • correction,整数,可选项,默认值为 1 表示 Bessel 校正

函数说明:
(1)函数返回张量沿指定维度 dim 的所有元素的均值、方差与求和。参数 dim 缺省时,函数默认对张量的所有元素进行计算,返回 0 维张量。参数 dim 为整数或整型元组时,按照 dim 指定维度的所有元素进行计算。
(2)函数 torch.var_mean、torch.std_mean 返回一个元组,元组的元素分别是方差和均值。
(3)函数 torch.nanmean 返回张量沿指定维度的非Nan元素的平均值。

# (10) 张量的统计分析运算:均值、方差与求和
# 张量求和
x = torch.arange(1, 16).reshape(3, 5)  # torch.Size([3, 5])
print(x)
s1 = torch.sum(x)  # 张量所有元素求和
s2 = torch.sum(x, dim=0)  # 按指定dim求和
s3 = torch.sum(x, dim=1)  # 按指定dim求和
print("sum(x):", s1)  # torch.Size([])
print("sum(x,0):", s2)  # torch.Size([5])
print("sum(x,1):", s3)  # torch.Size([3])
print(s1.shape, s2.shape, s3.shape)
# tensor([[ 1,  2,  3,  4,  5],
#         [ 6,  7,  8,  9, 10],
#         [11, 12, 13, 14, 15]])
# sum(x): tensor(120)
# sum(x,0): tensor([18, 21, 24, 27, 30])
# sum(x,1): tensor([15, 40, 65])
# torch.Size([]) torch.Size([5]) torch.Size([3])

# 张量均值
x = torch.arange(1.0, 16.0).reshape(3,5)  # torch.Size([3, 5])
m1 = torch.mean(x)  # 张量所有元素求均值
m2 = torch.mean(x, dim=0)  # 按指定dim求均值
m3 = torch.mean(x, dim=1)  # 按指定dim求均值
print("mean(x):", m1)  # torch.Size([])
print("mean(x,0):", m2)  # torch.Size([5])
print("mean(x,1):", m3)  # torch.Size([3])
print(m1.shape, m2.shape, m3.shape)
# mean(x): tensor(8.)
# mean(x,0): tensor([ 6.,  7.,  8.,  9., 10.])
# mean(x,1): tensor([ 3.,  8., 13.])
# torch.Size([]) torch.Size([5]) torch.Size([3])

# 张量方差
x = torch.arange(1.0, 16.0).reshape(3,5)  # torch.Size([3, 5])
v1 = torch.var(x)  # 张量所有元素求方差
v2 = torch.var(x, dim=0)  # 按指定dim求方差
v3 = torch.var(x, dim=1)  # 按指定dim求方差
print("var(x):", v1)  # torch.Size([])
print("var(x,0):", v2)  # torch.Size([5])
print("var(x,1):", v3)  # torch.Size([3])
print(v1.shape, v2.shape, v3.shape)
# var(x): tensor(20.)
# var(x,0): tensor([25., 25., 25., 25., 25.])
# var(x,1): tensor([2.5000, 2.5000, 2.5000])
# torch.Size([]) torch.Size([5]) torch.Size([3])

# 张量标准差
x = torch.arange(1.0, 16.0).reshape(3,5)  # torch.Size([3, 5])
s1 = torch.std(x)  # 张量所有元素求标准差
s2 = torch.std(x, dim=0)  # 按指定dim求标准差
s3 = torch.std(x, dim=1)  # 按指定dim求标准差
print("std(x):", s1)  # torch.Size([])
print("std(x,0):", s2)  # torch.Size([5])
print("std(x,1):", s3)  # torch.Size([3])
print(s1.shape, s2.shape, s3.shape)
# std(x): tensor(4.4721)
# std(x,0): tensor([5., 5., 5., 5., 5.])
# std(x,1): tensor([1.5811, 1.5811, 1.5811])
# torch.Size([]) torch.Size([5]) torch.Size([3])

3.2 最大值与最小值

函数原型:

torch.max(input, dim, keepdim=False, *, out=None) → out # 张量的最大值
torch.max(input, other, *, out=None) → out # 两个张量的最大值
torch.min(input, dim, keepdim=False, *, out=None) → out # 张量的最小值
torch.min(input, other, *, out=None) → out # 两个张量的最小值
torch.argmax(input, dim, keepdim=False) → Tensor # 张量的最大值索引
torch.argmin(input, dim, keepdim=False) → Tensor # 张量的最小值索引
torch.topk(input, k, dim=None, largest=True, sorted=True, *, out=None) # k 个最大/小值
torch.median(input, dim, keepdim=False, *, out=None) → out # 张量的中值

参数说明:

  • input,张量,输入张量。
  • dim,整数或整型元组,指定维度。
  • out,张量,输出张量。
  • keepdim,布尔值,输出张量是否保留 dim,可选项,默认为 False
  • other,张量,另一个输入张量,形状与 input 相同
  • k,整数,top-k 的 k 值
  • largest,布尔值,控制返回最大值或最小值
  • sorted,布尔值,控制返回元素是否排序

函数说明:
(1)函数返回张量沿指定维度 dim 的所有元素的最大值或最小值。
(2)参数 dim 缺省时,函数默认对张量的所有元素进行计算,返回 0 维张量。参数 dim 为整数或整型元组时,按照 dim 指定维度的所有元素进行计算,返回值是带有 2 个 key( values, indices)的字典。
(3)函数 torch.topk 的返回值是带有 2 个 key( values, indices)的字典。
(4)对于具有偶数个元素的输入张量,中值不是唯一的,函数 torch.median 返回两个中值中较小的一个。


# (11) 张量的统计分析运算: 最大值与最大值索引
# 张量最大值
x = torch.arange(1.0, 16.0).reshape(3, 5)  # torch.Size([3, 5])
max1 = torch.max(x)  # 张量所有元素求最大值
print("max(x):", max1)  # torch.Size([])
# max(x): tensor(15.)
max2 = torch.max(x, dim=0)  # 按指定dim求最大值
print(max2)  # 返回值是字典, 有两个key: values和indices
# torch.return_types.max(
# values=tensor([11., 12., 13., 14., 15.]),
# indices=tensor([2, 2, 2, 2, 2]))
print(max2.values)  # torch.Size([5])
# tensor([11., 12., 13., 14., 15.])
print(max2.indices)  # torch.Size([5])
# tensor([2, 2, 2, 2, 2])

# 两个张量的最大值
a = torch.tensor((1, 2, -1))
b = torch.tensor((3, 0, 6))
print(torch.max(a, b))  # tensor([3, 2, 6])
print(torch.maximum(a, b))  # tensor([3, 2, 6])

# 张量的最大值索引
x = torch.arange(1.0, 16.0).reshape(3, 5)  # torch.Size([3, 5])
arg1 = torch.argmax(x)  # 张量所有元素求最大值索引
print("argmax(x):", arg1)  # torch.Size([])
# argmax(x): tensor(14)
arg2 = torch.argmax(x, dim=0)  # 按指定dim求最大值
print("argmax(x,0):", arg2)  # torch.Size([5])
# argmax(x,0): tensor([2, 2, 2, 2, 2])
arg3 = torch.argmax(x, dim=1)  # 按指定dim求最大值
print("argmax(x,1):", arg3)  # torch.Size([3])
# argmax(x,1): tensor([4, 4, 4])

# 返回 k 个最大值
x = torch.arange(1.0, 10.0)  # torch.Size([3, 5])
x_topk = torch.topk(x, k=2)  # 返回值是字典, 有两个key: values和indices
print(x_topk)
# torch.return_types.topk(
# values=tensor([9., 8.]),
# indices=tensor([8, 7]))
print(x_topk.values)  # tensor([9., 8.])
print(x_topk.indices)  # tensor([8, 7])

3.3 累积乘与累积和

函数原型:

torch.cumprod(input, dim, *, dtype=None, out=None) → Tensor # 张量的累积乘
torch.cumsum(input, dim, *, dtype=None, out=None) → Tensor # 张量的累积和

张量累积乘/累积和函数,返回维度dim中输入元素的累积乘积/累积和。如果输入是大小为N的向量,则结果也将是大小为N的向量,其中包含元素。

# (12) 张量的统计分析运算: 累积乘与累积和
x = torch.arange(1.0, 6.0)
x_cumprod = torch.cumprod(x, dim=0)
x_cumsum = torch.cumsum(x, dim=0)
print("x_cumprod:", x_cumprod)
# x_cumprod: tensor([  1.,   2.,   6.,  24., 120.])
print("x_cumsum:", x_cumsum)
# x_cumsum: tensor([ 1.,  3.,  6., 10., 15.])

4. 张量的比较操作

张量的比较操作,是指对多个张量进行比较运算的方法。

函数原型:

torch.equal(input, other) → bool # 比较两个张量是否相等
torch.eq(input, other, *, out=None) → Tensor # 比较两个张量的元素是否相同
torch.ne(input, other, *, out=None) → Tensor # 比较两个张量的元素是否相同
torch.gt(input, other, *, out=None) → Tensor # 比较两个张量的元素是否满足大于关系
torch.ge(input, other, *, out=None) → Tensor # 比较两个张量的元素是否满足大于等于关系
torch.lt(input, other, *, out=None) → Tensor # 比较两个张量的元素是否满足小于关系
torch.le(input, other, *, out=None) → Tensor # 比较两个张量的元素是否满足小于等于关系
torch.isnan(input) → Tensor # 检查张量的元素是否为NaN
torch.sort(input, dim=-1, descending=False, stable=False, *, out=None) # 对张量的元素按升序排列

参数说明:

  • input,张量,输入张量。
  • other,张量或浮点数,第二个输入张量。
  • out,张量,输出张量,布尔类型。

函数说明:
(1)函数 torch.equal 比较两个张量是否相等,结果是一个布尔值。函数 torch.eq 比较两个张量的逐个元素,结果是一个布尔型张量。
(2)函数 torch.gt、torch.ge、torch.lt、torch.le 逐个元素比较张量 input 与 other 的大小,结果是一个布尔型张量。
(3)函数 torch.sort 将输入张量的元素沿给定维度按值升序排列,返回值是带有 2 个 key( values, indices)的字典。

# (13) 张量的比较操作
x = torch.tensor([[1,2,3],[4,5,6]])
y = torch.tensor([[1,2,3],[4,5,6]])
z = torch.tensor([[0,2,3],[0,5,6]])

# 比较两个张量是否相等
x_equal_y = torch.equal(x, y)
x_equal_z = torch.equal(x, z)
print("x equal y:", x_equal_y)  # x equal y: True
print("x equal z:", x_equal_z)  # x equal z: False

# 比较两个张量的逐个元素是否相等
x_eq_y = torch.eq(x, y)
x_eq_z = torch.eq(x, z)
print("x eq y:", x_eq_y)
# x eq y: tensor([[True, True, True], [True, True, True]])
print("x eq z:", x_eq_z)
# x eq z: tensor([[False, True, True], [False, True, True]])

# 检查张量元素的性质
x = torch.tensor([1, float('nan'), 2])
print("isnan(x):", torch.isnan(x))  # 检查是否为 NaN
# isnan(x): tensor([False,  True, False])
print("isfinite(x):", torch.isfinite(x))  # 检查是否为有界数值
# isfinite(x): tensor([ True, False,  True])
print("isinf(x):", torch.isinf(x))  # 检查是否为无界数值
# isinf(x): tensor([False, False, False])

# 对张量的元素排序
x = torch.tensor([[1, 4, 7], [3, 0, 6]])
print(x)
print(torch.sort(x))
# torch.return_types.sort(
# values=tensor([[1, 4, 7], [0, 3, 6]]),
# indices=tensor([[0, 1, 2], [1, 0, 2]]))
print(torch.sort(x, dim=0))  #
# torch.return_types.sort(
# values=tensor([[1, 0, 6], [3, 4, 7]]),
# indices=tensor([[0, 1, 1], [1, 0, 0]]))
print(torch.sort(x, dim=1))  #
# torch.return_types.sort(
# values=tensor([[1, 4, 7], [0, 3, 6]]),
# indices=tensor([[0, 1, 2], [1, 0, 2]]))

5. 张量的线性代数运算

BLAS(Basic Linear Algeria Subprograms)和 LAPACK(Linear Algeria Package)模块提供了完整的线性代数基本方法,包括:

  1. 矩阵的形变及特殊矩阵的构造方法:包括矩阵的转置、对角矩阵的创建、单位矩阵的创建、上/下三角矩阵的创建等;
  2. 矩阵的基本运算:包括矩阵乘法、向量内积、矩阵和向量的乘法等,当然,此处还包含了高维张量的基本运算,将着重探讨矩阵的基本方法
  3. 运算拓展至三维张量中的基本方法;
  4. 矩阵的线性代数运算:包括矩阵的迹、矩阵的秩、逆矩阵的求解、伴随矩阵和广义逆矩阵等;
  5. 矩阵分解运算:特征分解、奇异值分解和SVD分解等。

版权声明:
欢迎关注『youcans的深度学习』系列,转发请注明原文链接:
【youcans的深度学习 10】PyTorch入门教程:张量的统计运算(https://youcans.blog.csdn.net/article/details/130745989)
Copyright 2023 youcans, XUPT
Crated:2023-05-18

猜你喜欢

转载自blog.csdn.net/youcans/article/details/130745989