学习教材:
动手学深度学习 PYTORCH 版(DEMO)

(https://github.com/ShusenTang/Dive-into-DL-PyTorch)
PDF 制作by [Marcus Yang](https://github.com/chenyang1999)

本文目录:

  • 1.tensor简介
  • 2.创建Tensor
  • 3.Tensor的操作
  • 4.Tensor数据类型的转换
  • 5. Tensor的形状修改
  • 6. Tensor的数据转换
  • 7. Tensor的广播机制
  • 8.tensor运算的内存开销
  • 9. Tensor ON GPU

1.tensor简介

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。
Tensor与Numpy的多维数组非常相似。
Tensor还提供了GPU计算和自动求梯度等更多功能,这些使Tensor更适合深度学习。

2.创建Tensor

2.1 直接创建一个5*3的未初始化的Tensor:

x = torch.empty(5,3)

2.2 创建一个5*3的随机初始化的Tensor

torch.rand:返回一个张量,包含了从区间[0,1)的均匀分布中抽取一组随机数,形状由可变参数size定义。
原型:

torch.rand(size,out=None,dtype=None,layout=torch.strided,device=None,
requires_grad=False)->Tensor

举例:

x = torch.rand(5,3)

torch.randn:返回一个张量,包含了从标准正态分布(Normal distribution)(均值为0,方差为1,即高斯白噪声)中抽取一组随机数,形状由可变参数sizes定义。

x = torch.randn(2,3)

2.3 创建全为0的Tensor(指定数据类型)

x = torch.zeros(5,3,dtype=long)

2.4 根据数据直接创建

x = torch.tensor([5.5,3])

2.5 tensor.new_ones:返回一个与size大小相同的用1填充的张量;

默认情况下,返回的Tensor具有与此张量相同的torch.dtype和torch.device;

>>> tensor = torch.tensor((), dtype=torch.int32)
>>> tensor.new_ones((2, 3))
tensor([[ 1,  1,  1],[ 1,  1,  1]], dtype=torch.int32)

2.6 torch.rand_like:返回与输入相同大小的张量,该张量由区间[0,1)上均匀的随机数填充。

原型:

torch.rand_like(input,dtype=None,layout=None,device=None,requires_grad=False,
memory_format=torch.preserve_format)->tensor

torch.rand_like(input)相当于torch.rand(input.size(),dtype=input.dtype,layout=input.layout,device=input.device)

举例:

x = torch.rand_like(x,dtype=torch.float)

2.7 torch.arange:根据(首,尾,步长)生成tensor

2.8 其余tensor的构造函数

Tensor(*sizes)    基础构造函数
ones(*sizes)      全1Tensor
zeros(*sizes)     全0Tensor
eye(*sizes)   对角线为1,其他为0
arange(s,e,step)  从s到e,步长为step
linespace(s,e,steps)  从s到e,均匀切分成steps份
normal(mean,std)/uniform(from,to)  正态分布/均匀分布
randperm(m) 随机排列

这些创建方法都可以在创建的时候指定数据类型dtype和存放device(cpu/gpu)

3.Tensor的操作

2.1 Tensor的加法操作:

加法形式一:

x = torch.rand(5, 3)
y = torch.rand(5, 3)
z = x + y

加法形式二:

z=torch.add(x,y)result = torch.empty(5, 3)
torch.add(x, y, out=result)

加法形式三:

y.add_(x)

2.2 Tensor的索引操作:

我们还可以使用类似Numpy的索引操作来访问Tensor的一部分。需要注意的是:索引出来的结果与原数据共享内存,也即修改一个,另一个也会跟着修改。

y = x[0,:]
y += 1
print(y)
print(x[0,:])

除了常用的索引选择数据之外,PyTorch还提供了一些高级的选择函数:

index_select(input,dim,index)   在指定维度dim上选取过,比如选取某些行,某些列
masked_select(input,mask)       例子如上,a(a>0),使用ByteTensor进行选取
non_zero(input)                 非0元素的下标
gather(input,dim,index)         根据index,在dim维度上选取数据,输出的size与index一样的

4.Tensor数据类型的转换

使用独立的函数如 int(),float()等进行转换

long_tensor = tensor.long()
features = features.float()

使用torch.type()函数

t2=t1.type(torch.FloatTensor)

使用type_as()函数

t3=t1.type_as(t2)

5. Tensor的形状修改

5.1 view()

用view()来改变Tensor的形状:

y = x.view(15)

-1所指的维度可以根据其他的维度推出来

z = x.view(-1,5)

注意:
view()返回的新tensor与源tensor共享内存,实际上就是同一个tensor,也就是更改一个,另一个也会跟着改变。
(顾名思义,view()仅仅改变了对这个张量的观察角度)

Pytorch中的Tensor支持包含一百多种操作,包含转置,索引,切片,数学运算,线性代数,随机数等。

6. Tensor的数据转换

6.1 item()

作用:它可以将一个标量Tensor转换为一个Python number:

x = torch.randn(1)
x.item()

6.2 Tensor 转 NumPy
使用numpy()将Tensor转换成NumPy数组:
注意,这样产生的NumPy数组与Tensor共享相同的内存,改变其中一个另一个也会改变!

a = torch.ones(5)
b = a.numpy() # 转为numpy

6.3 NumPy数组转Tensor
使用from_numpy()将NumPy数组转换为Tensor:
注意,这样产生的NumPy数组与Tensor共享相同的内存,改变其中一个另一个也会改变!

a = np.ones(5)
b = torch.from_numpy(a)

7. Tensor的广播机制

当对两个形状不同的Tensor按元素运算时,可能会触发广播机制(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。

x = torch.arange(1, 3).view(1,2) #[1,2]
y =torch.arange(1, 4).view(3,1)
print(x+y)

结果:

tensor([[2, 3],[3, 4],[4, 5]])

8.tensor运算的内存开销

索引,view()是不会开辟新的内存的,而像y=x+y这样的运算是会开辟新的内存的,然后y指向新的内存。

9. Tensor ON GPU

用方法to()可以将Tensor在CPU和GPU之间相互移动。

# 以下代码只有在PyTorch GPU版本上才会执⾏
if torch.cuda.is_available():   device = torch.device("cuda")  # GPUx = torch.arange(1, 3).view(1,2)y = torch.ones_like(x,device=device)  #直接创建一个在GPU上的Tensorx = x.to(device) # 等价于 .to("cuda")z = x + yprint(z)print(z.to("cpu", torch.double)) # to()还可以同时更改数据类型

【PyTorch系例】torch.Tensor详解和常用操作相关推荐

  1. 2021 PyTorch官方实战教程(一)Tensor 详解

    点击上方"AI算法与图像处理",选择加"星标"或"置顶"重磅干货,第一时间送达 这个系列时pytorch官方实战教程,后续会继续更新.. 一 ...

  2. 时间序列预测任务PyTorch数据集类——TimeSeriesDataSet 类详解

    时间序列预测任务PyTorch数据集类--TimeSeriesDataSet 类详解 当进行时间序列预测或时间序列分析时,通常需要对数据进行预处理和转换以提高模型的效果和准确性.TimeSeriesD ...

  3. torch.unsqueeze和 torch.squeeze() 详解

    1. torch.unsqueeze 详解 torch.unsqueeze(input, dim, out=None) 作用:扩展维度 返回一个新的张量,对输入的既定位置插入维度 1 注意: 返回张量 ...

  4. Pytorch|YOWO原理及代码详解(二)

    Pytorch|YOWO原理及代码详解(二) 本博客上接,Pytorch|YOWO原理及代码详解(一),阅前可看. 1.正式训练 if opt.evaluate:logging('evaluating ...

  5. Pytorch | yolov3原理及代码详解(二)

    阅前可看: Pytorch | yolov3原理及代码详解(一) https://blog.csdn.net/qq_24739717/article/details/92399359 分析代码: ht ...

  6. Leetcode怎么调试java代码,IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解...

    环境: idea2020.1 插件: LeetCode-editor 6.7 一.IDEA安装LeetCode插件 安装完成重启idea 打开插件 URL可以选择国服和世界服.LoginName和Pa ...

  7. 单例模式(单例设计模式)详解

    在有些系统中,为了节省内存资源.保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式. 单例模式的定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自 ...

  8. PyTorch入门笔记-matmul函数详解

    PyTorch入门笔记-matmul函数详解 本文转载自:PyTorch入门笔记-matmul函数详解 - 腾讯云开发者社区-腾讯云 (tencent.com) 41409)]

  9. tc网络流控详解及常用队列

    tc网络流控详解及常用队列 TC是什么? tc的组成有哪些? 队列.类别.过滤器 可分类别队列 简单的无类别队列(pfifo_fast) 简单的无类队列(TBF) 无类别随机公平队列(SFQ) 可分队 ...

最新文章

  1. SegICP:一种集成深度语义分割和位姿估计的框架(附代码)
  2. APPLE:疑问驱动下的学习与实践
  3. linux多进程server 进程池_Python 中的进程池与多进程
  4. 关于Jsoup解析https网页的问题
  5. 暂存单点传播帧,以及使用 TIM 来传递
  6. 数说真相|46公里内,Uber更划算
  7. JS中变量和函数的使用
  8. FTP使用外部数据源
  9. 嵌入式Linux系统编程学习之二十八线程的等待退出
  10. failed to read artifact descriptor for xx
  11. Dijkstra算法 最短路径
  12. 重启apache下php,linux下apache重启并查看php环境
  13. html得到上传文件类型后缀,js获取上传文件后缀名(附js提交form表单)
  14. php对接亿乐社区,亿乐社区对接教程
  15. MySQL创建视图的语法格式_Mysql创建视图语法及其创建种类
  16. Zend与PHP之间到底是什么关系
  17. Acer传奇Go电脑开机几分钟就会蓝屏怎么重装系统?
  18. Python_美多商城(商品)_6
  19. 在misc中涉及的二维码
  20. Excel中的格式刷如何使用?

热门文章

  1. excel如何进行两张表的自动关联?---vlookup
  2. 苹果iOS 5限制应用本地存储问题
  3. Git常规配置与用法(记录,git配置文件在系统用户文件夹下)
  4. 红米4高配版_标注:2016060_官方线刷包_救砖包_解账户锁
  5. HTTP常见状态码404、400、500等对应的错误原因
  6. 刚体运动学-四元数插值
  7. Reinforcement Learning | 强化学习十种应用场景及新手学习入门教程
  8. 计算机学院篮球队介绍,计算机与信息学院男子篮球队荣获“抗疫杯”校篮球赛冠军采访纪实...
  9. 服务器系统关闭显卡加速,Windows Server2008 R2性能优化方法
  10. php获取本机IP地址