张量的定义及创建_张量核心[通俗易懂]

张量的定义及创建_张量核心[通俗易懂]一.张量的定义1.张量张量是一个多维数组,是标量,向量,矩阵的高维拓展2.Tensor数据类型与Variable数据类型在PyTorch0.4.0之前,张量相关的数据类型有Tensor和Vari

一.张量的定义

1.张量

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

2.Tensor数据类型与Variable数据类型

在PyTorch0.4.0之前,张量相关的数据类型有Tensor和Variable,其中Tensor用于存储张量数据,Variable用来对Tensor进行封装并用于自动求导.
Variable数据类型结构如下图:
在这里插入图片描述
data:被包装的Tensor数据

  • 但在程序中定义了一个张量t=[1,1,1],使用t.data打印出来的是tensor([1,1,1]),需要使用t.data.numpy()打印出来的才是[1,1,1].相当于用.data.numpy()才能tensor中的数据真正取出来

grad:data的梯度
grad_fn:创建Tensor的方法,如加法,乘法等,是自动求导的关键
requires_grad:Tensor是否需要计算梯度(并不是所有的张量都要用到梯度的)
is_leaf:是否是叶子节点,这是计算图中的概念,后面会详细说明

PyTorch0.4.0版本之后,Variable并入Tensor
此时Tensor数据类型结构如下:
在这里插入图片描述
dtype:张量的数据类型
shape:张量的形状
devece:张量所在的设备(CUDA(即GPU)或者CPU)
其他参数与0.4.0版本前的Variable定义相同

Tensor的数据类型:
共有九种,三大类
浮点型类,其中32位浮点型常用于网络权值:

16位浮点型 32位浮点型 64位浮点型
torch.float16或torch.half torch.float32或torch.float torch.float64或torch.double

整型类,其中64位长整形常用于图像的标签:

8位无符号整型 8位有符号整形 16位整形 32位整型 64位长整形
torch.uint8 torch.int8 torch.int16或torch.short torch.int32或torch.int torch.int64或torch.long

布尔类:

布尔型
torch.bool

二.张量的创建-直接创建

1.torch.tensor()

创建格式:
在这里插入图片描述
代码实现:

#创建numpy数组
arr = np.ones((3,3))
#使用numpy数组创建tensor变量t
t = torch.tensor(arr,dtype=torch.float32,device="cuda:0",requires_grad=False,pin_memory=False)
  • dtype参数需要使用Pytorch中定义的torch.xx给行
  • cuda:x表示该tensor在第x块GPU上,只有一块时候编号为0
  • 当requires_grad=True,即需要梯度时,tensor的数据类型必须为浮点类,否则报错
  • 由numpy或list创建tensor后,修改numpy和list不会影响到tensor,即不共享内存

2.torch.from_numpy()

**功能:**从numpy创建tensor
格式: torch.from_numpy(ndarray) #ndarray代表numpy类型数据
代码实现:

arr = np.ones((3,3))
t = torch.from_numpy(arr)
  • tensor数据类型与numpy数据保持一致
  • tensor数据与numpy数据共享内存,完成定义后,更改numpy,tensor也会发生相应的改变

三.张量的创建-依据数值创建

主要用于创建全0,全1,等差,均分,对角张量.

1.torch.zeros()

功能: 创建全0张量
格式:
在这里插入图片描述
代码实现:

#定义一个tensor类型变量t_out
t_out = torch.tensor([1],dtype=torch.float,device="cuda")
#使用torch.zeros()定义全零tensor类型变量t,并将该变量输出到t_out中
t = torch.zeros((3,3),dtype=torch.float,out=t_out,layout=torch.strided,device="cuda"
,requires_grad=True)
  • tensor类型数据t和t_out的内存地址相同,实际上是同一个tensor变量,具有两个不同的名字
  • t_out在接受全零tensor数据前后内存地址不变,实际上out=t_out这一过程是将t_out对应内存地址中的数据替换成定义的全零张量
  • t=可以不写,此时就是定义一个全零的tensor数据,并赋值给tensor变量t_out
  • out = t_out可以不写,此时就是定义一个全零的Tensor变量t
  • 使用out=参数时,要保证使用torch.zeros()定义的张量和out参数t_out的数据类型,所在设备一致
  • layout默认参数为torch.strided,当张量为稀疏张量时,使用torch.sparse_coo会提高内存效率

2.torch.zeros_like()

在这里插入图片描述
代码实现:

t_out = torch.tensor([1],dtype=torch.float)
t = torch.zeros_like(t_out,dtype=torch.float,layout=torch.strided,device="cuda",requires_grad=True)
  • 这里没有out参数
  • 使用zeros_like()定义的tensor变量只有形状和input有关,其他的参数没有关系

3.torch.ones()和torch.ones_like()

**功能:**创建全1张量
**格式与代码实现:**与创建全零张量相同
在这里插入图片描述

4.torch.full()和torch.full_like()

功能: 创建指定数据的张量
格式: 其中fill_value是用于填充的指定数据
在这里插入图片描述

5torch.arange()

在这里插入图片描述

  • 只能创建一维张量,即向量
  • start为闭区间,可以取到;end为闭区间,取不到

6.torch.linespace()和torch.logspace()

在这里插入图片描述

  • 只能创建一维张量,即向量
  • start和end都是闭区间,都可以取得
  • steps为数列长度,如step=n,则生成的tensor中由n个元素
  • 步长=(end-start)/(steps-1)
    在这里插入图片描述
  • 只能创建一维张量,即向量
  • start和end都是闭区间,都可以取得
  • steps为数列长度,如step=n,则生成的tensor中由六个元素
  • 步长=base^((end-start)/(steps-1)),如t = torch.logspace(0,2,3),输出为tensor([ 1., 10., 100.])

7.torch.eye()

在这里插入图片描述

  • 一般只用设置n就可以,此时矩阵为方阵.也可以同时设置n和m,此时矩阵可以不为方针

四.张量的创建-依概率分布创建

1.正态分布

在这里插入图片描述
该函数具有四种模式:
在这里插入图片描述

  • 当均值和标准差均为张量时,要求两者形状一致;创建的张量形状与均值或标准差张量的形状也保持一直,指定位置的数据通过在均值张量和标准差张量中对应位置的均值参数和标准差参数构成的概率空间内按照概率采样得到
  • 当均值为张量,标准差为标量时候;创建的张量形状与均值张量形状一致,指定位置的数据由对应位置的均值参数和标准差标量构成的概率空间内采样得到
  • 当标准差为张量,均值为标量时候;创建的张量形状与标准差张量形状一致,指定位置的数据由对应位置的标准差参数和均值标量构成的概率空间内采样得到
  • 当两者均为标量时候;创建的张量中各位置数据均在标准差与均值标量构成的同一个概率区间内得到,此时需要使用额外的参数size=指定张量的形状

2.标准正态分布

在这里插入图片描述
更正:size前没有*

  • torch.randn_like()用法同torch.zeros_like()

3.均匀分布

在这里插入图片描述

4.随机排列

在这里插入图片描述

5.伯努利分布

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

  • 从伯努利分布中提取二进制随机数(0或1),输入张量应为包含用于绘制二进制随机数的概率的张量。因此,输入中的所有值都必须在以下范围内(0,1)
  • 第i个元素的输出tensor将要根据输入的第i个概率值,来决定是否生成1值
  • 输出tensor仅仅只有0或1值,并且其形状和输入的Input的形状是一样的
  • 输入必须是浮点型类型的张量

今天的文章张量的定义及创建_张量核心[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/68377.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注