整了半天,不确定定义在哪个文件,看起来比较像这个。
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函数同理,就不用说了吧。