张量的创建

张量的创建

构造

首先需要导入pytorch和numpy库

import torch
import numpy as np

默认构造方法

我们可以看看张量的相关参数

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)

其中:

  • data: 数据,可以是list,numpy的ndarray
  • dtype: 数据类型,默认与data的类型一致
  • device: 所在设备,gpu/cpu
  • requires_grad: 是否需要梯度,因为神经网络结构经常会要求梯度
  • pin_memory: 是否存于锁页内存
使用numpy构造

通过np创建ndarray,然后转化为张量,数据类型默认与data一致

#from_numpy()
a = np.array([2, 3.3])
torch.from_numpy(a)
#tensor()
a = np.ones([2, 3])
torch.tensor(a)
使用List构造
torch.tensor([2, 3.2])
torch.FloatTensor([2, 3.2])
torch.tensor([[2, 3.2], [1, 1.1]])
如果搭建了GPU环境,可以将张量加载到GPU上
t = torch.tensor(a,device='cuda')

创建全0张量

zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

  • size:为张量的形状
  • out:输出的张量
  • dtype: 数据类型
  • layout:内存中的布局形式,有strided,sparse_coo等
  • device:所在设备,gpu/cpu
  • requires_grad:是否需要梯度

例如:

t1 = torch.tensor([1,2,3])#创建一个t1张量,赋一个初始值
t = torch.zeros((2,3),out=t1)#将创建的t张量输出到t1
#此时t和t1调用id()方法返回值相同,表明两者共用同一个内存块

通过torch.zeros_like()也可以创建全0张量:

torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False)

例如:

input = torch.empty(3, 5)
t = torch.zeros_like(input)#根据input的shape创建张量

创建全1张量

全1张量的创建和全0张量的创建方式基本一致,使用如下方式创建:

torch.ones()

torch.ones_like()

根据数值创建张量

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

torch.full_like(input, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中出现新参数:

  • fill_value: 填充的值

例如:

#创建一个2*2元素都是8的张量
t = torch.full((2,2),8)
#根据input的shape创建张量
input = torch.empty(3, 5)
t = torch.full_like(input,8)

创建等差的1维张量

arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

  • start:数列的起始值
  • end:数列的结束值,取不到,只能取到 end-1
  • step:公差(步长),默认为 1

例如:

t = torch.arange(1,9,2)#创建1-7公差为2的等差张量,end=9是取不到的

创建等间距(均分)的1维张量

linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

  • steps:创建出的一维张量的元素个数
  • end:结束位置可以取到

例如:

t = torch.linspace(1,9,7)
#得到结果为tensor([1.0000,2.3333,3.6667,5.0000,6.3333,7.6667,9.0000])

创建对数均分的1维张量

logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

  • base: 对数函数的底,默认为10

例如:

t = torch.logspace(start=-5, end=10,steps=4)
#得到结果为tensor([1.0000e-05, 1.0000e+00, 1.0000e+05, 1.0000e+10])

创建单位对角矩阵(2维张量)

torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

  • m:矩阵行数

  • n:矩阵列数

例如:

t = torch.eye(4)

创建正态分布(高斯分布)数据的张量

torch.normal(mean, std, out=None)

其中:

  • mean:均值

  • std:标准差

这种生成正态分布数据的张量创建有4种模式:

  1. mean为张量,std为张量
  2. mean为标量,std为标量
  3. mean为标量,std为张量
  4. mean为张量,std为标量

例如:

mean为张量,std为张量
mean = torch.arange(1,6,dtype=torch.float)
#mean=tensor([1., 2., 3., 4., 5.])
std = torch.arange(1,6,dtype=torch.float)
#std=tensor([1., 2., 3., 4., 5.])
t = torch.normal(mean,std)
#t=tensor([ 0.9000,  1.6033,  3.5314, -0.0566, 10.3133]),此时的mean和std都是张量,可以理解为其中的0.9000是mean为1,std为1的正态分布采样得到,其他对应位置数据同理得到,只是从不同的正态分布中采样得到。
mean为标量,std为标量
t = torch.normal(0.2,1.0,size=(5,))
#这里生成的数据都是通过mean为0.2,std为1.0采样得到的,长度为5的一维张量。
mean为标量,std为张量
mean = 2
std = torch.arange(1,4,dtype=torch.float)
t = torch.normal(mean,std)
#t=tensor([ 0.9550,  5.9733, -1.0537]),0.9550是mean为2,std为1的正态分布采样得到,其他对应位置数据同理得到,只是从不同的正态分布中(均值不同,标准差相同)采样得到。
mean为张量,std为标量

同上规律

创建标准正态分布数据的张量

torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

  • size:张量的形状

例如:

#例如创建一个长度为6的标准正态分布张量
torch.randn(6)
#创建一个二维的标准正态分布张量
torch.randn(3,4)
#根据张量的形状创建新的标准正态分布张量
a = torch.ones((3,4))
t = torch.randn_like(a)

创建在 (0,1] 上均匀分布的张量

torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

例如:

#创建一个均匀分布的长度为5的一维张量
torch.rand(5)
#创建一个均匀分布的二维张量
torch.rand(3,4)
a = torch.ones((3,4))
#根据张量的形状创建新的均匀分布张量
t = torch.rand_like(a)
在区间上创建整数均匀分布数据的张量
torch.randint(low=0, high, size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

在区间[low,high)上生成整数均匀分布数据的张量

例如:

#创建在[2,6)上均匀分布的整数张量,长度为4的一维张量
torch.randint(2, 6, (4,))
#生成在[0,9) 上均匀分布的整数张量,二维张量
torch.randint(9, (3, 2))
#根据张量的形状创建新的均匀分布的整数张量
a = torch.ones((3,4))
t = torch.randint_like(a,9)

创建0~n-1的随机排列一维张量

torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)

例如:

torch.randperm(6)
#tensor([5, 2, 4, 1, 0, 3])

创建伯努利分布(0-1分布,两点分布)的张量

torch.bernoulli(input, *, generator=None, out=None)

例如:

#先创建一个张量a,作为之后的概率值输入
a = torch.empty(1, 3).uniform_(0, 1)
#a=tensor([[0.7737, 0.5065, 0.0416]])
#使用上面创建的张量a作为概率值创建伯努利分布
torch.bernoulli(a)
#b=tensor([[1., 0., 0.]])

默认数据类型设置

import torch

#原来的默认类型
print(torch.tensor([1.2, 3]).type())
torch.set_default_tensor_type(torch.DoubleTensor)
#后来的默认类型
print(torch.tensor([1.2, 3]).type())
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值