0


pytorch里tensor用法总结

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

1.Tensor是什么

Tensor是Pytorch里最基本的操作对象。

Tensor意为张量,其实就是一个多维的矩阵,我们也可以把一般的矩阵理解为什么要一个二维的张量。

下面是Pytorch里对Tensor一些基本操作的总结。

2.创建一个张量

2.1 从pytorch方法里创建

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

2.2 从数据中创建

2.2.1 从列表中创建
x = torch.tensor([[1,2,3],[4,5,6]])
print(x)
#tensor([[1, 2, 3],
#        [4, 5, 6]])
print(x.shape)
#torch.Size([2,3])    
#也可以使用x.size(),x.shape是体现x一个属性,x.size()是返回包含各维度大小的元组
2.2.2 从numpy数组中创建
import numpy as np

#两个np实例

x = torch.from_numpy(np.array([[1,2],[3,4]]))
print(x)
#tensor([[1, 2],
#        [3, 4]], dtype=torch.int32)
print(x.shape)
#torch.Size([2, 2])

x = torch.from_numpy(np.ones(3))
print(x)
#tensor([1., 1., 1.], dtype=torch.float64)
print(x.size())
#torch.Size([3])
2.2.3 创建一个和已有的输入张量形状一样但取值随机的张量
x = torch.from_numpy(np.ones(3))
x = torch.randn_like(x)
print(x)
     也可以将其转化为数组
x = x.numpy()
print(x)
2.2.4 获取只包含一个元素的张量的值
x = torch.tensor([2])
print(x)
print(x.item())

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

3.1 张量加法

x = torch.rand(3,2)
y = torch.rand(3,2)
print(x,y)

#方法1
print(x+y)

#方法2
print(torch.add(x,y))

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

3.2 给张量限定范围

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

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

3.3 改变张量的形状

3.3.1 阅读张量形状的方法
 从外面往里看,如 tensor([[1, 0], [0, 1], [0, 0]])这个张量,最外面的中括号表示这个张量,从外向内看的第二层同级有3个,说明第一维度大小是3,再取这个维度任意一个部分向里看,一样的方法,[1,0]里面有两个元素,所以第二维度大小是2,所以这个张量的形状是(3,2)
3.3.2 view方法
先把张量转为一维(相当于去掉限定维度的括号),然后按照新维度分配
x = torch.tensor([[1,2,3],[4,5,6]])
y = x.view(3,2)
print(y)
#tensor([[1, 2],
#        [3, 4],
#        [5, 6]])

z = x.view(-1,6)    #-1表示自动计算该维度大小,此处是6/6=1
print(z)
#tensor([[1, 2, 3, 4, 5, 6]])
3.3.3 unsqueeze方法
在指定维度添加一个维度为1的维度(注意维度的索引是从0开始的,如第第二维度的索引是1)
x = torch.tensor([[1,2,3],[4,5,6]])
y = x.unsqueeze(1)    #这里的1指的是第二维度,从0开始计数
print(y.shape)
#torch.Size([2, 1, 3])
3.3.4 squeeze方法
   移除张量中所有维度为1的维度
x = torch.tensor([[[1,2,3],[4,5,6]]])    #形状为(1,2,3)
y = x.squeeze()
print(y.shape)
#torch.Size([2, 3])
3.3.5 补充一点我对维度大小为1的理解
   在增加或者减少维度为1的维度时,并没有影响整个张量中元素的数量和取值, 所以信息没有受到影响,并且可以使其维度在不同任务上得到匹配  
3.3.6 permute方法
   调整张量的维度顺序
x = torch.tensor([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])    #形状为(2,2,3)
y = x.permute(2,0,1)    #这里的012指的是原来对于维度的大小,如2指的是原来的对应维度大小为3
print(y.shape)
#torch.Size([3, 2, 2])
print(y)
#tensor([[[ 1,  4],
#         [ 7, 10]],
#
#        [[ 2,  5],
#         [ 8, 11]],
#
#        [[ 3,  6],
#         [ 9, 12]]])

z = x.permute(2,1,0)
print(z)
#tensor([[[ 1,  7],
#         [ 4, 10]],
#
#        [[ 2,  8],
#         [ 5, 11]],
#
#        [[ 3,  9],
#         [ 6, 12]]])

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

   对于上面两个不同的调整,可看出新张量和旧张量的维度和元素排列顺序的对应关系不变。 在原张量x中1和4是在第二维度(维度索引为1)上变化索引得到,所以在新的张量y中1和4仍然是通过该维度上变化索引得到。
3.3.7 张量合并
x = torch.tensor([[1,2,3],[4,5,6]])    #形状是(2,3)
y = torch.tensor([[7,8,9],[10,11,12]])    #形状是(2,3)

z = torch.cat((x,y),dim=0)    #dim的值表示从第几维开始合并
print(z)
#tensor([[ 1,  2,  3],
#        [ 4,  5,  6],
#        [ 7,  8,  9],
#        [10, 11, 12]])
#从第0维开始合并,所以大小为(2+2=4,3)
#由此很容易得知,除了dim对应的维度之外的维度大小都应该相等

当其他维度大小不一样时

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

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

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

还没有评论