0


pytorch里tensor用法总结

通过这篇总结,希望可以帮助pytorch学习者更好掌握Tensor的基本用法。

1.Tensor是什么

  1. TensorPytorch里最基本的操作对象。
  2. Tensor意为张量,其实就是一个多维的矩阵,我们也可以把一般的矩阵理解为什么要一个二维的张量。
  3. 下面是Pytorch里对Tensor一些基本操作的总结。

2.创建一个张量

2.1 从pytorch方法里创建

2.1.1 张量形状为3*2(下同),在[0,1]上等概率取值
  1. x = torch.rand(3, 2)
  2. print(x)
2.1.2 在(-∞,+∞)上服从正态分布取值
  1. x = torch.randn(3, 2)
  2. print(x)
2.1.3 创建一个取值全为0的张量
  1. x = torch.zeros(3, 2)
  2. print(x)
  3. #tensor([[0., 0.],
  4. # [0., 0.],
  5. # [0., 0.]])
2.1.4 创建一个取值全为1的张量
  1. x = torch.ones(3, 2)
  2. print(x)
  3. #tensor([[1., 1.],
  4. # [1., 1.],
  5. # [1., 1.]])
2.1.5 创建一个对角全为1的矩阵(注意这里是矩阵,也可以讲是二维张量)
  1. x = torch.eye(3, 3)
  2. print(x)
  3. #tensor([[1., 0., 0.],
  4. # [0., 1., 0.],
  5. # [0., 0., 1.]])
  1. 也可以不为方阵
  1. x = torch.eye(3,2)
  2. print(x)
  3. #tensor([[1., 0.],
  4. # [0., 1.],
  5. # [0., 0.]])

2.2 从数据中创建

2.2.1 从列表中创建
  1. x = torch.tensor([[1,2,3],[4,5,6]])
  2. print(x)
  3. #tensor([[1, 2, 3],
  4. # [4, 5, 6]])
  5. print(x.shape)
  6. #torch.Size([2,3])
  7. #也可以使用x.size(),x.shape是体现x一个属性,x.size()是返回包含各维度大小的元组
2.2.2 从numpy数组中创建
  1. import numpy as np
  2. #两个np实例
  3. x = torch.from_numpy(np.array([[1,2],[3,4]]))
  4. print(x)
  5. #tensor([[1, 2],
  6. # [3, 4]], dtype=torch.int32)
  7. print(x.shape)
  8. #torch.Size([2, 2])
  9. x = torch.from_numpy(np.ones(3))
  10. print(x)
  11. #tensor([1., 1., 1.], dtype=torch.float64)
  12. print(x.size())
  13. #torch.Size([3])
2.2.3 创建一个和已有的输入张量形状一样但取值随机的张量
  1. x = torch.from_numpy(np.ones(3))
  2. x = torch.randn_like(x)
  3. print(x)
  1. 也可以将其转化为数组
  1. x = x.numpy()
  2. print(x)
2.2.4 获取只包含一个元素的张量的值
  1. x = torch.tensor([2])
  2. print(x)
  3. print(x.item())

3 张量的一些处理方法总结

3.1 张量加法

  1. x = torch.rand(3,2)
  2. y = torch.rand(3,2)
  3. print(x,y)
  4. #方法1
  5. print(x+y)
  6. #方法2
  7. print(torch.add(x,y))
  8. #方法3
  9. result = torch.zeros(3,2) #也可以用torch.empty
  10. torch.add(x,y,out=result)
  11. print(result)
  1. 如果张量形状不一样,代码将会报错
  1. x = torch.rand(3,2)
  2. y = torch.rand(2,2)
  3. print(x+y)

3.2 给张量限定范围

输入的张量中保留大于min且小于max的元素,小于等于min的取min,大于max的取max

  1. x = torch.rand(3, 2)
  2. x = torch.clamp(x, min=0.1,max=0.9)
  3. print(x)

3.3 改变张量的形状

3.3.1 阅读张量形状的方法
  1. 从外面往里看,如 tensor([[1, 0], [0, 1], [0, 0]])这个张量,最外面的中括号表示这个张量,从外向内看的第二层同级有3个,说明第一维度大小是3,再取这个维度任意一个部分向里看,一样的方法,[1,0]里面有两个元素,所以第二维度大小是2,所以这个张量的形状是(3,2)
3.3.2 view方法
  1. 先把张量转为一维(相当于去掉限定维度的括号),然后按照新维度分配
  1. x = torch.tensor([[1,2,3],[4,5,6]])
  2. y = x.view(3,2)
  3. print(y)
  4. #tensor([[1, 2],
  5. # [3, 4],
  6. # [5, 6]])
  7. z = x.view(-1,6) #-1表示自动计算该维度大小,此处是6/6=1
  8. print(z)
  9. #tensor([[1, 2, 3, 4, 5, 6]])
3.3.3 unsqueeze方法
  1. 在指定维度添加一个维度为1的维度(注意维度的索引是从0开始的,如第第二维度的索引是1
  1. x = torch.tensor([[1,2,3],[4,5,6]])
  2. y = x.unsqueeze(1) #这里的1指的是第二维度,从0开始计数
  3. print(y.shape)
  4. #torch.Size([2, 1, 3])
3.3.4 squeeze方法
  1. 移除张量中所有维度为1的维度
  1. x = torch.tensor([[[1,2,3],[4,5,6]]]) #形状为(1,2,3)
  2. y = x.squeeze()
  3. print(y.shape)
  4. #torch.Size([2, 3])
3.3.5 补充一点我对维度大小为1的理解
  1. 在增加或者减少维度为1的维度时,并没有影响整个张量中元素的数量和取值, 所以信息没有受到影响,并且可以使其维度在不同任务上得到匹配
3.3.6 permute方法
  1. 调整张量的维度顺序
  1. x = torch.tensor([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) #形状为(2,2,3)
  2. y = x.permute(2,0,1) #这里的012指的是原来对于维度的大小,如2指的是原来的对应维度大小为3
  3. print(y.shape)
  4. #torch.Size([3, 2, 2])
  5. print(y)
  6. #tensor([[[ 1, 4],
  7. # [ 7, 10]],
  8. #
  9. # [[ 2, 5],
  10. # [ 8, 11]],
  11. #
  12. # [[ 3, 6],
  13. # [ 9, 12]]])
  14. z = x.permute(2,1,0)
  15. print(z)
  16. #tensor([[[ 1, 7],
  17. # [ 4, 10]],
  18. #
  19. # [[ 2, 8],
  20. # [ 5, 11]],
  21. #
  22. # [[ 3, 9],
  23. # [ 6, 12]]])

补充我对peermute调整张量取值的理解:

  1. 对于上面两个不同的调整,可看出新张量和旧张量的维度和元素排列顺序的对应关系不变。 在原张量x14是在第二维度(维度索引为1)上变化索引得到,所以在新的张量y14仍然是通过该维度上变化索引得到。
3.3.7 张量合并
  1. x = torch.tensor([[1,2,3],[4,5,6]]) #形状是(2,3)
  2. y = torch.tensor([[7,8,9],[10,11,12]]) #形状是(2,3)
  3. z = torch.cat((x,y),dim=0) #dim的值表示从第几维开始合并
  4. print(z)
  5. #tensor([[ 1, 2, 3],
  6. # [ 4, 5, 6],
  7. # [ 7, 8, 9],
  8. # [10, 11, 12]])
  9. #从第0维开始合并,所以大小为(2+2=4,3)
  10. #由此很容易得知,除了dim对应的维度之外的维度大小都应该相等

当其他维度大小不一样时

  1. x = torch.rand(4,2)
  2. y = torch.rand(4,3)
  3. z = torch.cat((x,y),dim=0)
  4. print(z.shape)
  5. #报错

本文转载自: https://blog.csdn.net/sixth_sir/article/details/140806136
版权归原作者 sixth_sir 所有, 如有侵权,请联系我们删除。

“pytorch里tensor用法总结”的评论:

还没有评论