PyTorch张量简介与创建
张量是什么
张量:是指数学维度上的标量,向量,矩阵的多维拓展。
标量:数学维度为0,只有大小没有方向的量,如单个数字1、2、3…
向量:数学上是指既有方向又有大小的标量,但是在pytorch以及计算机领域内是类似于一维数组/列表的量。
矩阵:二维的向量,用行列表达。在pytorch以及计算机领域用二维数组/二维列表表达,行列分别对应图像的高和宽。
张量:三维及三维以上数组/列表的表达,例如,用pytorch生成一个(3, 4, 5)的随机张量
import torch
torch.rand(3, 4, 5)
结果如图:
它表示的是,3个4行X5列的数组。在图像上表示的是3个channel的4行X5列的图像。
图像的表达有1个channel的灰度图以及3个channel的RGB图像即是红绿蓝的具体数值表示。
张量在pytorch中即是Tensor。
一、Tensor与Variable
Variabel是pytorch0.4.0以前的一个重要的数据类型,但是在0.4.0版本之后,Variabel并入到了Tensor之中。
Variable是torch.autograd中的数据类型,主要用于封装Tensor, 进行自动求导。PyTorch0.4.0版本及以前主要有5个属性:data、grad、grad_fn、requires_grad、is_leaf。
data:被包装的Tensor
grad:data的梯度
grad_fn:创建Tensor的Function,是自动求导的关键。
requires_grad:指示是否需要梯度。
is_leaf:指示是否是叶子节点(张量)。
pytorch0.4.0版本之后主要有8个属性:data、dtype、shape、device、requires_grad、grad、grad_fn、is_leaf。
dtype:张量的数据类型(PyTorch中有9种),如torch.FloatTensor、torch.cuda.FloatTensor
shape:张量的形状,如(64, 3, 224, 224)。
device:张量所在的设备,GPU/CPU,是加速的关键。
其他的5个与pytorch0.4.0版本一样。
二、张量的创建
1. torch.tensor()
功能:从data创建tensor data:数据,可以是list,numpy dtype:数据类型,默认与data的一致 device:所在设备,cuda/cpu requies_grad:是否需要梯度 pin_memory:是否存于锁页内存。import torch
torch.ones((3, 3))
GPU上生成数据:
torch.ones((3, 3), device='cuda') # 注意,device='cuda'而不是gpu
2. torch.from_numpy(ndarray)
功能:从numpy创建tensor注意事项:从torch.from_numpy创建的tensor与原ndarray共享内存,改其中一个数据,另外一个也会被改动。
import numpy as np
import torch
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
print(arr)
print(t)
arr[0, 0] = 0
print(arr)
print(t)
t[2, 2] = 9
print(arr)
print(t)
三、依据数值创建
3.1 torch.zeros(*size,
out=None,
dtype=None,
layout=None,
device=None,
requires_grad=False)
以及torch.zeros_like()
功能:依size创建全0张量
size:张量的形状,如(3, 3)、(3, 224, 224)。
out:输出的张量。
layout:内存中布局形式有strided(默认)、sparse_coo(稀疏矩阵时有时会需要)等。
device:所在设备,gpu/cpu,其中当在gpu时, device=‘cuda’,默认在cpu。
requires_grad:是否需要梯度。
import torch
out_t = torch.tensor([1])
t = torch.zeros((3, 3), out=out_t)
print(out_t)
print(t)
print(id(out_t))
print(id(t))
3.2 torch.ones()与torch.ones_like()
功能:生成全1的张量
参数: 与torch.zeros()类似。
3.3 torch.full()与torch.full_like()
功能:生成一个自定义全部数值的张量
size:张量的形状
file_value:张量的值
import torch
t = torch.full((3, 3), 10)
print(t)
3.4 torch.arange(start=0,
end,
step=1,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
功能:创建等差的1维张量
注意事项 :数值区间维[start, end]
start: 数列起始值
end:数列"结束值",因为不包含最后一位,所以"结束值"
step:系列公差,默认为1
import torch
t = torch.arange(2, 10, 2)
print(t)
3.5 torch.linspace(start,
end,
steps=100,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
功能:创建均分的1维张量
注意事项:数列区间维[start, end]
start:数列起始值
end:数列结束值
steps:数列长度
数列中的数值计算: (end-start)/(step-1)
import torch
t = torch.linspace(2, 10, 5)
print(t)
3.6 torch.logspace(start,
end,
steps=100,
base=10.0,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
功能:创建对数均分的1维张量
注意事项:长度维steps,底维base
start:数列起始值
end:数列结束值
steps:数列长度
base:对数函数的底,默认为10
3.7 torch.eye(n,
m=None,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
功能:创建单位对焦矩阵(2维张量)
注意事项:默认为方阵
n:矩阵行数
m:矩阵列数
四、依据概率分布创建
4.1 torch.normal(mean,
std,
out=None)
功能:生成正态分布(高斯分布)
mean: 均值
std:方差
4.2 torch.randn(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
torch.randn_like()
功能:生成标准正态分布
size:张量的形状
4.3 torch.rand(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
torch.rand_like()
功能:在区间[0, 1)上生成均匀分布
4.4 torch.randint(low=0,
hight,
size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
torch.randint_like()
功能:在区间[low, hight)上生成整数均匀分布
4.5 torch.randperm(n,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
功能:生成从0到n-1的随机排列
n:张量的长度
4.6 torch.bernoulli(input,
*,
generator=None,
out=None)
功能:以input为概率,生成伯努利分布(0-1分布、两点分布、二项分布)
input: 概率值