memo: PyTorch | Tensor Ops

Table of contents

import torch 就是导入pytorch。Python中的torch就是pytorch,所以这里不是import pytorch,而是import torch 也合理。

torch.Tensor

  • 包含单一数据类型元素的多维矩阵
  • 有10种张量类型,torch.Tensor是默认张量类型torch.FloatTensor的别名

Note 张量变异方法都带有下划线后缀,它们直接原地修改原张量的属性,而不派生新张量。例如torch.FloatTensor.abs_()直接计算并修改原张量,而torch.FloatTensor.abs()在新张量中计算结果。

Tensors

Operation on Tensors

张量有100多种运算,这些运算在GPU上运行比在CPU上快。可使用张量的.to方法转移到GPU上,对大张量的移动需要花费很多时间和内存。

张量的索引和切片与Numpy很像。

tensor[...,-1]tensor[:,-1] 都表示取张量的最后一列

Creation Ops

torch.tensor(data)

  • 是一个构造器construtor
  • 复制data, 构造一个张量
  • 当data是一个张量x时,这种方法等效于x.clone().detach():创建新的leaf 张量,并不在当前计算图中
  • 如果仅希望改变requires_grad标志,使用requires_grad_()detach()方法来避免复制数据。如果data是ndarry,使用torch.as_tensor()创建张量,不复制数据。

torch.tensor.requires_grad_()

  • 把该张量的属性requires_grad 置为True
  • 有的张量是从DataLoader中来的,需要做一些预处理,再开始让autograd开始记录这个张量上的操作
  • 在原地修改,不需创建新变量,没有复制

torch.tensor.detach()

  • 创建一个新张量,与原张量指向同一块内存,但不允许修改二者的size/stride/storage,否则报错
  • 新张量从当前计算图中分离,不需计算梯度
  • 没有复制

torch.as_tensor()

  • 把data转换为tensor
  • torch.tensor 不同,这种创建方式尽量避免复制数据(指向同一块内存)
  • 如果data是ndarry(或tensor),并且它的dtypedevice都与目标输出对应一致,那么就不会复制数据,而是新张量和data共同指向那块内存,改变张量,原data也会改变。
  • 当data是list, tuple, scalar 或其他array_like的数据,或者dtype不一致,或者device不一样,都会复制数据创建新tensor。

torch.sparse COO tensors

  • 一种存储形式: tensor is stored as 2 tensor: indices and values
  • indices are coordinate in tensor
  • Reduce memory consumption
  • Strided tensor stores each elements, while COO tensor only record non-zero numbers.

torch.as_strided()

  • 创建一个窗口view,对底层连续的(一维)数据重新排列(“裁剪”)
  • 输入一个张量,指定输出张量的size和每个维度跳跃的步长stride。
  • 对于
    1
    2
    
    x = torch.randn(3,5,5)    #三维张量,一共125个数据
    t = torch.as_strided(x, (3,3,3), (5,3,1)) #输出一个(3,3,3)的张量,最低维度的起点从第一个数开始,跳跃步长为1,倒数第2维度的每个起点,跳跃步长为3,最高维度的每个起点间隔步长为5。
    
    根据size和stride可以判断内存上是否连续。对pytorch中Tensor的剖析

torch.from_numpy(ndarray)

  • 新张量与ndarry共享同一块内存,但此张量不能修改size

Reverse a dim, e.g. from bottom to top, or from right to left.

1
xy = torch.flip(xy, [1]) # to match the code
Built with Hugo
Theme Stack designed by Jimmy