文章目录

  • 前言
  • 1 创建Tensor
  • 2 操作
    • 2.1 算术操作
    • 2.2 索引
    • 2.3 改变形状
    • 2.4 线性代数
  • 3 广播机制
  • 4 运算的内存开销
  • 5 Tensor和NumPy相互转换
    • 5.1 Tensor`转NumPy
    • 5.2 NumPy数组转Tensor
  • 6 Tensor on GPU

前言

在深度学习中,我们通常会频繁地对数据进行操作。作为动手学深度学习的基础,本节将介绍如何对内存中的数据进行操作。

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。

"tensor"这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量。

1 创建Tensor

我们先介绍Tensor的最基本功能,即Tensor的创建。

首先导入PyTorch:

然后我们创建一个5x3的未初始化的Tensor

输出:

创建一个5x3的随机初始化的Tensor:

输出:

创建一个5x3的long型全0的Tensor:

输出:

还可以直接根据数据创建:

输出:

还可以通过现有的Tensor来创建,此方法会默认重用输入Tensor的一些属性,例如数据类型,除非自定义数据类型。

输出:

我们可以通过shape或者size()来获取Tensor的形状:

输出:

注意:返回的torch.Size其实就是一个tuple, 支持所有tuple的操作。

还有很多函数可以创建Tensor,去翻翻官方API就知道了,下表给了一些常用的作参考。

函数 功能
Tensor(*sizes) 基础构造函数
tensor(data,) 类似np.array的构造函数
ones(*sizes) 全1Tensor
zeros(*sizes) 全0Tensor
eye(*sizes) 对角线为1,其他为0
arange(s,e,step) 从s到e,步长为step
linspace(s,e,steps) 从s到e,均匀切分成steps份
rand/randn(*sizes) 均匀/标准分布
normal(mean,std)/uniform(from,to) 正态分布/均匀分布
randperm(m) 随机排列

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

2 操作

本小节介绍Tensor的各种操作。

2.1 算术操作

在PyTorch中,同一种操作可能有很多种形式,下面用加法作为例子。

  • 加法形式一

  • 加法形式二

    还可指定输出:

  • 加法形式三、inplace

    注:PyTorch操作inplace版本都有后缀_, 例如x.copy_(y), x.t_()

以上几种形式的输出均为:

2.2 索引

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

输出:

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

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

这里不详细介绍,用到了再查官方文档。

2.3 改变形状

view()来改变Tensor的形状:

输出:

注意view()返回的新Tensor与源Tensor虽然可能有不同的size,但是是共享data的,也即更改其中的一个,另外一个也会跟着改变。(顾名思义,view仅仅是改变了对这个张量的观察角度,内部数据并未改变)

输出:

所以如果我们想返回一个真正新的副本(即不共享data内存)该怎么办呢?Pytorch还提供了一个reshape()可以改变形状,但是此函数并不能保证返回的是其拷贝,所以不推荐使用。推荐先用clone创造一个副本然后再使用view。参考此处

输出:

使用clone还有一个好处是会被记录在计算图中,即梯度回传到副本时也会传到源Tensor

另外一个常用的函数就是item(), 它可以将一个标量Tensor转换成一个Python number:

输出:

2.4 线性代数

另外,PyTorch还支持一些线性函数,这里提一下,免得用起来的时候自己造轮子,具体用法参考官方文档。如下表所示:

函数 功能
trace 对角线元素之和(矩阵的迹)
diag 对角线元素
triu/tril 矩阵的上三角/下三角,可指定偏移量
mm/bmm 矩阵乘法,batch的矩阵乘法
addmm/addbmm/addmv/addr/baddbmm… 矩阵运算
t 转置
dot/cross 内积/外积
inverse 求逆矩阵
svd 奇异值分解

PyTorch中的Tensor支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等,可参考官方文档。

3 广播机制

前面我们看到如何对两个形状相同的Tensor做按元素运算。当对两个形状不同的Tensor按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。例如:

输出:

由于xy分别是1行2列和3行1列的矩阵,如果要计算x + y,那么x中第一行的2个元素被广播(复制)到了第二行和第三行,而y中第一列的3个元素被广播(复制)到了第二列。如此,就可以对2个3行2列的矩阵按元素相加。

4 运算的内存开销

前面说了,索引操作是不会开辟新内存的,而像y = x + y这样的运算是会新开内存的,然后将y指向新内存。为了演示这一点,我们可以使用Python自带的id函数:如果两个实例的ID一致,那么它们所对应的内存地址相同;反之则不同。

如果想指定结果到原来的y的内存,我们可以使用前面介绍的索引来进行替换操作。在下面的例子中,我们把x + y的结果通过[:]写进y对应的内存中。

我们还可以使用运算符全名函数中的out参数或者自加运算符+=(也即add_())达到上述效果,例如torch.add(x, y, out=y)y += x(y.add_(x))。

注:虽然view返回的Tensor与源Tensor是共享data的,但是依然是一个新的Tensor(因为Tensor除了包含data外还有一些其他属性),二者id(内存地址)并不一致。

5 Tensor和NumPy相互转换

我们很容易用numpy()from_numpy()Tensor和NumPy中的数组相互转换。但是需要注意的一点是:
这两个函数所产生的的Tensor和NumPy中的数组共享相同的内存(所以他们之间的转换很快),改变其中一个时另一个也会改变!!!

还有一个常用的将NumPy中的array转换成Tensor的方法就是torch.tensor(), 需要注意的是,此方法总是会进行数据拷贝(就会消耗更多的时间和空间),所以返回的Tensor和原来的数据不再共享内存。

5.1 Tensor`转NumPy

使用numpy()Tensor转换成NumPy数组:

输出:

5.2 NumPy数组转Tensor

使用from_numpy()将NumPy数组转换成Tensor:

输出:

所有在CPU上的Tensor(除了CharTensor)都支持与NumPy数组相互转换。

此外上面提到还有一个常用的方法就是直接用torch.tensor()将NumPy数组转换成Tensor,需要注意的是该方法总是会进行数据拷贝,返回的Tensor和原来的数据不再共享内存。

输出

6 Tensor on GPU

用方法to()可以将Tensor在CPU和GPU(需要硬件支持)之间相互移动。

pytorch学习笔记(一):Tensor(张量)相关推荐

  1. pytorch线性回归代码_[PyTorch 学习笔记] 1.3 张量操作与线性回归

    本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/linear_regression.py 张量的操作 拼 ...

  2. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  3. pytorch 学习笔记目录

    1 部分内容 pytorch笔记 pytorch模型中的parameter与buffer_刘文巾的博客-CSDN博客 pytorch学习笔记 torchnn.ModuleList_刘文巾的博客-CSD ...

  4. Pytorch学习笔记总结

    往期Pytorch学习笔记总结: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 Pytorch系列目录: PyTorch学习笔记( ...

  5. PyTorch学习笔记(二):PyTorch简介与基础知识

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  6. PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard

    文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...

  7. 1.pytorch 学习笔记--Getting stared

    pytorch 学习笔记–Getting stared 1.什么是pytorch Pytorch 是一个基于Python的科学计算包,主要面向以下人群: 替代numpy以使用GPU做计算加速 一个深度 ...

  8. PyTorch学习笔记(六)——Sequential类、参数管理与GPU

    系列文章\text{\bf 系列文章}系列文章 PyTorch学习笔记(一)--Tensor的基础语法 PyTorch学习笔记(二)--自动微分 PyTorch学习笔记(三)--Dataset和Dat ...

  9. 深度学习入门之PyTorch学习笔记:多层全连接网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 3.1 PyTorch基础 3.2 线性模型 3.2.1 问题介绍 3.2.2 一维线性回归 3.2 ...

  10. 深度学习入门之PyTorch学习笔记:深度学习框架

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 2.1 深度学习框架介绍 2.1.1 TensorFlow 2.1.2 Caffe 2.1.3 Theano 2.1.4 ...

最新文章

  1. 都2021年了,你还在用Jenkins?赶快看看这些替代方案吧!
  2. java多线程如何设置优先级
  3. python处理数据的优势-Python 的优势在哪里?
  4. 建设私有云需要注意哪些问题?
  5. Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向...
  6. JVM:内存划分总结
  7. 分享SSRF漏洞的学习和利用
  8. ASP.NET三层架构之不确定查询参数个数的查询
  9. centos7上systemd详解
  10. 长链剖分:O(nlogn)预处理O(1)求kth祖先
  11. 六、pink老师学习笔记——CSS三角形之美 margin负值之美文字围绕浮动元素行内块元素布局的巧妙运用
  12. 方格取数(信息学奥赛一本通-T1277)
  13. 2016-8-4学习正则表达式
  14. 想买个这样的笔记本电脑
  15. 时频分析方法及其在发展性EEG数据中的应用
  16. Matlab求加权平均数,MATLAB Accumarray加权平均值
  17. 详解二叉树的递归遍历与非递归遍历
  18. 日语中单词后面1,2,3,4,5是什么意思
  19. 大衣哥在《火火的情怀》后,和孟文豪张成军推出《新时代的农民》
  20. 给实体机服务器重装Linux系统全记录

热门文章

  1. linux常用的日志分析脚本
  2. 2014图灵技术图书最受欢迎TOP15
  3. Rect 的相关操作
  4. urlconnection.connect()和url.openconnection()的区别
  5. FAQ from CSDN
  6. 抢购 mysql 优化_处理抢购、秒杀应用场景降低“超卖”发生几个优化方案(php)...
  7. 3.1.1 Spring 简介
  8. use redis instance in docker hub
  9. 解决Ajax中IE浏览器缓存问题
  10. Required String parameter 'images' is not present