深度学习之PyTorch基础语法
Tensor(张量)对象是一个维度任意的矩阵,在机器学习中作为主要输入输出数据类型使用。是PyTorch中运算的基本单位。
一个Tensor中所有元素的数据类型必须一致。 torch包含的数据类型和普通编程语言的数据类型类似,包含浮点型,有符号整型和无符号整形,这些类型既可以定义在CPU上,也可以定义在GPU上。
在使用Tensor数据类型时,可以通过dtype属性指定它的数据类型,device指定它的设备(CPU或者GPU)。
Tensor对象及其运算
通过device指定在GPU上定义变量后,可以在终端上通过nvidia-smi命令查看显存占用。torch还支持在CPU和GPU之间拷贝变量(张量)。

对Tensor执行算数运算符的运算时,是两个矩阵对应元素的运算。torch.mm执行的矩阵乘法的计算。

此外,还有一些具有特定功能的函数。torch.clamp起的是分段函数的作用,可用于去掉矩阵中过小或者过大的元素;torch.round将小数部分化整;torch.tanh计算双曲正切函数,该函数将数值映射到(0,1)之间。
创建tensor
除了直接从ndarray或list类型的数据中创建Tensor,PyTorch还提供了一些函数可直接创建数据,这类函数往往需要提供矩阵的维度。torch.arange和Python内置的range的使用方法基本相同,其第3个参数是步长。torch.linspace第3个参数指定返回的个数。torch.ones返回全1,torch.zeros返回全0矩阵。

torch.rand返回从[0,1]之间的均匀分布采样的元素所组成的矩阵,torch.randn返回从正态分布采样的元素所组成的矩阵。torch.randint返回指定区间的均匀分布采样的随机整数所生成的矩阵。

Tensor的索引和切片
Tensor支持基本的索引和切片操作,不仅如此,它还支持ndarray中的高级索引(整数索引和布尔索引)操作。


Tensor支持基本的索引和切片操作,不仅如此,它还支持ndarray中的高级索引(整数索引和布尔索引)操作。


torch.where(condition, x, y)判断condition的条件是否满足,当某个元素满足,则返回对应矩阵x相同位置的元素,否则返回矩阵y的元素。

Tensor的变换、拼接和拆分
PyTorch提供了大量的对Tensor进行操作的函数或方法,这些函数内部使用指针实现对矩阵的形状变换,拼接,拆分等操作,使得我们无须关心Tensor在内存的物理结构或者管理指针就可以方便且快速的执行这些操作。Tensor.nelement(),Tensor.ndimension(),ndimension.size()可分别用来查看矩阵元素的个数,轴的个数以及维度,属性Tensor.shape也可以用来查看Tensor的维度。

在PyTorch中,Tensor.reshape和Tensor.view都能被用来更改Tensor的维度。它们的区别在于,Tensor.view要求Tensor的物理存储必须是连续的,否则将报错,而Tensor.reshape则没有这种要求。但是,Tensor.view返回的一定是一个索引,更改返回值,则原始值同样被更改,Tensor.reshape返回的是引用还是拷贝是不确定的。它们的相同之处都接收要输出的维度作为参数,切输出的矩阵元素个数不能改变,可以在维度中输入-1,PyTorch会自动推断它的数值。

torch.squeeze和torch.unsqueeze用来给Tensor去掉和添加轴。torch.squeeze去掉维度为1的轴,而torch.unsqueeze用于给Tensor的指定位置添加一个维度为1的轴

torch.t和torch.transpose用于转置二维矩阵。这两个函数只接收二维Tensor,torch.t是torch.transpose的简化版。

对于高维度Tensor,可以使用permute方法来变换维度。

PyTorch提供了torch.cat和torch.stack用于拼接矩阵,不同的是,torch.cat在已有的轴dim上拼接矩阵,给定轴的维度可以不同,而其他轴的维度必须相同。torch.stack在新的轴上拼接,它要求被拼接的矩阵所有维度都相同。


除了拼接矩阵,PyTorch还提供了torch.split和torch.chunk用于拆分矩阵。它们的不同之处在于,torch.split传入的是拆分后每个矩阵的大小,可以传入list,也可以传入整数,而torch.chunk传入的是拆分的矩阵个数。


PyTorch的Reduction操作
Reduction运算的特点是它往往对一个Tensor内的元素做归约操作,比如torch.max找极大值,torch.cumsum计算累加,它还提供了dim参数来指定沿矩阵的哪个维度执行操作。



将Tensor的requires_grad属性设置为True时,PyTorch的torch.autograd会自动的追踪它的计算轨迹,当需要计算微分的时候,只需要对最终计算结果的Tensor调用backward方法,中间所有计算结点的微分就会被保存在grad属性中了。


更多推荐


所有评论(0)