首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】13.Tensor的归并操作+比较操作+排序操作


本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





01

归并操作:


Tensor对象的归并操作通常是指沿着指定的维度对张量中的元素进行某种方式的汇总或累积。例如,求和(sum)、求均值(mean)等。

常用的归并操作如下表所示:
函数
描述
mean/sum/median/mode
均值/求和/中位数/众数
norm/dist
范数/距离
std/var
标准差/方差
cumsum/cumprod
累加/累积

上述归并操作都有一个维度参数dim,用于指定操作在哪个维度上执行。

这些归并操作通常会减少张量的维度数,除非指定了keepdim参数为True
假设输入的Tensor的形状为(c,h,w),那么输出Tensor形状有如下三种情况:
  • dim=0时,输出形状为(1,h,w)(此时keepdim=True)或h,w);
  • dim=1时,输出形状为(c,1,w(此时keepdim=Truec,w);
  • dim=2时,输出形状为(c,h,1(此时keepdim=Truec,h)。

>>> t = torch.arange(24).reshape(2,3,4).float()
>>> t
tensor([[[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.]]
,

        [[12., 13., 14., 15.],
         [16., 17., 18., 19.],
         [20., 21., 22., 23.]]
])

# 求和
>>> t.sum()
tensor(276.)
>>> t.sum(dim=0)
tensor([[12., 14., 16., 18.],
        [20., 22., 24., 26.],
        [28., 30., 32., 34.]]
)
>>> t.sum(dim=0 , keepdim=True)
tensor([[[12., 14., 16., 18.],
         [20., 22., 24., 26.],
         [28., 30., 32., 34.]]
])
>>> t.sum(dim=0).shape
torch.Size([34])
>>> t.sum(dim=0 , keepdim=True).shape
torch.Size([134])

# 累加
>>> t.cumsum(dim=1)
tensor([[[ 0.,  1.,  2.,  3.],
         [ 4.,  6.,  8., 10.],
         [12., 15., 18., 21.]]
,

        [[12., 13., 14., 15.],
         [28., 30., 32., 34.],
         [48., 51., 54., 57.]]
])


02

比较操作:


比较操作,这些操作通常会逐元素地比较两个张量,并返回一个新的布尔张量(torch.BoolTensor),其中的每个元素都表示相应位置元素的比较结果。
以下是一些常见的比较操作,这些操作可以直接使用运算符,也可以使用对应的PyTorch函数
  • 等于:==torch.eq()
  • 不等于!=  torch.ne()
  • 小于<  torch.lt()
  • 小于或等于<=  torch.le()
  • 大于>  torch.gt()
  • 大于或等于>=  torch.ge()
>>> a = torch.rand(2,3)
>>> a
tensor([[0.83870.16050.5162],
        [0.33640.06410.5297]])

>>> a > 0.5
tensor([[ TrueFalse,  True],
        [FalseFalse,  True]])

>>> torch.gt(a,0.5)
tensor([[ TrueFalse,  True],
        [FalseFalse,  True]])

>>> a != 0.5
tensor([[TrueTrueTrue],
        [TrueTrueTrue]])

# 比较两个数组每个位置上的元素是否相等
>>> a = torch.ones(2,3)
>>> b = torch.rand(2,3)
>>> torch.eq(a,b)
tensor([[FalseFalseFalse],
        [FalseFalseFalse]])
>>> torch.eq(a,a)
tensor([[TrueTrueTrue],
        [TrueTrueTrue]])

# 比较两个数组是否相等
>>> torch.equal(a,a)
True


03

排序操作:


PyTorch提供了几种不同的排序函数,以满足不同的需求。
下列函数均存在函数级别以及张量对象级别的方法。
函数
描述
sort(input,dim)
对指定维度进行排序
argsort(input,dim)
返回指定维度排序结果的索引
max/min
在给定dim上的最大值/最小值
argmax/argmin 在给定dim上最大值/最小值的索引
topk(input,k)
返回最大的k个元素及其索引
kthvalue(k, dim) 第k个最小元素及其索引
  • sort() / argsort():

torch.sort(input, dim=-1, descending=False): 该函数对输入的张量进行排序,并返回两个张量,第一个张量是排序后的值,第二个张量是排序后的原始索引。参数 dim 指定了排序的维度,descending 指定了排序的顺序(默认为升序)。
torch.argsort(input, dim=-1, descending=False): 函数也是对输入的张量进行排序,但它只返回一个张量,即排序后的原始索引。参数 dimdescending 的作用与 torch.sort() 相同。
>>> a = torch.rand(3,4)
>>> a
tensor([[0.8845, 0.7018, 0.6905, 0.6679],
        [0.0410, 0.7434, 0.7578, 0.0447],
        [0.2688, 0.7072, 0.5672, 0.8584]]
)

# 对最后一维,进行升序排列
>>> torch.sort(a)
torch.return_types.sort(
values=tensor([[0.6679, 0.6905, 0.7018, 0.8845],
        [0.0410, 0.0447, 0.7434, 0.7578],
        [0.2688, 0.5672, 0.7072, 0.8584]]
),
indices=tensor([[3, 2, 1, 0],
        [0, 3, 1, 2],
        [0, 2, 1, 3]]
))

# 最后一维升序排列的索引
>>> torch.argsort(a)
tensor([[3, 2, 1, 0],
        [0, 3, 1, 2],
        [0, 2, 1, 3]]
)

# 对第一维,进行降序排列
>>> a.sort(dim=0,descending=True)
torch.return_types.sort(
values=tensor([[0.8845, 0.7434, 0.7578, 0.8584],
        [0.2688, 0.7072, 0.6905, 0.6679],
        [0.0410, 0.7018, 0.5672, 0.0447]]
),
indices=tensor([[0, 1, 1, 2],
        [2, 2, 0, 0],
        [1, 0, 2, 1]]
))

# 第一维降序排列的索引
>>> a.argsort(dim=0,descending=True)
tensor([[0, 1, 1, 2],
        [2, 2, 0, 0],
        [1, 0, 2, 1]]
)


  • max() / min() / argmax() / argmin()

这些函数可以应用于整个张量,或者沿着指定的维度。
  • torch.max(input, dim, keepdim=False): 返回输入张量中的所有元素的最大值。如果指定了dim参数,则沿着该维度返回最大值和对应的索引。
  • torch.min(input, dim, keepdim=False): 返回输入张量中的所有元素的最小值。如果指定了dim参数,则沿着该维度返回最小值和对应的索引。
  • torch.argmax(input, dim, keepdim=False): 返回输入张量中最大元素的索引。如果指定了dim参数,则沿着该维度返回最大值的索引。
  • torch.argmin(input, dim, keepdim=False): 返回输入张量中最小元素的索引。如果指定了dim参数,则沿着该维度返回最小值的索引。

>>> a = torch.rand(3,4)
>>> a
tensor([[0.2928, 0.8280, 0.6268, 0.2635],
        [0.9189, 0.6029, 0.6341, 0.4216],
        [0.2176, 0.9714, 0.1880, 0.9103]]
)

# 打平后的最大值索引
>>> a.argmax()
tensor(9)

# 在给定dim上进行最小值索引
>>> a.argmin(dim=1)
tensor([332])

# 最大值
>>> a.max()
tensor(0.9714)

# 使用keepdim=True可以保持应有的dim,即仅仅是将求最值的那个dim的size变成了1,返回的结果是符合原Tensor语义的。
>>> a.min(dim=1,keepdim=True)
torch.return_types.min(
values=tensor([[0.2635],
        [0.4216],
        [0.1880]]
),
indices=tensor([[3],
        [3],
        [2]]
))
另外,torch.max(input, other)torch.min(input, other)还可以分别计算并返回输入的两个张量对应位置上的较大值。此时等价于torch.maximum(input, other)torch.minimum(input, other)
# torch.max(a,b),返回两个Tensor对应位置的较大元素
>>> a = torch.rand(3,4)
>>> a
tensor([[0.3549, 0.3967, 0.7808, 0.3763],
        [0.5832, 0.6268, 0.3987, 0.5038],
        [0.9426, 0.6296, 0.8136, 0.7722]]
)
>>> b = torch.rand(3,4)
>>> b
tensor([[0.6885, 0.0886, 0.9042, 0.8087],
        [0.7893, 0.2698, 0.2500, 0.2637],
        [0.5090, 0.9933, 0.2943, 0.0621]]
)

>>> torch.max(a,b)
tensor([[0.6885, 0.3967, 0.9042, 0.8087],
        [0.7893, 0.6268, 0.3987, 0.5038],
        [0.9426, 0.9933, 0.8136, 0.7722]]
)

>>> torch.maximum(a,b)
tensor([[0.6885, 0.3967, 0.9042, 0.8087],
        [0.7893, 0.6268, 0.3987, 0.5038],
        [0.9426, 0.9933, 0.8136, 0.7722]]
)

  • topk() / kthvalue()
  • torch.topk(input, k, dim=None, largest=True, sorted=True): 函数返回输入张量中前k个最大或最小的元素及其索引。参数k指定了要返回的元素数量,dim指定了操作的维度(如果未指定,则输入张量会被展平),largest指定了是否返回最大的元素(默认为True,如果为False则返回最小的元素),sorted指定了返回的元素是否应该被排序(默认为True)。函数返回两个张量,第一个张量包含前k个元素的值,第二个张量包含这些元素在原张量中的索引。
  • torch.kthvalue(input, k, dim=None, keepdim=False): 函数返回输入张量中第k小的元素及其索引。dim指定了操作的维度(如果未指定,则输入张量会被展平),keepdim指定了输出张量的维度是否与输入张量保持一致。函数返回两个值,第一个值是第k小的元素,第二个值是该元素在原张量中的索引。
>>> a = torch.rand(3,4)
>>> a
tensor([[0.7682, 0.7848, 0.2676, 0.6854],
        [0.0665, 0.5625, 0.6056, 0.3501],
        [0.0339, 0.8006, 0.8134, 0.0145]]
)

# 维度1,最大的2
>>> torch.topk(input=a , k=2,dim=1)
torch.return_types.topk(
values=tensor([[0.7848, 0.7682],
        [0.6056, 0.5625],
        [0.8134, 0.8006]]
),
indices=tensor([[1, 0],
        [2, 1],
        [2, 1]]
))

# 维度1,最小的2
>>> a.topk(2,dim=1,largest=False)
torch.return_types.topk(
values=tensor([[0.2676, 0.6854],
        [0.0665, 0.3501],
        [0.0145, 0.0339]]
),
indices=tensor([[2, 3],
        [0, 3],
        [3, 0]]
))

# 维度1,第2小的
>>> torch.kthvalue(input=a , k=2,dim=1)
torch.return_types.kthvalue(
values=tensor([0.68540.35010.0339]),
indices=tensor([330]))

# 维度0,最小的
>>> a.kthvalue(1,dim=0)
torch.return_types.kthvalue(
values=tensor([0.03390.56250.26760.0145]),
indices=tensor([2102]))

更多内容可以前往官网查看

https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments