norm范数
torch.norm是对输入的Tensor求范数,指定在哪个维度,就会消掉对应维度
0范数:向量中非零元素的个数
1范数:绝对值之和
2范数:相当于求摸,绝对值之和再开方
无穷范数:取向量的最大值
import torch
a = torch.ones((2, 4)) # 建立tensor
a1 =a.norm(1) # 指定求1范数
a2 =a.norm() # 默认求2范数
#不指定维度的话,会默认打平为一维
print(a)
print(a1)
print(a2)
b = a.view(2,2,2)
print(a.norm(1,dim=1)) #指定在第一维上求1范数
print(a.norm(2,dim=1))
print(b)
print(b.norm(1,dim=0)) #指定在0维上求范数
print(b.norm(2,dim=0))
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
tensor(8.) #和
tensor(2.8284)
tensor([4., 4.])
tensor([2., 2.]) #开方
tensor([[[1., 1.], # b
[1., 1.]],
[[1., 1.],
[1., 1.]]])
tensor([[2., 2.],
[2., 2.]])
tensor([[1.4142, 1.4142], #开方
[1.4142, 1.4142]])
mean、prod、sum
mean 是对 tensor求平均值、
prod 是对 tensor求连乘
sum对 tensor求和
若不指明维度,会将tensor打平运算
a = torch.arange(8).view(2,4).float()
print(a)
print(a.mean()),print(a.prod())
print(a.sum())
print(a.mean(dim=1)),print(a.prod(dim=1))
print(a.sum(dim=1))
tensor([[0., 1., 2., 3.],
[4., 5., 6., 7.]])
tensor(3.5000)
tensor(0.)
tensor(28.)
tensor([1.5000, 5.5000]) #维度1
tensor([ 0., 840.])
tensor([ 6., 22.])
max、min、argmin、argmax
max,min 会返回最大小值和其索引,argmax和argmin只返回索引
不指明dim打平,
若加上keepdim会保留维度
a = torch.arange(8).view(2,4).float()
print(a)
print(a.max()),print(a.min())
print(a.max(dim=1)),print(a.min(dim=1,keepdim=True)) #对最小值保留维度
print(a.argmax()),print(a.argmin())
print(a.argmax(dim=1)),print(a.argmin(dim=1,keepdim=True)) #保留最小值索引维度
tensor([[0., 1., 2., 3.],
[4., 5., 6., 7.]])
tensor(7.) #最大值
tensor(0.) #最小值
torch.return_types.max(
values=tensor([3., 7.]),
indices=tensor([3, 3])) #最大值索引
torch.return_types.min(
values=tensor([[0.],
[4.]]),
indices=tensor([[0], #最小值索引,维度不变
[0]]))
tensor(7)
tensor(0)
tensor([3, 3])
tensor([[0],
[0]])
topk、kthvalue
TOPK可以指定求前多少个最大最小值,默认求最大,largest = FALSE 求最小
dim = 1表示按行取最大最小
返回值和索引
kthvalue指定求第几小,dim指定在哪个维度,
a = torch.randn(4,10)
m = a.topk(3,dim=1) #求维度1上前3大的数
print(m)
n = a.topk(3,dim=1,largest=False) #前三小的
print(n)
o = a.kthvalue(8,dim=1) #第8小,第三大
print(o)
p = a.kthvalue(3,dim=1,keepdim=True) #第三小,第8大
print(p)
torch.return_types.topk(
values=tensor([[ 0.4976, 0.1273, -0.0051], #前三大
[ 2.5237, 1.6637, 1.0279],
[ 2.4486, 0.9668, 0.9551],
[ 1.9150, 1.2690, 1.1584]]),
indices=tensor([[2, 5, 6], #索引位置
[1, 4, 9],
[1, 0, 5],
[0, 1, 3]]))
torch.return_types.topk(
values=tensor([[-1.4507, -1.0305, -0.9570], #前三小
[-2.1197, -2.0233, -1.8962],
[-1.6928, -1.0323, -0.3984],
[-1.5127, -1.3640, -0.5574]]),
indices=tensor([[9, 0, 4],
[6, 8, 0],
[8, 3, 6],
[7, 4, 2]]))
torch.return_types.kthvalue(
values=tensor([-0.0051, 1.0279, 0.9551, 1.1584]), #第八小
indices=tensor([6, 9, 5, 3])) #索引
torch.return_types.kthvalue(
values=tensor([[-0.9570], #第三小
[-1.8962],
[-0.3984],
[-0.5574]]),
indices=tensor([[4], #保留维度
[0],
[6],
[2]]))
比较
将 tensor 用运算符>,<,>=,<=,!=,==,等与其他数比较大小,会返回对应位置的TRUE,或者FALSE
torch.eq( a,b)会比较这两个tensor,相等位置TRUE,否则FALSE
torch.equal(a,b)返回一个值,相等TRUE,否则FALSE
a = torch.randn(4,10)
print(a>0)
m = torch.ones(2,3)
n = torch.randn(2,3)
k = torch.eq(m,n)
k1 = torch.eq(m,m)
print(k)
print(k1)
l = torch.equal(m,m)
print(l)
tensor([[False, True, False, True, False, False, False, False, False, True],
[ True, True, True, True, True, True, True, True, False, False],
[False, True, False, True, True, True, False, True, False, True],
[ True, True, False, False, True, False, False, False, True, False]])
tensor([[False, False, False],
[False, False, False]])
tensor([[True, True, True],
[True, True, True]])
True