本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是Pytorch专题的第二篇,我们继续来了解一下Pytorch中Tensor的用法。

上一篇文章当中我们简单介绍了一下如何创建一个Tensor,今天我们继续深入Tensor的其他用法

tensor操作

size()和shape

我们可以用size()函数或者直接调用tensor当中的shape属性获取一个tensor的大小,这两者是等价的,一般情况下我们用前者多一些。

view

我们可以通过view改变一个tensor的shape,它会根据我们指定的shape返回一个新的tensor

需要注意的是,view返回的是原数据的一个引用,也就是说我们改变原数据,view出来的结果会同样发生变化。

在上面这个例子当中,我们把原tensor x中的[0, 1]的位置修改成了2,我们print y会发现y当中的元素同样发生了变化。

numel

我们可以用numel获取tenosr当中元素的数量:

squeeze和unsqueeze

我们可以用squeeze来减少tensor的维度,而使用unsqueeze来增加一个tenor的维度

其中unsqueeze接收一个参数,允许我们指定我们希望增加的维度。我们可以通过size明显看到数据的变化:

squeeze是减少维度,相比之下没有那么多操作,它会自动将长度是1的维度消除,如果没有一个维度长度是1,也就是说当前已经是最简的形式,那么什么也不会变化。

也支持使用另一个数组作为索引访问数据:

Tensor索引

Tensor当中支持与Numpy数组类似的索引操作,语法也非常相似。和Numpy一样,索引得到的结果是原数据的引用,也就是说我们修改其中一个,另一个也会跟着发生变动。

它支持多维索引:

也支持切片:

也可以通过bool数组获取元素:

Tensor运算

Tensor当中有大量的运算api,我们只列举其中最常用的几种,剩下的使用频率不高,大家可以用到的时候再去查阅相应的文档。

加减乘除

Tensor当中支持好几种运算的方法,我们以加法为例来了解一下。首先支持通过符号直接运算:

第二种方法是我们可以调用torch当中的函数,比如加法的函数就是add。

如果使用torch当中的函数进行计算的话,它还支持out参数,允许我们传入一个tensor,它会将计算结果存储tensor当中。

除此之外,它还允许我们进行inplace操作,也就是在原tensor值的基础上直接修改,而不是通过函数值返回。和Numpy当中传入inplace参数的设计不同,Tensor当中是通过api区分的,在原函数名下增加一个下划线即是inplace的api,比如add的inplace方法是add_。

矩阵点乘

在机器学习领域当中,矩阵点乘是一个经常用到的操作。因为为了节省时间,我们通常会把样本和特征以及各类参数向量化,通过矩阵或者是向量点乘的形式来进行加权求和、线性变换等操作。所以矩阵点乘非常重要,必定会用到。

在Numpy当中我们通过dot函数来计算两个矩阵之间的内积,而在Tensor当中做了严格的区分,只有一维的向量才可以使用dot计算点乘,多维的向量只能使用matmul计算矩阵的乘法。为了简化,还可以使用mm来代替matmul。如果你学过TensorFlow的话,你会发现matmul是TensorFlow当中点乘的api,Pytorch当中沿用了这个命名。

可以看到,mm和matmul计算得到的结果是一致的。

类型转换

在Numpy当中,我们通过astype方法转换类型,而在Tensor当中将这个方法拆分,每一种类型都有自己的转化函数

比如我们想要将tensor转化成int类型,调用的是int()方法,想要转化成float类型调用的是float()方法。调用这些方法之后,会返回一个新的tensor。

Tensor当中定义了7种CPU类型和8种GPU类型:

我们可以调用内置函数将它们互相转化,这些转换函数有:long(), half(), int(), float(), double(), byte(), char(), short()。我相信这些函数的含义大家应该都可以理解。

转置与变形

Tensor当中的转置操作和Numpy中不太相同,在Numpy当中,我们通过.T或者是transpose方法来进行矩阵的转置。如果是高维数组进行转置,那么Numpy会将它的维度完全翻转。

而在Tensor当中区分了二维数组和高维数组,二维数组的转置使用的函数是t(),它的用法和.T一样,会将二维数组的两个轴调换。

如果是高维数组调用t函数会报错,如果我们要变换高维数组的形状,可以调用transpose和permute两个方法。先说transpose方法,它接收两个int型参数,表示需要调换的两个轴。比如一个形状是[4, 3, 2]的矩阵,我们可以通过0,1,2表示它的所有轴,传入两个,指定想要调换的两个轴:

而permute可以调换多个轴的位置,所以它接受的参数是一个int型的不定参数。我们传入我们希望得到的轴的顺序,Tensor会根据我们传入的轴的顺序对数据进行翻转:

另外,t和transpose支持inplace操作,而permute不行,这也是他们显著的区别之一。

设备之间移动

我们可以通过device这个属性看到tensor当前所在的设备:

我们可以通过cuda函数将一个在CPU的tensor转移到GPU,但是不推荐这么干。比较好的办法是使用to方法来进行设备转移

将tensor转移到GPU上进行计算可以利用GPU的并发性能提升计算的效率,这是Pytorch当中常用的手段。to方法不仅可以改变tensor的设备,还可以同时变更tensor当中元素的类型:

总结

虽然tensor拥有许多额外的功能和计算函数,但是tensor的意义并不仅仅如此。最重要的是,它可以提升我们的计算速度。这当中的原理也很简单,因为在Python的List当中,每一个元素其实都是一个对象。即使我们存储的是一个int或者是float,Python都会将它们封装成一个对象,这会带来额外的开销。如果只是少量的数据影响不大,如果是上百万甚至是更大的量级,那么两者的差距就会非常大。另外一点就是tensor库的底层也是C和C++,运行效率显然Python更高。所以我们不能简单地把它理解成一个计算包,对于深度学习来说,它并不仅仅只是计算。

Tensor当中还有许多其他的方法,这其中许多实用频率很低加上篇幅的限制,我们不能一一穷尽,大家只需要对Tensor库整体有一个映像,一些具体的使用方法和细节可以用到的时候再进行查询。

本文基于滴滴云GPU完成,租借滴滴云GPU,使用滴滴云AI大师码2323,享受9折优惠。

如果喜欢本文,可以的话,请点个关注,给我一点鼓励,也方便获取更多文章。

本文使用 mdnice 排版

Pytorch | 详解Pytorch科学计算包——Tensor的更多相关文章

  1. [转载]Pytorch详解NLLLoss和CrossEntropyLoss

    [转载]Pytorch详解NLLLoss和CrossEntropyLoss 来源:https://blog.csdn.net/qq_22210253/article/details/85229988 ...

  2. Python科学计算包模块的安装(ubuntu)

    Python的科学计算包设计到C语言代码的编译,采用pip的方式安装会出现错误. 一种简单的方式是采用的集成包,具体的步骤参考:https://www.continuum.io/downloads#_ ...

  3. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  4. Python下科学计算包numpy和SciPy的安装

    转载自:http://blog.sina.com.cn/s/blog_62dfdc740101aoo6.html Python下大多数工具包的安装都很简单,只需要执行 “python setup.py ...

  5. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  6. Windows下安装python的scipy等科学计算包(转)

    如果要使用python进行科学计算.数据分析等,一定要安装scipy.seaborn.numpy等等包. 但Windows下安装python的第三方库经常会出现问题.此前,已介绍过Windows下如何 ...

  7. Java axis2.jar包详解及缺少jar包错误分析

    Java  axis2.jar包详解及缺少jar包错误分析 一.最小开发jar集 axis2 开发最小jar包集: activation-1.1.jar axiom-api-1.2.13.jar ax ...

  8. 动态可视化 数据可视化之魅D3,Processing,pandas数据分析,科学计算包Numpy,可视化包Matplotlib,Matlab语言可视化的工作,Matlab没有指针和引用是个大问题

    动态可视化 数据可视化之魅D3,Processing,pandas数据分析,科学计算包Numpy,可视化包Matplotlib,Matlab语言可视化的工作,Matlab没有指针和引用是个大问题 D3 ...

  9. Python的科学计算包matplotlib setup

    回想起大学四年 专业一直使用matlab,然而我却没在PC上装成功过,以前懒于思考这种数学工具的作用,直到最近,大学同学研究生要毕业了,几经交流,和自己阅读了一些机器学习的教材之后,发觉科学计算包和画 ...

随机推荐

  1. java实现第六届蓝桥杯立方体自身

    立方变自身 题目描述 观察下面的现象,某个数字的立方,按位累加仍然等于自身. 1^3 = 1 8^3 = 512 5+1+2=8 17^3 = 4913 4+9+1+3=17 - 请你计算包括1,8, ...

  2. java实现第四届蓝桥杯核桃的数量

    核桃的数量 题目描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 各组的核桃数量必须相同 各组内必须能平分核桃( ...

  3. Linux 日志轮替

    日志轮替包括两个方面的内容:切割日志文件,轮换日志文件 日志文件的命令规则 如果配置文件中有dateext参数,那么日志文件的后缀会是日期,例如:yum.log-20200424,这样,文件名不会重叠 ...

  4. 循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

    在我们使用VUE+Element 处理界面的时候,往往碰到需要利用JS集合处理的各种方法,如Filter.Map.reduce等方法,也可以设计到一些对象属性赋值等常规的处理或者递归的处理方法,以前对 ...

  5. 在MyEclipse中设置jdk

    在MyEclipse中设置jdk的三处地方:1 选中项目右键菜单properties -->java Compiler 2 windows菜单中Preferences-->myeclips ...

  6. python常用模块-os

    得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录 ...

  7. JVM进阶之路(一)

    JVM是Java程序运行的基本,了解Java程序的运行原理绝对有必要了解JVM的内容,JVM的内容其实很多,而且版本不同,其中的内容也很多不同,接下来就通过几篇文章来慢慢讲述JVM的内容. 一.Jvm ...

  8. http的几种请求方法

    1.HTTP请求方法有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE和CONNECT. GET GET请求会显示请求指定的资源.一般来说GET方法应该只用于 ...

  9. Python 发送 email 的两种方式

    Python发送email的两种方式,分别为使用登录邮件服务器.调用sendmail命令来发送三种方法 Python发送email比较简单,可以通过登录邮件服务来发送,linux下也可以使用调用sen ...

  10. [实战] Flutter 上的内存泄漏监控

    一.前言 Flutter 所使用的 Dart 语言具有垃圾回收机制,有垃圾回收就避免不了会内存泄漏. 在 Android 平台上有个内存泄漏检测工具 LeakCanary, 它可以方便地在 debug ...