张量的创建
构造
首先需要导入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种模式:
- mean为张量,std为张量
- mean为标量,std为标量
- mean为标量,std为张量
- 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())