【Torch笔记】Tensor

1 什么是 Tensor?

Tensor,又称张量,它是矩阵向任意维度的推广

【Tensor 与 Variable(目前已弃用,但最好了解一下)】

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

  • data:被封装的 tensor
  • grad:data 的梯度
  • grad_fn:创建 tensor 的 function,是自动求导的关键
  • requires_grad:指示是否需要梯度
  • is_leaf:指示是否是叶子结点(张量)

总的来说,Variable 就是给 Tensor 添加相关属性,使其自动求导。

从 PyTorch 0.4.0 版本开始,Variable 并入 Tensor,并额外添加了三个与数据相关的属性:

  • dtype:张量的数据类型,如 torch.FloatTensor,torch.cuda.FloatTensor
  • shape:张量的形状,如 (64, 3, 224, 224)
  • device:张量所在设备,GPU/CPU

2 Tensor 的创建方法

2.1 直接创建

2.1.1 torch.tensor()

最简单、直接的方法就是通过 torch.tensor() 进行创建。

torch.tensor()

  • data:数据,可以是 list,numpy
  • dtype:数据类型,默认与数据保持一致
  • device:所在设备,cuda / cpu
  • requires_grad:是否需要计算梯度
  • pin_memory:是否存于锁页内存,通常为 False
arr = np.ones((3, 3))       # ndarray 类型
tensor = torch.tensor(arr)
print(arr.dtype)
print(tensor)

稍做修改,将数据放入 cuda:

arr = np.ones((3, 3))
tensor = torch.tensor(arr, device="cuda")
print(arr.dtype)
print(tensor)

2.1.2 torch.from_numpy(ndarray)

另一种直接创建的方法,使用方法 torch.from_numpy(ndarray) 创建 tensor,从 numpy 创建 tensor。

需要注意的是,使用该方法创建的 tensor 与原 ndarray 共享内存,即当修改其中一个的数据,另一个也会被改动

arr = np.array([1, 2, 3, 4]).reshape(2, 2)
tensor = torch.from_numpy(arr)
print(arr)
print(tensor)

2.2 依据数值创建

2.2.1 torch.zeros() 与 torch.zeros_like()

torch.zeros() 方法的功能是创建全 0 的张量:

  • size:张量的形状
  • out:输出的张量
  • layout:内存中布局形式,有 strided,sparse_coo 等
  • device:cuda / cpu
  • requires_grad:是否需要梯度
out_t = torch.tensor([1])
t = torch.zeros(size=(3, 3), out=out_t)
print(out_t)
print(t)
print(id(out_t), id(t), id(out_t)==id(t))

可见,t 和 out_t 指向同一个地址,也就是生成一个全 0 的张量,然后赋值给 out。

torch.zeros_like() 函数功能是,依 input 形状创建全 0 张量:

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

2.2.2 torch.ones() 与 torch.ones_like()

类似的,需要得到全 1 张量,只需要将 zeros 改成 ones 即可,上述两方法均有对应的方法。

2.2.3 torch.full() 与 torch.full_like()

torch.full() 依 input 形状和对应值 fill_value 创建张量:

  • size:张量的形状
  • fill_value:张量的值
out_t = torch.tensor([1])
t = torch.full(size=(3, 3), out=out_t, fill_value=10)
print(out_t)
print(t)
print(id(out_t), id(t), id(out_t)==id(t))

2.2.4 torch.arange()

torch.arange() 方法可创建等差为 1 的张量,数值区间在 [start, end)

  • start:数列起始值
  • end:数列“结束值”
  • step:数列公差,默认为 1
t = torch.arange(start=0, end=10, step=2)
print(t)

2.2.5 torch.linspace()

torch.linspace() 可创建均分的一维张量。数值区间长度为 [start, end]

  • start:数列起始值
  • end:数列结束值
  • steps:数列长度
t = torch.linspace(start=0, end=10, steps=2)
print(t)
t = torch.linspace(start=0, end=10, steps=5)
print(t)
t = torch.linspace(start=0, end=10, steps=8)
print(t)

2.2.6 torch.logspace()

torch.logspace() 方法与上面的一样,不同之处在于长度为 stpes,对数的底为 base

  • start:数列起始值
  • end:数列结束值
  • steps:数列长度
  • base:对数函数的底,默认为 10

2.2.7 torch.eye()

torch.eye() 可创建单位对角矩阵(二维张量),默认为方阵:

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

2.3 依概率分布创建张量

2.3.1 torch.normal()

torch.normal() 方法可以生成正态分布:

  • mean:均值

  • std:标准差

    它具有四种模式,均值、标准差分别为标量和张量的形式。

## 模式一:二者均为张量
mean = torch.tensor([1, 2, 3, 4], dtype=float)
std = torch.tensor([1, 2, 3, 4], dtype=float)
t_normal = torch.normal(mean, std)
print("mean:{} \n std:{}".format(mean, std))
print(t_normal)

实际上,上述案例生成了四个正态分布,其均值和标准差从序列 0-3 分别对应,生成的张量从这四个正态分布中进行采样,然后拼成一个一维张量。

## 模式二:二者均为标量
t_normal = torch.normal(0, 1, size=(4,))
print(t_normal)

## 模式三:均值为张量,标准差为标量
mean = torch.tensor([1, 2, 3, 4], dtype=float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)## 模式四:均值为标量,标准差为张量
mean = 1
std = torch.tensor([1, 2, 3, 4], dtype=float)
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)

2.3.2 torch.randn() 与 torch.randn_like()

torch.randn() 生成标准正态分布:

  • size:张量的形状

2.3.3 torch.rand() 与 torch.rand_like()

torch.rand() 方法生成区间 [0, 1) 上,生成均匀分布。

2.3.4 torch.randint() 与 torch.randint_like()

torch.rand() 方法生成区间 [low, high) 上,生成整数均匀分布:

  • size:张量的形状

2.3.5 torch.randperm()

torch.randperm() 生成从 0 到 n-1 的随机排列:

  • n:张量的长度

2.3.5 torch.bernoulli()

torch.bernoulli() 以 input 为概率,生成伯努利分布(0-1分布,两点分布)

  • input:概率

【Torch笔记】Tensor 简介与创建方法相关推荐

  1. Tensor的创建方法

    目录 1.直接创建Tensor--torch.tensor() 2.从numpy创建tensor--torch.from_numpy(ndarray) 3.根据数值创建tensor (1)torch. ...

  2. 微信门店小程序怎样创建 门店小程序创建方法简介

    微信门店小程序怎样创建 门店小程序创建方法简介 微信门店小程序是什么东西?门店小程序要怎样创建?还不清楚微信门店小程序详情的小伙伴们抓紧时间跟上小编一起来看一下吧!     门店小程序是什么? 微信发 ...

  3. 傲游浏览器怎么创建笔记 傲游浏览器笔记创建方法分享

    和某些浏览器不同,傲游浏览器中的笔记功能拥有极清爽.极简约.极免费等三大特性,并因此获得了不少用户的青睐.那么,在傲游浏览器中该怎么创建笔记呢?下面小编就来分享一下傲游浏览器笔记创建的方法,有需要的朋 ...

  4. CREO:CREO软件之工程图【表】之一明细表、表格创建、创建BOM球标、自动生成零件报表的简介及其使用方法(图文教程)之详细攻略

    CREO:CREO软件之工程图[表]之一明细表.表格创建.创建BOM球标.自动生成零件报表的简介及其使用方法(图文教程)之详细攻略 目录

  5. CREO:CREO软件之工程图【创建】以及配置(符合国家标准)的简介及其使用方法(图文教程)之详细攻略

    CREO:CREO软件之工程图[创建]以及配置(符合国家标准)的简介及其使用方法(图文教程)之详细攻略 目录 CREO软件之工程图[创建]以及配置(符合国家标准)的简介及其使用方法(图文教程) 工程图 ...

  6. PHP学习笔记 第八讲 Mysql.简介和创建新的数据库

    八.Mysql.简介和创建新的数据库 1.mysql简介与概要 mysql是一个小型关系型数据管理系统,开发者为瑞典mysqlab公司现在已经被sun公司收购 1.可以处理拥有上千万条记录的大型数据 ...

  7. Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信

    Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...

  8. python中如何创建一个空列表_Python学习笔记(1):列表的四种创建方法

    我的电脑安装的是Anaconda 3开源的Python发行版本,其中是集合3.6版本的Python与可视化编程工具采用的是Spyder. 打开Spyder可视化工具,新建一个空白文件,做好备注为&qu ...

  9. 【Torch笔记】计算图与动态图

    [Torch笔记]计算图与动态图 1 什么是计算图? 计算图(Computational Graph)是用来 描述运算 的有向无环图,主要由节点和边组成.节点表示数据,如向量.矩阵.张量,边表示运算, ...

最新文章

  1. 《你不可不知的50个建筑学知识》之哥特式建筑
  2. CentOS6.4安装VirtualBox,以及ISO镜像无法加载的解决方法
  3. 计算机主板等级指标,转载一篇主板文章,教你认识三大厂主板分级
  4. MySQL INSERT INTO...ON DUPLICATE KEY UPDATE的使用
  5. PS调出清新淡雅外景女生背影照
  6. led灯条维修_led硅胶线条灯不亮的8大原因,怎样识别led灯带的质量
  7. 分数优先遵循志愿php源码_分数优先 遵循志愿
  8. php中统计记录条数,使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
  9. Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等
  10. 恶意软件利用合法的代码签名证书横行Windows 系统
  11. GJB 软件测试计划(模板)
  12. 2018-4-17论文《狼群算法的研究与应用》笔记1 智能算法简介;狼群算法国内外研究现状以及参看文献
  13. YeeCOM DTU 轮询采集
  14. 【最新】半小时教你制作出属于自己的QQ机器人【保姆级】
  15. zookeeper介绍及使用
  16. 【生活】驾照C1-科一手册
  17. Educoder/头歌JAVA——jQuery动画
  18. 关于感染型病毒的那些事(一)
  19. Linux 查看文件和文件夹大小,隐藏文件的大小方法总结
  20. layui ztree 实现下拉树

热门文章

  1. SAX(Symbolic Aggregate Approximation):时间序列的符号聚合近似方法
  2. c语言编程输入5输出五行五列,C语言编程 在屏幕上打印五行*号,每行分别为5个,30个,10个,28个,16个。...
  3. AD软件电路图快捷键
  4. 华为荣耀5cvs华为v9play_华为荣耀V9play和荣耀V9有什么区别?
  5. python星号画雪花_python-turtle-画雪花
  6. 路由器dns服务器修改,路由器dns服务器是自己设置的
  7. 长虹android电视无法启动,长虹启动CHiQ电视迭代升级:兼容安卓苹果
  8. 【在线研讨会】智慧汽车时代来临 -车规功能安全软硬件一次到位
  9. 解码resources时里面是空的_支持高清6K解码,AI人工智能语音,腾讯企鹅极光盒子1v闪亮登场...
  10. 日均调用量超13亿次,阿里达摩院研发全球首个实时翻译直播