深度学习 PyTorch_Week1【任务1】PyTorch基础数据结构——张量

PyTorch基础数据结构——张量

一、Tensor概念

What is Tensor?
在这里插入图片描述
如上图,张量是一个多维数组,它是标量、向量、矩阵的高维拓展。

Tensor与Variable
张量在数学概念中是多维数组,在pytorch中,张量不仅仅表示多维数组,也是自动求导的关键。

(声明:Variable是pytorch0.4.0版本之前的一个重要数据类型,但是从pytorch0.4.0版本开始,Variable并入到Tensor。理解Variable对张量理解有帮助~)

Variable是torch. autograd中的数据类型主要用于封装Tensor,进行自动求导

Variable主要有五个属性:

  • data:被包装的Tensor
  • grad:data的梯度
  • grad_ fn:创建Tensor的Function,是自动求导的关键
  • requires_ grad: 指示是否需要梯度
  • is_ leaf:指示是否是叶子结点(张量)

由于Variable并入Tensor,Tensor除了有Variable这五个属性外,还有另外三个属性:

  • dtype:张量的数据类型(pytorch提供九种数据类型),如torch.FloatTensor(CPU),torch.cuda.FloatTensor(GPU)等
  • shape:张量的形状,如(64,3,224,224)
  • device:张量所在设备,GPU/CPU,是加速的关键

二、Tensor创建一:直接创建

1.1 torch.tensor()

功能:从data创建tensor

格式:torch.tensor(data,dtype=None,device=None,requires_ grad=False,pin_memory=False)

  • data:数据,可以是list, numpy
  • dtype:数据类型,默认与data的一致
  • device :所在设备,cuda/cpu
  • requires_ grad: 是否需要梯度
  • pin. memory:是否存于锁页内存

代码实现:

arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
# t = torch.tensor(arr, device='cuda')
t = torch.tensor(arr)
print(t)

1.2 torch.from_numpy(ndarry)

功能:从numpy创建tensor

注意事项:从torch.from_ numpy创建的tensor于原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动)

验证代码:

arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
# print("numpy array: ", arr)
# print(id(arr))
# print("tensor : ", t)
# print(id(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)

三、Tensor创建二:依据数值创建张量

2.1 torch.zeros()

功能:依size创建全0张量

格式:torch.zeros(*size,out=None,dtype=None,layout=torch.strided,device=None,equires_ grad=False)

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

代码实现:

out_t = torch.tensor([1]) # 接收全0张量

t = torch.zeros((3, 3), out=out_t) # out是将torch.zeros((3, 3)的输出值给out_t

print(t, '\n', out_t)
print(id(t), id(out_t), id(t) == id(out_t))

2.2 torch.zeros_like()

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

格式:torch. zeros_ like(input,dtype=None,layout=None,device=None,requires_ grad=False)

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

2.3 torch. ones()

格式:
torch. ones(*size,out =None,dtype =None,layout=torch. strided,device=None,requires_ grad=False)

2.4 torch.ones_like()

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

格式:torch. ones_ like( input ,dtype=None , layout=None,device=None,requires_ grad=False)

  • size:张量的形状,如(3,3)、(3, 224,224)
  • dtype:数据类型
  • layout:内存中布局形式
  • device:所在设备,gpu/cpu
  • requires_ grad:是否需要梯度

2.5 torch.full()

自定义张量数值
在这里插入图片描述
代码实现:

t = torch.full((3, 3), 10) # 创建3*3张量,每个元素都为10
print(t)

2.6 torch.full_like()

功能:自定义张量数值

  • size:张量的形状,如(3, 3)
  • fill_ value:张量的值

2.7 torch.arange()

功能:创建等差的1维张量

注意事项:数值区间为[start, end)

  • start:数列起始值
  • end:数列”结束值”
  • step:数列公差,默认为1
    在这里插入图片描述

代码实现:

t = torch.arange(2, 10, 2)
print(t)

结果为:tensor([2,4,6,8]) 没有10

2.8 torch.linspace()

功能:创建均分的1维张量

注意事项:数值区间为[start, end].

  • start:数列起始值
  • end:数列结束值
  • steps:数列长度
    在这里插入图片描述

代码实现:

t = torch.linspace(2, 10, 5) # 起始2 结束10 长度5
# t = torch.linspace(2, 10, 6)
print(t)

结果为:tensor([2.,4.,6.,8.,10.])

其步长为:(end-start)/(steps-1) 本例(10-2)/(5-1)=2

2.9 torch.logspace()

功能:创建对数均分的1维张量

注意事项:长度为steps,底为base

  • start:数列起始值
  • end:数列结束值
  • steps:数列长度
  • base:对数函数的底,默认为10
    在这里插入图片描述

2.10 torch. eye()

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

注意事项:默认为方阵

  • n:矩阵行数
  • m:矩阵列数
    在这里插入图片描述
    一般为方阵,故m值一般不设置

四、Tensor创建三:依据概率分布创建张量

3.1 torch. normal()

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

  • mean:均值
  • std:标准差
    在这里插入图片描述
    四种模式:
    mean为量,std为
    mean为量,std为张量
    mean为张量,std为
    mean为张量,std为张量
    在这里插入图片描述
    当这两个参数都为标量时,张量大小不确定,需增加参数size

代码实现:

# 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,)) # 均值为0 标准差为1 当两个参数都为标量时张量多大是没法确定的,所以需要设定size
# 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)

3.2 torch.randn()

在这里插入图片描述

3.3 torch.randn_like()

功能:生成标准正态分布

  • size:张量的形状

3.4 torch.rand()

在这里插入图片描述

3.5 torch.rand_like()

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

3.6 torch .randint()

在这里插入图片描述

3.7 torch.randint_like()

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

  • size:张量的形状

3.8 torch.randperm()

功能:生成生成从0到n- 1的随机排列(经常用来索引)

  • n:张量的长度
    在这里插入图片描述

3.9 torch.bernoulli()

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

  • input:概率值
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值