Pytorch 编程的一些坑


import torch.tensor as Tensor
tensor = Tensor.randn(10)

数据复制

tensor对象与numpy对象的数据转换

  1. 共享内存:

    • tensor -> numpy: tensor.numpy()
    • numpy -> tensor: Tensor.from_numpy()
  2. 不共享内存:

    • tensor -> numpy: tensor.clone().numpy()
    • numpy -> tensor: tensor.from_numpy(array.copy())

tensor 对象之间的复制

  1. 共享内存:tensor.detach(),从计算图中分离,不计算梯度
  2. 不共享内存:tensor.clone(),是否计算梯度,看原 tensor 的配置
  3. Deprecated 不共享内存:tensor(),是否计算梯度,看构造函数的传参

cpugpu 的转换

  • 拷贝到 GPU:tensor.cuda()
  • 转换到 GPU:tensor.to()

Tensor类与tensor对象的操作

tensor中获取元素

  1. 下标访问得到一个 0-dimscalar
  2. 使用下标访问 + item() 得到元素的值
  3. 单元素 tensor 也可以使用 item()

整数类型除法

计算数据类型为 Tensor.uint8, Tensor.int8, Tensor.int16, Tensor.int32, Tensor.int64 或者张量类型为 Tensor.CharTensor, Tensor.ShortTensor, Tensor.IntTensor, Tensor.LongTensor 的浮点数类型除法时,使用 Tensor.true_divide(tensor1, tensor2)

Tensor 构造的 Tensor.Size 问题

  1. Tensor.tensor(3.14159) , size: torch.Size([]) ~ scalar 单元素 tensor
  2. Tensor.tensor([]), size: torch.Size([0]) ~ 空
  3. Tensor.tensor([1, 2]), size: torch.Size([2]) ~ tensor
  4. Tensor.Tensor(1, 2), size: torch.Size([1, 2]) ~ 规定tensor大小的初始化方式

综合,传入一个list,两种构造方法都是将list转换成一个tensor
传入数字,Tensor.tensor只接受单个数字用于构造scalarTensor.Tensor用于构造对应大小Tensor

tensor 的大小改变

  1. tensor.view() 创造一个共享内存的新 tensor
  2. tensor.squeeze(), tensor.unsqueeze() 减少、添加一个维度,创造一个共享内存的新 tensor
  3. tensor.resize() 如果新分配空间大小小于原空间,保留数据不删除

tensor 的索引

  1. tensor[0:1, :2], size: torch.Size([1, 2]); tensor[0, :2], size: torch.Size([2])

  2. None 相当于 np.newaxis,新增一个轴:tensor[None].shape, size: torch.Size([1, 10])


文章作者: 一汪白水
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 一汪白水 !
  目录