当前位置:   article > 正文

Pytorch基础:张量Tensor_计算机tensor

计算机tensor

1. 张量类(Tensor)

张量类(Tensor)是深度学习框架必须提供的基础数据结构,神经网络的前向传播和反向传播都是基于 Tensor 类进行的。Tensor 类应具有以下多方面的功能:

  1. Tensor 应该具有不同的数值类型,以满足不同的精度需求。
  2. Tensor 的维度应该可以索引、改变。
  3. 不同类型的 Tensor 之间应可以相互转换。
  4. Tensor 应该支持常见的数值计算,比如加、减、乘、除。
  5. Tensor 的设备应该可以在 CPU 和 GPU 之间切换。

2. 数值类型

数据类型CPUGPU
32位浮点数torch.FloatTensortorch.cuda.FloatTensor
64位浮点数torch.DoubleTensortorch.cuda.DoubleTensor
8位有符号整型torch.CharTensortorch.cuda.CharTensor
8位无符号整型torch.ByteTensortorch.cuda.ByteTensor
布尔类型torch.BoolTensortorch.cuda.BoolTensor

3. 创建方法

3.1 从内置数据类型创建

>>> import torch
>>>
>>> x1=[1,2,3]
>>> x1_tensor=torch.tensor(x1,dtype=torch.int32)
>>> print(x1_tensor)
tensor([1, 2, 3], dtype=torch.int32)
>>>
>>> x1_tensor2=torch.tensor([4,5,6],dtype=torch.int32)
>>> print(x1_tensor2)
tensor([4, 5, 6], dtype=torch.int32)
>>>
>>>
>>> x2 = torch.Tensor([7,8,9])
>>> print(x2,x2.dtype)
tensor([7., 8., 9.]) torch.float32   //默认为torch.float32类型
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3.2 从numpy创建

>>> import numpy as np
>>> x2_numpy=np.array([1,2,3])
>>> x2.tensor=torch.from_numpy(x2_numpy)
>>> x2_tensor=torch.from_numpy(x2_numpy)
>>> print(x2_tensor)
tensor([1, 2, 3], dtype=torch.int32)
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.3 从已有Tensor创建新的Tensor

接着上面的,直接复制Tensor,但是新的Tensor与旧Tensor只是形状相同,数值却是使用特定的数值进行填充的。

>>> x3_tensor=torch.ones_like(x2_tensor)
>>> print(x3_tensor)
tensor([1, 1, 1], dtype=torch.int32)
  • 1
  • 2
  • 3

3.4 创建随机值或特定值的Tensor

>>> size=[1,3]
>>> x4_tensor=torch.randn(size)
>>> x5_tensor=torch.zeros(size)
>>> print(x4_tensor)
tensor([[-0.0643,  0.8212,  0.1565]])
>>> print(x5_tensor)
tensor([[0., 0., 0.]])
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. 类型转换

>>> x=torch.tensor([1,2,3],dtype=torch.int32)
>>> print(x.dtype)
torch.int32
>>> x=x.half()
>>> print(x.dtype)
torch.float16
>>> x=x.float()
>>> print(x.dtype)
torch.float32
>>> x=x.double()
>>> print(x.dtype)
torch.float64
>>>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5. 维度分析

>>> x= torch.randn(1,3,4,4)
>>> print("ndimension:",x.ndimension()) //张量的维度
ndimension: 4

>>> print("nelement:",x.nelement()) //张量包含的元素总数 
nelement: 48

>>> print("size",x.size()) //张量的尺寸信息
size torch.Size([1, 3, 4, 4])

>>> print("shape:",x.shape)  //
shape: torch.Size([1, 3, 4, 4])
>>>

>>> x_view=x.view(1,3,4*4)
>>> print("x_view:",x_view.size())
x_view: torch.Size([1, 3, 16])
>>>
>>> x_view=x.view(1,-1)
>>> print("x_view:",x_view.size()) //view的一个参数是-1,pytorch会根据其他维度自动计算这一维度的大小
x_view: torch.Size([1, 48])
>>>

//====transpose方法,将2行3列的张量变换成3行2列的张量
>>> x= torch.randn(2,3)
>>> print(x)
tensor([[-0.7116,  1.0912, -1.3217],
        [ 0.1371, -0.6021, -0.9689]])
>>> x_trans=x.transpose(1,0)
>>> print(x_trans)
tensor([[-0.7116,  0.1371],
        [ 1.0912, -0.6021],
        [-1.3217, -0.9689]])
>>>

//=======squeeze删除1维度,此时张量的数据内容不变
>>> x=torch.randn(1,3,16,16)
>>> x=x.squeeze(0)
>>> print(x.size())
torch.Size([3, 16, 16])
//=======squeeze增加1维度,此时张量的数据内容不变
>>> x=x.unsqueeze(0)
>>> print(x.size())
torch.Size([1, 3, 16, 16])
>>>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

6. 常用操作

6.1 获取Tensor存储地址

>>> x= torch.tensor([1,2])
>>> y=torch.tensor([1,2])
>>> z=y.clone() //地址不同
>>> q=y.detach() //地址相同

//=====通过clone 方法获得的张量与原始张量的内存地址是不同的,通过detach方法获得的张量与原始张量的内存地址是相同的。
>>> print(x.data_ptr())
5447746589376
>>> print(y.data_ptr())
5447746589312
>>> print(z.data_ptr())
5447746589632
>>> print(q.data_ptr())
5447746589312
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

6.2 切片索引

>>> x=torch.tensor([1,2,3,4,5])
>>> print(x[1:3]) //获取1~3数值
tensor([2, 3])
>>> print(x[:]) //获取全部数值
tensor([1, 2, 3, 4, 5])
>>> print(x[-1]) //获取最后一个数值
tensor(5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6.3 拼接不同的Tensor

  • torch.cat 函数提供了拼接不同 Tensor 的功能,它需要指定两个参数,第一个参数 tensors 表示需要拼接的所有 Tensor 对象,第二参数 dim 表示在哪个维度上进行拼接。
  • 在拼接不同的 Tensor 时,需要保证各 Tensor 除堆叠维度外其他维度是一致的,否则无法完成拼接。
>>> x1=torch.tensor([1,2])
>>> x2=torch.tensor([3,4])
>>> x3=torch.tensor([5,6])
>>>
>>> x_cat=torch.cat(tensors=(x1,x2,x3),dim=0)
>>> print(x_cat)
tensor([1, 2, 3, 4, 5, 6])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6.4 四则运算

6.4.1 torch.add 和 torch.sub

>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(torch.add(x1,x2))
tensor([[2, 4],
        [6, 8]])
>>> print(torch.sub(x1,x2))
tensor([[0, 0],
        [0, 0]])
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

6.4.2 inplace 原地加减法

>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(x1.add_(x2))
tensor([[2, 4],
        [6, 8]])
>>> print(x1.sub_(x2))
tensor([[0, 0],
        [0, 0]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

6.4.3 x1 + x2(将调用重载的加法运算符)

>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(x1+x2+x1+x2)
tensor([[ 4,  8],
        [12, 16]])
  • 1
  • 2
  • 3
  • 4
  • 5

6.5 逐元素乘法和矩阵乘法

>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(torch.mul(x1,x2))
tensor([[ 1,  4],
        [ 9, 16]])
>>> print(torch.mm(x1,x2))
tensor([[ 7, 10],
        [15, 22]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/680457
推荐阅读
相关标签
  

闽ICP备14008679号