Pytorch深度学习实战3-2:什么是张量?Tensor的创建与索引

Posted Mr.Winter`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pytorch深度学习实战3-2:什么是张量?Tensor的创建与索引相关的知识,希望对你有一定的参考价值。

目录

1 什么是张量?

张量(Tensor)是多维数组结构,在人工智能领域应用广泛,例如输入彩色图片即是3维张量——RGB三维且每维都是二维平面像素矩阵。

下面这张表直观地总结了张量的形式,这张表可以解决大部分的张量理解问题

维数图例名称
0标量
1向量
2矩阵
3三阶张量
N N N N N N阶张量

2 Pytorch数据类型与转化

数据类型CPU TensorGPU Tensor
32位浮点torch.FloatTensortorch.cuda.FloatTensor
64位浮点torch.DoubleTensortorch.cuda.DoubleTensor
16位半精度浮点N/Atorch.cuda.HalfTensor
8位无符号整型torch.ByteTensortorch.cuda.ByteTensor
8位有符号整型torch.CharTensortorch.cuda.CharTensor
16位有符号整型torch.ShortTensortorch.cuda.ShortTensor
32位有符号整型torch.IntTensortorch.cuda.IntTensor
64位有符号整型torch.LongTensortorch.cuda.LongTensor

Pytorch中Tensor数据类型的转换可以使用

  • 显式的type(new_type)
  • 隐式的type_as(var)

举例如下:

a = torch.Tensor(2, 2)
b = a.type(torch.DoubleTensor)
c = a.type_as(b)

>> a: tensor([[0.0000e+00, 0.0000e+00],
              [8.4078e-45, 0.0000e+00]])
>> b: tensor([[0.0000e+00, 0.0000e+00],
              [8.4078e-45, 0.0000e+00]], dtype=torch.float64)
>> c: tensor([[0.0000e+00, 0.0000e+00],
              [8.4078e-45, 0.0000e+00]], dtype=torch.float64)

3 张量Tensor的创建

张量Tensor主要的创建方法如下所示。

3.1 类型创建

创建方法

  • torch.Tensor()
  • torch.DoubleTensor()

实例

b = torch.cuda.DoubleTensor(2,2)

>> b: tensor([[0., 0.],
         [0., 0.]], device='cuda:0', dtype=torch.float64)

3.2 序列转换

创建方法

  • torch.Tensor(list)
  • torch.Tensor(narray)

实例

a = torch.DoubleTensor([[1, 2],[3, 4]])

>> a: tensor([[1., 2.],
        [3., 4.]], dtype=torch.float64)

3.3 0/1张量

创建方法

  • torch.zeros()
  • torch.ones()

实例

a = torch.ones(2,2)
>> a: tensor([[1., 1.],
        [1., 1.]])

3.4 对角张量

创建方法

  • torch.eye()

实例

a = torch.eye(2,2)
>> a: tensor([[1., 0.],
        [0., 1.]])

3.5 正态张量

创建方法

  • torch.randn()

实例

a = torch.randn(2,2)
>> a: tensor([[-0.0451, -0.1602],
            [-0.1116,  0.8266]])

3.6 随机向量

创建方法

  • torch.randperm(n):将0~n-1的整数随机排列成向量

实例

a = torch.randperm(3)
>> a: tensor([2, 0, 1])

3.7 线性张量

创建方法

  • torch.arrange(s,e,step):生成从se间隔step的向量
  • torch.linspace(s,e,num):生成从senum的均匀向量

实例

a = torch.arange(1,8,3)
>> tensor([1, 4, 7])

b = torch.linspace(1,8,3)
>> tensor([1.0000, 4.5000, 8.0000])

4 张量Tensor的索引

对于一个给定Tensor,可通过Tensor的shape属性或size()方法查看其维度,通过numel()方法查看元素总数

a = torch.eye(3,3)
print("shape维度", a.shape)
print("size维度", a.size())
print("numel元素个数", a.numel())

>> shape维度 torch.Size([3, 3])
>> size维度 torch.Size([3, 3])
>> numel元素个数 9

Tensor维度按从左到右顺序分配dim索引号如下,新增维度的dim索引号总为0

具体的索引方式如下,设a=torch.Tensor([[0,1],[2,3]]))

4.1 下标索引

索引方法

  • tensor[num]

实例

a[1]
>> tensor([2., 3.])

a[0,1]
>> tensor(1.)

4.2 条件索引

索引方法

  • tensor>0:符合条件为True
  • tensor[tensor>0]:取出符合条件的元素
  • torch.nonzero(tensor):取出非零元素坐标

实例

a>0
>> tensor([[False,  True],
        [ True,  True]])

a[a>0]
>> tensor([1., 2., 3.])

torch.nonzero(a)
>> tensor([[0, 1],
        [1, 0],
        [1, 1]])

4.3 附加控制索引

索引方法

  • torch.where(condition,x,y):两个同型张量x、y,符合条件输出x相应位置元素,否则输出y
  • tensor.clamp(min,max):限制元素极值

实例

torch.where(a > 1, torch.full_like(a, 1), a)
>> tensor([[0., 1.],
        [1., 1.]])

a.clamp(1,2)
>> tensor([[1., 1.],
        [2., 2.]])

🔥 更多精彩专栏


👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

深度学习-PyTorch框架实战系列

深度学习-PyTorch框架实战系列

PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。

2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络

深度学习框架-PyTorch实战课程旨在帮助同学们快速掌握PyTorch框架核心模块使用方法与项目应用实例,让同学们熟练使用PyTorch框架进行项目开发。

课程内容全部以实战为导向,基于当下计算机视觉与自然语言处理中经典项目进行实例讲解,通过Debug模式详解项目中每一行代码的作用与效果,整体风格通俗易懂,提供全部课程所属课件。

以上是关于Pytorch深度学习实战3-2:什么是张量?Tensor的创建与索引的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch深度学习实战3-3:张量Tensor的分块变形排序极值与in-place操作

深度学习-PyTorch框架实战系列

Pytorch入门教程

Pytorch深度学习基础之Tensor

(翻译)60分钟入门深度学习工具-PyTorch

PyTorch从入门到精通100讲-PyTorch张量从概念到应用