本文始发于我的公众号:TechFlow,原创不易,求个关注web
今天是Pytorch专题的第二篇,咱们继续来了解一下Pytorch中Tensor的用法。api
上一篇文章当中咱们简单介绍了一下如何建立一个Tensor,今天咱们继续深刻Tensor的其余用法。数组
咱们能够用size()函数或者直接调用tensor当中的shape属性获取一个tensor的大小,这二者是等价的,通常状况下咱们用前者多一些。并发
咱们能够经过view改变一个tensor的shape,它会根据咱们指定的shape返回一个新的tensor。机器学习
须要注意的是,view返回的是原数据的一个引用,也就是说咱们改变原数据,view出来的结果会一样发生变化。编辑器
在上面这个例子当中,咱们把原tensor x中的[0, 1]的位置修改为了2,咱们print y会发现y当中的元素一样发生了变化。函数
咱们能够用numel获取tenosr当中元素的数量:性能
咱们能够用squeeze来减小tensor的维度,而使用unsqueeze来增长一个tenor的维度。学习
其中unsqueeze接收一个参数,容许咱们指定咱们但愿增长的维度。咱们能够经过size明显看到数据的变化:spa
squeeze是减小维度,相比之下没有那么多操做,它会自动将长度是1的维度消除,若是没有一个维度长度是1,也就是说当前已是最简的形式,那么什么也不会变化。
也支持使用另外一个数组做为索引访问数据:
Tensor当中支持与Numpy数组相似的索引操做,语法也很是类似。和Numpy同样,索引获得的结果是原数据的引用,也就是说咱们修改其中一个,另外一个也会跟着发生变更。
它支持多维索引:
也支持切片:
也能够经过bool数组获取元素:
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 排版