前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyTorch入门视频笔记-创建数值相同的张量

PyTorch入门视频笔记-创建数值相同的张量

作者头像
触摸壹缕阳光
发布2020-11-20 10:34:55
1.4K0
发布2020-11-20 10:34:55
举报

创建全 0 或全 1 的张量

创建元素值为全 0 或全 1 的张量是非常常见的初始化手段,通过 torch.zeros() 和 torch.ones() 函数即可创建任意形状,且元素值全为 0 或全为 1 的张量。

torch.zeros(*size,out=None,dtype=None,layout=torch.strided,device=None,requires_grad=False) 和 torch.ones(*size, out=None,dtype=None,layout=torch.strided,device=None,requires_grad=False) 两个函数的参数相同,这里简单介绍一下这些参数:

  • *size: 定义输出张量形状的整数序列,这个整数序列可以是列表和数组之类的集合也可以是整数的 torch.Size(执行 tensor.size() 获取 tensor 形状的结果为 torch.Size);
  • out = None(可选参数): 指定输出的张量。比如执行torch.zeros([2, 2], out = tensor_a),相当于执行tensor_a = torch.zeros([2, 2])
  • dtype = None(可选参数):指定返回张量的数据类型,默认(dtype = None)使用全局默认的数据类型,我们可以使用 torch.get_default_tensor_type() 获取全局默认的数据类型,同时可以通过 torch.set_default_tensor_type(torch.XXXTensor) 更改全局默认的数据类型为 torch.XXXTensor;
  • layout = torch.strided(可选参数): 定义张量在物理设备中的存储结构,torch.layout 可选的参数值有 torch.strided(默认)或 torch.sparse_coo,分别对应顺序存储和离散存储。「通常情况下,如果张量中的元素值 0 比较少为稠密张量,则指定 layout = torch.strided。如果张量中的元素值中 0 比较多为稀疏张量,则指定 layout = torch.sparse_coo」
  • device = None(可选参数): 指定张量所在的计算设备是 CPU 还是 GPU;
  • requires_grad=False(可选参数): 指定此张量是否需要记录梯度;

torch.zeros() 和 torch.ones() 两个函数中只有 *size 参数为必须指定的参数,其余参数都是可选参数,因此接下来只关注指定 *size 参数的 torch.zeros(*size) 和 torch.ones(*size)。

代码语言:javascript
复制
 In[1]: import torch
        # 创建全为0或1的0D张量(标量)
        scalar_zero = torch.zeros([])
        scalar_one = torch.ones([])
        print("张量的维度:{},张量的值:{}".
              format(scalar_zero.dim(), scalar_zero))
        print("张量的维度:{},张量的值:{}".
              format(scalar_one.dim(), scalar_one))
Out[1]: 张量的维度:0,张量的值:0.0
        张量的维度:0,张量的值:1.0
 In[2]: # 创建全为0或1的1D张量(向量)
        vec_zero = torch.zeros([3])
        vec_one = torch.ones([3])
        print("张量的维度:{},张量的值:{}".
              format(vec_zero.dim(), vec_zero))
        print("张量的维度:{},张量的值:{}".
              format(vec_one.dim(), vec_one))
Out[2]: 张量的维度:1,张量的值:tensor([0., 0., 0.])
        张量的维度:1,张量的值:tensor([1., 1., 1.])
 In[3]: # 创建全为0或1的2D张量(矩阵)
        mat_zero = torch.zeros([2, 2])
        mat_one = torch.ones([2, 2])
        print("张量的维度:{},张量的值:{}".
              format(mat_zero.dim(), mat_zero))
        print("张量的维度:{},张量的值:{}".
              format(mat_one.dim(), mat_one))
Out[3]: 张量的维度:2,张量的值:tensor([[0., 0.],
                [0., 0.]])
        张量的维度:2,张量的值:tensor([[1., 1.],
                [1., 1.]]) 

通过 torch.zeros(*size) 和 torch.ones(*size) 函数创建了元素值全为 0 和全为 1 的 0D 张量、1D 张量和 2D 张量,创建 nD 张量与之类似,这里不再赘述。*size 参数指定创建张量的形状,不同维度张量的形状可以参考下表。

比如:

  • 创建 0D 张量只需要指定 size = [];
  • 创建 1D 张量只需要指定 size = [dim0],其中 dim0 为第 0 个维度的元素个数;
  • 创建 2D 张量只需要指定 size = [dim0, dim1],其中 dim0 为第 0 个维度的元素个数,dim1 为第 1 个维度的元素个数;
  • 依次类推,创建 nD 张量只需要指定 size = [dim0, dim1, ..., dimn],其中 dim0 为第 0 个维度的元素个数,dim1 为第 1 个维度的元素个数,...,dimn 为第 n 个维度的元素个数;

通过 torch.zeros_like(input) 和 torch.ones_like(input) 函数可以方便地创建与 input 张量形状一致,且元素值全为 0 或者 1 的张量,需要注意此时的 input 必须是张量。

代码语言:javascript
复制
 In[4]: import torch
        scalar_a = torch.tensor(1.)
        vec_a = torch.tensor([1., 2., 3.])
        mat_a = torch.tensor([[1., 2.], [3., 4.]])
        print("张量的形状:{}".format(scalar_a.size()))
        print("张量的形状:{}".format(vec_a.size()))
        print("张量的形状:{}".format(mat_a.size()))
Out[4]: 张量的形状:torch.Size([])
        张量的形状:torch.Size([3])
        张量的形状:torch.Size([2, 2])
 In[5]: # 创建和张量scalar_a相同形状的全为0或1的张量
        scalar_zero = torch.zeros_like(scalar_a)
        scalar_one = torch.ones_like(scalar_a)
        print("张量的维度:{},张量的值:{}".
              format(scalar_zero.dim(), scalar_zero))
        print("张量的维度:{},张量的值:{}".
              format(scalar_one.dim(), scalar_one))
Out[5]: 张量的维度:0,张量的值:0.0
        张量的维度:0,张量的值:1.0 
 In[6]: # 创建和张量scalar_a相同形状的全为0或1的张量
        vec_zero = torch.zeros_like(vec_a)
        vec_one = torch.ones_like(vec_a)
        print("张量的维度:{},张量的值:{}".
              format(vec_zero.dim(), vec_zero))
        print("张量的维度:{},张量的值:{}".
              format(vec_one.dim(), vec_one))
Out[6]: 张量的维度:1,张量的值:tensor([0., 0., 0.])
        张量的维度:1,张量的值:tensor([1., 1., 1.])
 In[7]: # 创建和张量scalar_a相同形状的全为0或1的张量
        mat_zero = torch.zeros_like(mat_a)
        mat_one = torch.ones_like(mat_a)
        print("张量的维度:{},张量的值:{}".
              format(mat_zero.dim(), mat_zero))
        print("张量的维度:{},张量的值:{}".
              format(mat_one.dim(), mat_one))
Out[7]: 张量的维度:2,张量的值:tensor([[0., 0.],
                [0., 0.]])
        张量的维度:2,张量的值:tensor([[1., 1.],
                [1., 1.]])

创建自定义数值张量

除了将张量的元素值初始化全为 0 或全为 1 的张量依然,有时候也需要全部初始化为某个自定义数值的张量。通过 torch.full(*size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) 可以创建全为自定义数值 fill_value 的张量,形状由 size 参数指定。

torch.full() 函数中除了 size 和 fill_value 参数外,其余都是可选参数且和 torch.zeros() 和 torch.ones() 两个函数的参数一致,同样不再赘述。

  • size: 定义输出张量形状的整数序列,这个整数序列可以是列表和数组之类的集合也可以是整数的 torch.Size(执行 tensor.size() 获取 tensor 形状的结果为 torch.Size);
  • fill_value: 填充到张量中的元素值,必须为标量值;
代码语言:javascript
复制
 In[8]: import torch
        # 创建0D且元素值为5的张量
        scalar_a = torch.full([], 5)
        # 创建1D且元素值为5的张量
        vec_a = torch.full([3], 5)
        # 创建2D且元素值为5的张量
        mat_a = torch.full([2, 2], 5)
        print("张量的维度:{},张量的值:{}".
              format(scalar_a.dim(), scalar_a))
        print("张量的维度:{},张量的值:{}".
              format(vec_a.dim(), vec_a))
        print("张量的维度:{},张量的值:{}".
              format(mat_a.dim(), mat_a))
Out[8]: 张量的维度:0,张量的值:5.0
        张量的维度:1,张量的值:tensor([5., 5., 5.])
        张量的维度:2,张量的值:tensor([[5., 5.],
                [5., 5.]]) 

「通过 torch.full_like(input, fill_value) 函数来创建全为自定义数值 fill_value 的张量,形状由参数 input 的形状指定,input 必须是张量。」

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建全 0 或全 1 的张量
  • 创建自定义数值张量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档