Pytorch教程之张量

Pytorch教程之张量

说明:本文内容全部是搬运的,仅仅是记录一下,更多详细内容可以参考pytorch教程。

1、简介

Tensor中文翻译张量,是一个词不达意的名字。张量在不同学科中有不同的意义,在深度学习中张量表示的是一个多维数组,它是标量、向量、矩阵的拓展。标量是零维张量,向量是一维张量,矩阵是二维张量。
tensor之于pytorch等同于ndarray之于numpy,它是pytorch中最核心的数据结构,用于表达各类数据,如输入数据、模型的参数、模型的特征图、模型的输出等。
各类张量的api如下:可以参考官方文档。

  • torchTensors
  • Generators
  • Random sampling
  • Serialization
  • Parallelism
  • Locally disabling gradient computation
  • Math operations
  • Utilities

2、张量的结构

tensor是一个类,这个类总共有八个主要属性,见下图:
在这里插入图片描述
data属性:多维数组。其他属性都是为其服务的。
dtype属性:多维数组的数据类型。
shape属性:多维数组的形状。
device属性:tensor所在的设备,cpu或者cuda。
grad属性:data对应的梯度,形状与data一致;
grad_fn属性:记录创建该Tensor时用到的Function,该Function在反向传播计算中使用,因此是自动求导的关键;
requires_grad属性:用来指示是否需要梯度。
is_leaf属性:用来指示是否是叶子结点,为叶子结点时,反向传播结束,其梯度仍会保存,非叶子结点的梯度被释放,以节省内存。
除了这8个主要属性之外,张量的属性还有很多,利用pycharm的debug功能可以进行查看。
在这里插入图片描述

3、张量的相关函数

因为张量是一个类,所以这个类定义了很多api,利用这些api接口,我们可以进行对张量进行创建和操作。(附:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科)

3.1 张量的创建

torch.tensor
torch.tensor(data, dtype=None, device=None, 
requires_grad=False, pin_memory=False)
  • data(array_like) - tensor的初始数据,可以是list, tuple, numpy array, scalar或其他类型。
  • dtype(torch.dtype, optional) - tensor的数据类型,如torch.uint8, torch.float, torch.long等。
  • device (torch.device, optional) – 决定tensor位于cpu还是gpu。如果为None,将会采用默认值,默认值在torch.set_default_tensor_type()中设置,默认为 cpu。
  • requires_grad (bool, optional) – 决定是否需要计算梯度。
  • pin_memory (bool, optional) – 是否将tensor存于锁页内存。这与内存的存在方式有关,通常为False。
torch.from_numpy

通过numpy创建tensor方法是torch.from_numpy()。这里需要特别注意的是,创建的tensor和原array共享同一块内存,这也就意味着如果array里面的数值改变时,tensor中的数值也会改变。

import torch
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
t_from_numpy = torch.from_numpy(arr)
torch.zeros
torch.zeros(*size, out=None, dtype=None, 
layout=torch.strided, device=None, requires_grad=False)

功能:依给定的size创建一个全0的tensor,默认数据类型为torch.float32(也称为torch.float)。
主要参数:

  • layout(torch.layout, optional) -
    参数表明张量在内存中采用何种布局方式。常用的有torch.strided, torch.sparse_coo等
  • out(tensor, optional) - 输出的tensor,即该函数返回的tensor可以通过out进行赋值,请看例子。
import torch
output_tensor = torch.tensor([1])
t = torch.zeros((3, 3), out=output_tensor)
print(t, '\n', output_tensor)
print(id(t), id(output_tensor))
# 输出:
>>tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0]])

tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0]])

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

功能:依input的size创建全0的tensor。

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

功能:依给定的size创建一个全1的tensor。

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

功能:依input的size创建全1的tensor。

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

功能:依给定的size创建一个值全为fill_value的tensor。

  • size (int…) - tensor的形状。
  • fill_value - 所创建tensor的值
  • out(tensor, optional) - 输出的tensor,即该函数返回的tensor可以通过out进行赋值。
torch.full_like
torch.full_like(input, fill_value, out=None, 
dtype=None, layout=torch.strided, device=None, requires_grad=False)
torch.arange
torch.arange(start=0, end, step=1, out=None, 
dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建等差的1维张量,长度为 (end-start)/step,需要注意数值区间为[start, end)。

  • start (Number) – 数列起始值,默认值为0。the starting value for the set of
    points. Default: 0.
  • end (Number) – 数列的结束值。
  • step (Number) – 数列的等差值,默认值为1。
  • out (Tensor, optional) – 输出的tensor,即该函数返回的tensor可以通过out进行赋值。
torch.linspace
torch.linspace(start, end, steps=100, out=None, 
dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建均分的1维张量,长度为steps,区间为[start, end]。

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

主要参数:

  • start (float) – 确定数列起始值为base^start
  • end (float) – 确定数列结束值为base^end
  • steps (int) – 数列长度。

备注:base (float) - 对数函数的底,默认值为10,此参数是在pytorch 1.0.1版本之后加入的。

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

功能:创建单位对角矩阵。

主要参数:

  • n (int) - 矩阵的行数
  • m (int, optional) - 矩阵的列数,默认值为n,即默认创建一个方阵
torch.empty
torch.empty(*size, out=None, dtype=None, layout=torch.strided,
device=None, requires_grad=False, pin_memory=False)
torch.empty_like
torch.empty_like(input, dtype=None, layout=None, 
device=None, requires_grad=False)

功能:torch.empty_like之于torch.empty等同于torch.zeros_like之于torch.zeros,因此不再赘述。

torch.empty_strided
torch.empty_strided(size, stride, dtype=None, layout=None, device=None, requires_grad=False, pin_memory=False)

功能:依size创建“空”张量,这里的“空”指的是不会进行初始化赋值操作。
主要参数:

  • stride (tuple of python:ints) - 张量存储在内存中的步长,是设置在内存中的存储方式。
  • size (int…) - 张量维度
  • pin_memory (bool, optional) - 是否存于锁页内存。

3.2 依据概率分布创建

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

功能:为每一个元素以给定的mean和std用高斯分布生成随机数

主要参数:

  • mean (Tensor or Float) - 高斯分布的均值。
  • std (Tensor or Float) - 高斯分布的标准差。

特别注意事项:

mean和std的取值分别有2种,共4种组合,不同组合产生的效果也不同,需要注意:

  • mean为张量,std为张量,torch.normal(mean, std,
    out=None),每个元素从不同的高斯分布采样,分布的均值和标准差由mean和std对应位置元素的值确定;
  • mean为张量,std为标量,torch.normal(mean, std=1.0,
    out=None),每个元素采用相同的标准差,不同的均值;
  • mean为标量,std为张量,torch.normal(mean=0.0, std, out=None),
    每个元素采用相同均值,不同标准差;
  • mean为标量,std为标量,torch.normal(mean, std, size, *, out=None)
    ,从一个高斯分布中生成大小为size的张量;
torch.randn
torch.rand(*size, out=None, dtype=None, layout=torch.strided, 
device=None, requires_grad=False)

功能:在区间[0, 1)上,生成均匀分布。
主要参数:

  • size (int…) - 创建的张量的形状
torch.randn_like
torch.rand_like(input, dtype=None, layout=None, 
device=None, requires_grad=False)
torch.randint
torch.randint(low=0, high, size, out=None, dtype=None, 
layout=torch.strided, device=None, requires_grad=False)

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

主要参数:

  • low (int, optional) - 下限。
  • high (int) – 上限,主要是开区间。
  • size (tuple) – 张量的形状。
torch.randint_like
torch.randint_like(input, low=0, high, dtype=None, layout=torch.strided, device=None, requires_grad=False)
torch.randperm
torch.randperm(n, out=None, dtype=torch.int64, 
layout=torch.strided, device=None, requires_grad=False)

功能:生成从0到n-1的随机排列。perm == permutation

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

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

主要参数:

  • input (Tensor) - 分布的概率值,该张量中的每个值的值域为[0-1]。

4、张量的操作

张量的操作与numpy类似。以后用到的时候在积累。

5、张量的随机种子

随机种子(random seed)是编程语言中基础的概念,大多数编程语言都有随机种子的概念,它主要用于实验的复现。针对随机种子pytorch也有一些设置函数。
在这里插入图片描述
以上均是设置cpu上的张量随机种子,在cuda上是另外一套随机种子。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steelDK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值