import torch
1.torch.stack(): 对tensors沿指定维度拼接,但返回的Tensor会多一维
a=torch.rand(2,3)
b=torch.randn(2,3)
d=torch.stack((a,b), dim=0)
print(d)
print(d.size())
tensor([[[ 0.6726, 0.1213, 0.2705],
[ 0.6798, 0.1086, 0.5244]],
[[-0.5596, 0.2247, -0.7475],
[-0.4650, -0.5764, 1.7613]]])
torch.Size([2, 2, 3])
2.torch.sum(),torch.mean(),torch.max() :求和,平均,最值操作
a=torch.tensor([[1.0,2.0,3.0],[4.0,5.0,6.0]])
print(a)
print(torch.sum(a,dim=0))
c=torch.mean(a,0)#只能对浮点数
print(c)
max_value,maxindex=torch.max(a,1)#返回每一行的最大值及其在该行的索引
print(max_value)
print(maxindex)
tensor([[1., 2., 3.],
[4., 5., 6.]])
tensor([5., 7., 9.])
tensor([2.5000, 3.5000, 4.5000])
tensor([3., 6.])
tensor([2, 2])
3.squeeze,unsqueeze:降维与升维
a=torch.tensor([[1,2,3],[4,5,6]])
print(a)
print(a.size())
a=a.unsqueeze(1)
print(a)
print(a.size())
print("***********")
b=torch.tensor([[1,2,3]])
print(b)
print(b.size())
b=b.unsqueeze(1)
print(b)
print(b.size())
tensor([[1, 2, 3],
[4, 5, 6]])
torch.Size([2, 3])
tensor([[[1, 2, 3]],
[[4, 5, 6]]])
torch.Size([2, 1, 3])
***********
tensor([[1, 2, 3]])
torch.Size([1, 3])
tensor([[[1, 2, 3]]])
torch.Size([1, 1, 3])
4.torch.permute()
但没有 torch.permute() 这个调用方式, 只能 Tensor.permute()。 我们可以把这个permute的过程这样理解;把tensor中的各维度上的值和编号对应,那么 对于tensor(0,1,2,3),permute(d0,d1,d2,d2)分别把 0和d0、1和d1、2和d2、3和d3的维度值交换,并且 d0,d1,d2,d3就是0,1,2,3的一个排列; 注:这里的维度值表示的是在该维度上有多少个数据;eg.对于二维的tensor(3,4)表示3行4列; 0表示行,1表示列。
a = torch.rand(2, 3, 4)
print(a.shape)
a = a.permute(2, 1, 0)
print(a.shape)
torch.Size([2, 3, 4])
torch.Size([4, 3, 2])
5.tensor的数值
在获取tensor的数值的时候,当只有一个元素时候使用 tensor.item(),否则使用tensor.tolist();
在使用这两个方法的时候不需要考虑当前数据是再GPU还是CPU,的问题,而使用numpy()就需要了
a = torch.randn(1)
print(a.item())
b=torch.randn(2,3)
print(b.tolist())
1.733506202697754
[[1.4020272493362427, -0.41212621331214905, 1.1351789236068726], [0.18131841719150543, 1.118831992149353, -0.9648651480674744]]
6.常用的tensor计算torch.gt(),torch.lt(),torch.eq(),torch.ne()
a=torch.randn(2,3)
print(a)
print(a.gt(0))
print(a.lt(0))
print(a.eq(0))
print(a.ne(0))
tensor([[-1.5922, -2.1408, -1.4729],
[-0.8615, 0.3474, -0.4214]])
tensor([[False, False, False],
[False, True, False]])
tensor([[ True, True, True],
[ True, False, True]])
tensor([[False, False, False],
[False, False, False]])
tensor([[True, True, True],
[True, True, True]])
7.torch.masked_select(),torch.masked_fill()
x = torch.randn(2, 4)
print(x)
mask = x.ge(0.5)#大于等于
print(mask)
print(torch.masked_select(x, mask))
print(x.masked_fill(mask,0.0))
tensor([[ 1.5942, -0.3780, -1.8494, -0.3787],
[ 0.9498, 0.1370, -0.2406, 1.3839]])
tensor([[ True, False, False, False],
[ True, False, False, True]])
tensor([1.5942, 0.9498, 1.3839])
tensor([[ 0.0000, -0.3780, -1.8494, -0.3787],
[ 0.0000, 0.1370, -0.2406, 0.0000]])
8.cuda和device 指定tensor 用什么计算
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
a = torch.rand([2,3]).to(device)
print(a)
tensor([[0.0740, 0.3338, 0.8749],
[0.5854, 0.3424, 0.3774]], device='cuda:0')
9.requires_grad
这里想说的是关于模型的中参数的梯度问题,在网络结构中,经常会让一部分参数不更新,一部分更新,具体做法如下:
需要注意的是我们定义的tensor默认的required_grad=False;但是模型中的参数默认required_grad=True
10.torch.mm,torch.bmm,torch.matmul
从下面的例子可以看出来就是简单的矩阵相乘。
l=[[1,2,3],[3,3,3]]
l1=[[2,2],[2,2],[1,1]]
a=torch.tensor(l1)
b=torch.tensor(l)
print(a)
print(a.size())
print(b)
print(b.size())
c=torch.mm(a,b)
print(c)
print(c.size())
tensor([[2, 2],
[2, 2],
[1, 1]])
torch.Size([3, 2])
tensor([[1, 2, 3],
[3, 3, 3]])
torch.Size([2, 3])
tensor([[ 8, 10, 12],
[ 8, 10, 12],
[ 4, 5, 6]])
torch.Size([3, 3])
和mm类似只是变成了多个矩阵相乘,也就是batch-mm
a = torch.tensor([[[2., 3.], [1., 2.]], [[3., 4.], [0., 5.]]])
b = torch.tensor([[[3.], [1.]], [[2.], [4.]]])
print(a)
print(b)
out = torch.bmm(a, b)
print(out)
tensor([[[2., 3.],
[1., 2.]],
[[3., 4.],
[0., 5.]]])
tensor([[[3.],
[1.]],
[[2.],
[4.]]])
tensor([[[ 9.],
[ 5.]],
[[22.],
[20.]]])
l=[[1,9],[2,2]]
l1=[1,3]
a=torch.tensor(l1)
b=torch.tensor(l)
print(a)
print(b)
c=torch.matmul(a,b)
print(c)
tensor([1, 3])
tensor([[1, 9],
[2, 2]])
tensor([ 7, 15])