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),并且它的
dtype和device都与目标输出对应一致,那么就不会复制数据,而是新张量和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。
- 对于
根据size和stride可以判断内存上是否连续。对pytorch中Tensor的剖析
1 2x = torch.randn(3,5,5) #三维张量,一共125个数据 t = torch.as_strided(x, (3,3,3), (5,3,1)) #输出一个(3,3,3)的张量,最低维度的起点从第一个数开始,跳跃步长为1,倒数第2维度的每个起点,跳跃步长为3,最高维度的每个起点间隔步长为5。
torch.from_numpy(ndarray)
- 新张量与ndarry共享同一块内存,但此张量不能修改size
Reverse a dim, e.g. from bottom to top, or from right to left.
|
|