深度学习Pytorch-Tensor的属性、算术运算
@TOC
微信公众号:数学建模与人工智能
Tensor的属性
每一个Tensor对象都有以下几个属性:torch.dtype、torch.device和torch.layout
1、torch.dtype属性标识了torch.Tensor的数据类型。
2、torch.device属性标识了torch.Tensor对象在创建之后所存储在的设备名称。
torch.device包含了两种设备类型 (‘cpu’ 或者 ‘cuda’) ,分别标识将Tensor对象储存于cpu内存或者gpu内存中,同时支持指定设备编号,比如多张gpu,可以通过gpu编号指定某一块gpu。 如果没有指定设备编号,则默认将对象存储于current_device()当前设备中;
举个例子, 一个torch.Tensor对象构造函数中的设备字段如果填写’cuda’,那等价于填写了’cuda:X’,其中X是函数 torch.cuda.current_device()的返回值。在torch.Tensor对象创建之后,可以通过访问torch.device属性实时访问当前对象所存储在的设备名称。构造torch.device可以通过字符串/字符串和设备编号。
3、torch.layout属性标识了torch.Tensor在内存中的布局模式。
现在, 我们支持了两种内存布局模式 torch.strided (dense Tensors) 和尚处试验阶段的torch.sparse_coo (sparse COO Tensors, 一种经典的稀疏矩阵存储方式)。
torch.strided 跨步存储代表了密集张量的存储布局方式,当然也是最常用最经典的一种布局方式。 每一个strided tensor都有一个与之相连的torch.Storage对象, 这个对象存储着tensor的数据。这些Storage对象为tensor提供了一种多维的, 跨步的(strided)数据视图。这一视图中的strides是一个interger整形列表:这个列表的主要作用是给出当前张量的各个维度的所占内存大小,严格的定义就是,strides中的第k个元素代表了在第k维度下,从一个元素跳转到下一个元素所需要跨越的内存大小。 跨步这个概念有助于提高多种张量运算的效率。
Tensor创建实例:
1 | |
稀疏张量实例:
1 | |
Tensor的算术运算
- 哈达玛积(element wise,对应元素相乘)
- 二维矩阵乘法运算操作包括torch.mm()、torch.matmul()、@
- 对于高维的Tensor(dim>2),定义其矩阵乘法仅在最后的两个维度上,要求前面的维度必须保持一致,就像矩阵的索引一样并且运算操作只有torch.matmul()
算术运算实例:add加法、sub减法、mul哈达玛积(乘法)、div除法
1 | |

矩阵运算:
1 | |
幂运算pow、指数运算exp、对数运算log、开根号sqrt
1 | |

Pytorch中的in-place操作
- “就地”操作,即不允许使用临时变量。
- 也称为原味操作。
- x=x+y
- add_、sub_、mul_等等
Pytorch中的广播机制
- 广播机制:张量参数可以自动扩展为相同大小
- 广播机制需要满足两个条件:
1.每个张量至少有一个维度
2.满足右对齐
A.ndim == B.ndim, 并且A.shape和B.shape对应位置的元素要么相同要么其中一个是1
1 | |

Tensor的取整/取余运算
1 | |
Tensor的比较运算
1 | |
Tensor的取前k个大/前k小/第k小的数值及其索引
1 | |
1 | |


1 | |

Tensor判定是否为finite/inf/nan
- torch.isfinite(tensor)/torch.isinf(tensor)/torch.isnan(tensor)
- 返回一个标记元素是否为finite/inf/nan的mask张量(有界,无界,nan)