本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/PyTorch
归并操作:
Tensor对象的归并操作通常是指沿着指定的维度对张量中的元素进行某种方式的汇总或累积。例如,求和(sum)、求均值(mean)等。
函数 |
描述 |
mean/sum/median/mode |
均值/求和/中位数/众数 |
norm/dist |
范数/距离 |
std/var |
标准差/方差 |
cumsum/cumprod |
累加/累积 |
上述归并操作都有一个维度参数dim,用于指定操作在哪个维度上执行。
-
dim=0时,输出形状为(1,h,w)(此时keepdim=True)或(h,w); -
dim=1时,输出形状为(c,1,w)(此时keepdim=True)或(c,w); -
dim=2时,输出形状为(c,h,1)(此时keepdim=True)或(c,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([3, 4])
>>> t.sum(dim=0 , keepdim=True).shape
torch.Size([1, 3, 4])
# 累加
>>> 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.]]])
比较操作:
-
等于:== 或 torch.eq(); -
不等于:!= 或 torch.ne(); -
小于:< 或 torch.lt(); -
小于或等于:<= 或 torch.le(); -
大于:> 或 torch.gt(); -
大于或等于:>= 或 torch.ge();
>>> a = torch.rand(2,3)
>>> a
tensor([[0.8387, 0.1605, 0.5162],
[0.3364, 0.0641, 0.5297]])
>>> a > 0.5
tensor([[ True, False, True],
[False, False, True]])
>>> torch.gt(a,0.5)
tensor([[ True, False, True],
[False, False, True]])
>>> a != 0.5
tensor([[True, True, True],
[True, True, True]])
# 比较两个数组每个位置上的元素是否相等
>>> a = torch.ones(2,3)
>>> b = torch.rand(2,3)
>>> torch.eq(a,b)
tensor([[False, False, False],
[False, False, False]])
>>> torch.eq(a,a)
tensor([[True, True, True],
[True, True, True]])
# 比较两个数组是否相等
>>> torch.equal(a,a)
True
排序操作:
函数 |
描述 |
sort(input,dim) |
对指定维度进行排序 |
argsort(input,dim) |
返回指定维度排序结果的索引 |
max/min |
在给定dim上的最大值/最小值 |
argmax/argmin | 在给定dim上最大值/最小值的索引 |
topk(input,k) |
返回最大的k个元素及其索引 |
kthvalue(k, dim) | 第k个最小元素及其索引 |
-
sort() / argsort():
>>> 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([3, 3, 2])
# 最大值
>>> 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(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.6854, 0.3501, 0.0339]),
indices=tensor([3, 3, 0]))
# 维度0,最小的
>>> a.kthvalue(1,dim=0)
torch.return_types.kthvalue(
values=tensor([0.0339, 0.5625, 0.2676, 0.0145]),
indices=tensor([2, 1, 0, 2]))
更多内容可以前往官网查看:
https://pytorch.org/
本篇文章来源于微信公众号: 码农设计师