01张量的介绍与创建

一、张量的介绍

1.1 张量(Tensor)是什么

在这里插入图片描述
张量是一个多维数组,它是标量、向量、矩阵的高维扩展

1.2 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,是加速的关键

常用的张量数据类型:
在这里插入图片描述

二、张量的创建

2.1 直接创建

2.1.1 torch.tensor()

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

功能: 从data创建tensor

  • data: 数据,可以是list, numpy
  • dtype: 数据类型,默认与data的一致
  • device: 所在设备, cuda/cpu
  • requires_grad: 是否需要计算梯度
  • pin_memory: 是否存于锁页内存,与转换效率有关
# 通过torch.tensor()创建
arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
t = torch.tensor(arr, device='cuda')
# t = torch.tensor(arr)
print(t)

在这里插入图片描述

2.1.2 torch.from_numpy(ndarray)

功能: 从numpy创建tensor
注意事项: 从torch.from_numpy创建的tensor与原ndarray共享内存, 当修改其中一个的数据,另外一个也将会被改动
在这里插入图片描述

# 通过torch.from_numpy创建张量
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)

在这里插入图片描述

2.2 依据数值创建

2.2.1 torch.zeros()

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

功能: 依size创建全0张量

  • size: 张量的形状,如(3, 3), (3, 224, 224)
  • out : 输出的张量
  • layout : 内存中布局形式,有strided,sparse_coo等
  • device : 所在设备, gpu/cpu
  • requires_grad: 是否需要梯度
# 通过torch.zeros创建张量
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))

在这里插入图片描述
说明:out_t和t是一样的,内存地址和数据内容都相同,说明out这个参数设置的就是接收输出的张量的变量

2.2.2 torch.zeros_like()

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

功能: 依input形状创建全0张量

  • intput: 创建与input同形状的全0张量
  • dtype: 数据类型
  • layout: 内存中布局形式

2.2.3 torch.ones()

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

功能: 依size创建全1张量

  • size: 张量的形状,如(3, 3), (3, 224, 224)
  • out : 输出的张量
  • layout : 内存中布局形式
  • device : 所在设备, gpu/cpu
  • requires_grad: 是否需要梯度

2.2.4 torch.ones_like()

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

功能: 依input形状创建全1张量

  • intput: 创建与input同形状的全1张量
  • dtype: 数据类型
  • layout: 内存中布局形式

2.2.5 torch.full()

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

功能: 依input形状创建全部为指定数值的张量

  • size: 张量的形状, 如(3, 3)
  • fill_value : 张量的值
# 通过torch.full创建全6张量
t = torch.full((3, 3), 6)
print(t)

在这里插入图片描述

2.2.6 torch.full_like()

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

2.2.7 torch.arange()

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

功能: 创建等差的1维张量
注意事项: 数值区间为[start, end)

  • start: 数列起始值
  • end: 数列"结束值"
  • step: 数列公差,默认为1
# 通过torch.arange创建等差数列张量
t = torch.arange(2, 10, 2)
print(t)

在这里插入图片描述

2.2.8 torch.linspace()

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

功能: 创建均分的1维张量
注意事项: 数值区间为[start, end]

  • start: 数列起始值
  • end : 数列结束值
  • steps: 数列长度
# 通过torch.linspace创建均分数列张量
t = torch.linspace(2, 10, 5)
# t = torch.linspace(2, 10, 6)
print(t)

在这里插入图片描述

2.2.9 torch.logspace()

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

2.2.10 torch.eye()

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

功能:创建单位对角矩阵(2维张量)
注意事项: 默认为方阵

  • n: 矩阵行数
  • m: 矩阵列数

2.3 依据概率分布创建

2.3.1 torch.normal()

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

功能: 生成正态分布(高斯分布)

  • mean: 均值
  • std: 标准差

四种模式:

  • mean为标量, std为标量
  • mean为标量, std为张量
  • mean为张量, std为标量
  • mean为张量, std为张量
# 通过torch.normal()创建正态分布张量
# 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)

# mean:标量 std: 张量
mean = 1
std = torch.arange(1, 5, dtype=torch.float)
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)

在这里插入图片描述

2.3.2 torch.randn()

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

功能: 生成标准正态分布
size : 张量的形状

2.3.3 torch.randn_like()

功能: 生成标准正态分布

2.3.4 torch.rand()

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

功能: 在区间[0, 1)上,生成均匀分布

2.3.5 torch.rand_like()

torch.rand_like(input, dtype=None,)

功能: 在区间[0, 1)上,生成均匀分布

2.3.6 torch.randint()

torch.randint(low=0,high,size,out=None,dtype=None,layout=torch.strided,device=None,requires_grad=False)

功能: 区间[low, high)生成整数均匀分布
size : 张量的形状

2.3.7 torch.randint_like()

torch.randint_like(input, low=0, high, dtype=None,)

功能: 区间[low, high)生成整数均匀分布

2.3.8 torch.randperm()

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

功能: 生成生成从0到n-1的随机排列
n: 张量的长度

2.3.9 torch.bernoulli()

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

功能: 以input为概率,生成伯努力分布 (0-1分布,两点分布)
input : 概率值

发布了105 篇原创文章 · 获赞 9 · 访问量 7821

猜你喜欢

转载自blog.csdn.net/qq_36825778/article/details/104075969
今日推荐