Pytorch min函数详解

整了半天,不确定定义在哪个文件,看起来比较像这个。

C:\Users\Administrator\.PyCharm2018.2\system\python_stubs\1756426084\torch\_C\_TensorBase.py

    def min(self, dim=None, keepdim=False): # real signature unknown; restored from __doc__
        """
        min(dim=None, keepdim=False) -> Tensor or (Tensor, Tensor)
        
        See :func:`torch.min`
        """
        pass

 

 

①基本性质1,相同形状比较

min用于比较 Tensor和Tensor,逐元素地比较,然后返回相应位置的最小值。

box1= torch.tensor( 
    [ [2,4,1,2],[5,6,2,3]
    ]).float()
box2= torch.tensor( 
    [ [1,1,3,3],[1,1,3,3]
    ]).float()

print(box1.min(box2))

#output:
tensor([[1., 1., 1., 2.],
        [1., 1., 2., 3.]])

 

②基本性质2:不同形状比较

不同形状Tensor进行比较的基本要求是,后面的维度相容。

举例,我们构造一个(2,3,3)的tensor_example。

tensor_example = torch.tensor(
[
  [
      [1,-10, 1],
      [2, 2, 2],
      [3, 3, 3]
  ],
  [
      [4, 4, 4],
      [5,50, 5],
      [6, 6, 6]
  ]
]
)

#显然tensor_example的shape=(2,3,3)

 

所谓的后面的维度相容,在本例中可以有3种方式。

#type1,shape=(3)

#type2,shape=(3,3)

#type3,shape=(2,3,3)

 

#type1,shape=(3)

由于和(2,3,3)最后一维相容,所以可以遍历前面2维,在最后一维上逐元素地比较。

#type1 ,shape=(3)
c=torch.tensor([1,2,3])
z= tensor_example.min(c)
print(z)

#output:
tensor([[[  1, -10,   1],
         [  1,   2,   2],
         [  1,   2,   3]],

        [[  1,   2,   3],
         [  1,   2,   3],
         [  1,   2,   3]]])

#type2,shape=(3,3)

由于和(2,3,3)最后2维相容,所以可以遍历第0维,在后面2维上逐元素地比较。

#type2,shape=(3,3)
d=torch.ones(3,3)
z= tensor_example.min(d)
print(z)

#output:
tensor([[[  1, -10,   1],
         [  1,   1,   1],
         [  1,   1,   1]],

        [[  1,   1,   1],
         [  1,   1,   1],
         [  1,   1,   1]]])

 

#type3,shape=(2,3,3)

这就是特殊情况的shape完全相同了,可以直接逐元素比较。

 

 

③基本性质3:含1的不同形状比较

 与②不同的是,本例选择的向量,总有某一维为1。

那么,可以不遵守②的法则,也能进行比较。

 

举例:

t1= torch.tensor([[2.7500, 6.0000, 9.5000]])  # shape=(1,3)
t2 = torch.tensor([[2.5000],
                   [6.0000]])                #shape=(2,1)


x=t1.min(t2)
y=t2.min(t1)
print(x)
print(y)


#output:
tensor([[2.5000, 2.5000, 2.5000],
        [2.7500, 6.0000, 6.0000]])
tensor([[2.5000, 2.5000, 2.5000],
        [2.7500, 6.0000, 6.0000]])

显然 ,min函数具有交换律。交换律对上面①②两种情况也是成立的。

 

本例中,t1和t2分别为(1,3)和(2,1)的二维张量,形状不同,也显然不满足②中条件。

但是却能进行比较。

原理是,处理某一维为1的张量,可以对其进行扩展。

你可以理解为,先把t1扩展成 ( 2,3)的矩阵,再对 (2,1)的t2,在每列上进行逐元素比较。

由于具备交换律,所以,也可以说是先扩展t2再对t1进行比较。

反正结果是等价的。

 

我举的是两个都带1的特殊例子。

既然这个例子都成立,那么我们讨论更一般的情况。

如果只有一方带1,另一方不带,在什么情况下可以比较。

 

【例如 (3,3)和(3,1),显然可以比较。】

【但是 (3,3)和(2,1),不能进行比较。】

因为(2,1),把1那维扩展成3之后变成(2,3),还是与(3,3)不相容

 

由此可以得出结论:

如果只有一方带1,另一方不带,则需要带1的Tensor将1扩展后,与不带1的Tensor的后面的维相容、

即,这种情况,先扩展,然后视为情况②,进行②的条件判定。

 

 

max函数同理,就不用说了吧。

 

 

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值