Tensor的概念
张量是一个多维数组,它是标量、向量、矩阵的高维拓展。
Tensor与Variable
Variable是torch.autograd中的数据类型
主要用于封装Tensor,进行自动求导
- data: 被包装的Tensor
- grad: data的梯度
- grad_fn: 创建Tensor的Function,是自动求导的关键
- requires_grad: 指示是否需要梯度
- is_leaf: 指示是否是叶子结点(张量)
PyTorch0.4.0版开始,Variable并入Tensor
- dtype: 张量的数据类型,如torch.FloatTensor,torch.cuda.FloatTensor
- shape: 张量的形状,如(64,3,224,224)
- device:张量所在设备,GPU/CPU,是加速的关键
Tensor创建
直接创建
torch.tensor
torch.tensor()
功能:从data创建tensor
- data: 数据,可以是list,numpy
- dtype: 数据类型,默认与data的一致
- device: 所在设备,cuda/cpu
- requires_grad:是否需要梯度
- pin_memory:是否存于锁页内存
import torch
import numpy as np
torch.manual_seed(1)
# =============================== exmaple 1 ===============================
# 通过torch.tensor创建张量
#
# flag = True
flag = False
if flag:
arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
t = torch.tensor(arr, device='cuda')
# t = torch.tensor(arr)
print(t)
torch.from_numpy
torch.from_numpy(ndarray)
功能:从numpy创建tensor
注意事项:从torch.from_numpy创建的tensor与原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动
# 通过torch.from_numpy创建张量
# flag = True
flag = False
if flag:
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
# print("numpy array: ", arr)
# print("tensor : ", t)
# print("\n修改arr")
# arr[0, 0] = 0
# print("numpy array: ", arr)
# print("tensor : ", t)
print("\n修改tensor")
t[0, 0] = -1
print("numpy array: ", arr)
print("tensor : ", t)
依据数值创建
torch.zeros
torch.zeros()
功能:依size创建全0张量
- size: 张量的形状,如(3,3)、(3,224,224)
- out: 输出的张量
- layout: 内存中布局形式,有strided,sparse_coo等
- device: 所在设备,gpu/cpu
- requires_grad:是否需要梯度
# 通过torch.zeros创建张量
# flag = True
flag = False
if flag:
out_t = torch.tensor([1])
t = torch.zeros((3, 3), out=out_t)
print(t, '\n', out_t)
print(id(t), id(out_t), id(t) == id(out_t))
torch.zeros_like
torch.zeros_like()
功能:依input形状创建全0张量
- intput: 创建与input同形状的全0张量
- dtype: 数据类型
- layout: 内存中布局形式
torch.ones和torch.ones_like
torch.ones()
torch.ones_like()
功能:依input形状创建全1张量
- size: 张量的形状,如(3,3)、(3,224,224)
- dtype: 数据类型
- layout: 内存中布局形式
- device: 所在设备,gpu/cpu
- requires_grad: 是否需要梯度
torch.full与torch.full_like
torch.full()
torch.full_like()
功能:依input形状创建指定数据的张量
- size: 张量的形状,如(3,3)
- fill_value: 张量的值
# 通过torch.full创建全1张量
# flag = True
flag = False
if flag:
t = torch.full((3, 3), 1)
print(t)
torch.arange
torch.arange()
功能:创建等差的1维张量注意事项:数值区间为[start,end)
- start: 数列起始值
- end: 数列“结束值”
- step: 数列公差,默认为1
# 通过torch.arange创建等差数列张量
# flag = True
flag = False
if flag:
t = torch.arange(2, 10, 2)
print(t)
torch.linspace
torch.linspace()
功能:创建均分的1维张量注意事项:数值区间为[start,end]
- start: 数列起始值
- end: 数列结束值
- steps: 数列长度
# 通过torch.linspace创建均分数列张量
# flag = True
flag = False
if flag:
# t = torch.linspace(2, 10, 5)
t = torch.linspace(2, 10, 6)
print(t)
torch.logspace
torch.logspace()
功能:创建对数均分的1维张量注意事项:长度为steps,底为base
- start: 数列起始值
- end: 数列结束值
- steps: 数列长度
- base: 对数函数的底,默认为10
torch.eye
torch.eye()
功能:创建单位对角矩阵(2维张量)注意事项:默认为方阵
- n: 矩阵行数
- m: 矩阵列数
依据概率创建
torch.normal
torch.normal()
功能:生成正态分布(高斯分布)
- mean: 均值
- std: 标准差
四种模式:
- mean为标量,std为标量
- mean为标量, std为张量
- mean为张量,std为标量
- mean为张量,std为张量
# 通过torch.normal创建正态分布张量
flag = True
# flag = False
if flag:
# mean:张量 std: 张量
# mean = torch.arange(1, 5, dtype=torch.float)
# std = torch.arange(1, 5, dtype=torch.float)
# t_normal = torch.normal(mean, std)
# print("mean:{}\nstd:{}".format(mean, std))
# print(t_normal)
# mean:标量 std: 标量
# t_normal = torch.normal(0., 1., size=(4,))
# print(t_normal)
# mean:张量 std: 标量
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
torch.randn
torch.randn()
torch.randn_like()
功能:生成标准正态分布
- size: 张量的形状
torch.rand和torch.randint
torch.rand()
torch.rand_like()
功能:在区间[0,1)上,生成均匀分布torch.randint()
torch.randint_like()功能:区间[low,high)生成整数均匀分布
- size:张量的形状
torch.randperm和torch.bernoulli
torch.randperm()
功能:生成生成从0到n-1的随机排列
- n:张量的长度3.9
torch.bernoulli()
功能:以input为概率,生成伯努力分布(0-1分布,两点分布)
- input:概率值