PyTorch 张量(Tensor)介绍

介绍

张量(Tensor)同 Numpy 中的 ndarray 一样,是一种数据存储结构,在整个 PyTorch 运行过程中,作为输入、输出以及神经网络的参数使用。区别于 Numpy,主要有以下两点:

1:支持 GPU 运算
2:支持自动求导

我们之前接触过

  • Scalar
  • Vector
  • Matrix

对于更复杂的数据结构,我们需要更高维的数据结构来支持,如:图像,视频等,我们把表示这些高维数据结构就叫做张量。更广泛一点,可以将上述类型也视为不同维度的张量

类型 对应 说明
Scalar 0维张量 标量就是一个数字
Vector 1维张量 向量
Martix 2维张量 矩阵

image.png

初始化

在 PyTorch 中,张量通过torch.Tensor来表示,我们可以通过多种方式来创建 tensor

1. 直接创建

torch.tensor(data, *, dtype=None, device=None, requires_grad=False, pin_memory=False) → Tensor

data 可以是

  • list
  • tuple
  • scalar

等多种类型,可以指定类型,也可以由程序自动推导

Screen Shot 2021-10-11 at 22.26.24.png

2. 通过专有的方法

PyTorch 同 Numpy 一样,提供了大量的快速创建数据的辅助方法

函数 功能
ones(*sizes) 全1
zeros(*sizes) 全0
eye(*sizes) 对角为1,其余为0
arange(s,e,step) 从s到e,步长为step
linspace(s,e,steps) 从s到e,均匀分成step份
rand/randn(*sizes) 随机数
normal(mean,std)/uniform(from,to) 正态分布/均匀分布
randperm(m) 随机排列

Screen Shot 2021-10-12 at 11.57.42.png

3. 通过 tensor

基于一个已经存在的 tensor 创建新的 tensor

image.png

4. 通过 Numpy

根据已有的 Numpy 数据来创建张量

image.png

属性

从张量属性中,我们可以知道维度,类型和设备

image.png

运算

1. 索引和切片

基本同Numpy操作

[行开始:行结束:步长, 列开始:列结束:步长]

  • 行开始、列开始不写默认为 0
  • 行结束、列结束不写默认为全部
  • 步长默认为 1

Screen Shot 2021-10-12 at 10.38.11.png

2. 数学计算

Pending

3. View

PyTorch 运行通过 View 来提供不同 Shape 的的数据,View 共享原 tensor 的数据
Screen Shot 2021-10-12 at 11.36.03.png

4. 广播

当两个 Shape 不一样的 Tensor 计算时在下列情况下会触发Broadcasting 机制,复制元素使两者的 Shape 相同后在计算。

image.png

  • 每个 tensor 至少有一维
  • 遍历所有的维度,从尾部维度开始,每个对应的维度大小要么相同,要么其中一个是 1,要么其中一个不存在

Screen Shot 2021-10-12 at 11.42.10.png

5. 连接

在给定维度上对不同的张量进行连接

torch.cat(inputs, dim=0) → Tensor

Screen Shot 2021-10-12 at 11.02.14.png

6. 切分

按给定的 size 切块,返回的是原 tensor 的 view

torch.split(tensor, ssplit_size_or_section, dim=0)

split_size_or_sections

  • int tensor 会被切分成等大的块,如果最后一块不足,则单独成一块
  • list(int) 会被切分成len(ssplit_size_or_section)块,每块大小根据ssplit_size_or_section指定

Screen Shot 2021-10-12 at 11.15.28.png

torch.chunk(input, chunks, dim=0) → List of Tensors

根chunks(int) 大小切分 tensor

Screen Shot 2021-10-12 at 11.23.40.png

7. 原地修改

PyTorch 的方法带有下划线的_的是原地修改,返回修改之后的tensor,而不带下划线的是返回新值,需要注意

Screen Shot 2021-10-12 at 10.56.04.png

转换

上面提到 tensor 可以由 Numpy 生成,这里再次总结下相互的转化

1. Tensor to Numpy

x = torch.rand(3, 4)
print(x)

y = x.numpy()
print(y)

2. Numpy to Tensor

x = np.random.rand(3, 4)
print(x)

y = torch.from_numpy(x)
print(y)

共享区域

特别需要注意的是:切块,转换、索引以及改变 Shap等,返回的是之前的 view,前后两者之前转换共享同一块内存区域,改变其中一个会改变另外一个值

  • Tensor 转 Numpy
    image.png

  • Numpy 转 Tensor

image.png

如果需要保持原有的数据不变,可以使用 reshape 和 clone,推荐使用 clone,因为clone 后的记录依然会保留在计算图中

Screen Shot 2021-10-11 at 23.39.39.png

参考



评论 (0)

Sign in to comment