参考:

PyTorch中文文档

PyTorch 学习笔记汇总


1 张量Tensor的结构

在 PyTorch 0.4.0 之后,Tensor包含以下属性:

  • data:Tensor的值;
  • grad:data 的梯度;
  • grad_fn:创建 Tensor 所使用的 Function,是自动求导的关键,因为根据所记录的函数才能计算出导数;
  • requires_grad:是否需要梯度,并不是所有的张量都需要计算梯度;
  • is_leaf:是否叶子节点(张量),叶子节点的概念在计算图中会用到;
  • dtype:张量的数据类型,如 torch.FloatTensor,torch.cuda.FloatTensor;
  • shape:张量的形状(各维度的长度);
  • device:张量所在设备(CPU/GPU),可以进行切换。

2 Tensor的使用

创建

· 直接创建 torch.tensor
1
torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)

dtype:数据类型,默认与data一致;

pin_memory:是否存于锁页内存。

· 共享内存 torch.from_numpy
1
2
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)

修改数组arr,张量t也会被修改。

· torch.zeros 、torch.ones:指定形状,创建全为0、1的张量
1
torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

size:张量的形状;

out:输出的张量,如果指定了out,那么返回的张量和out指向的是同一个地址;

layout:内存中布局形式,有strided,sparse_coo等。当是稀疏矩阵时,设置为sparse_coo可以减少内存占用。

· torch.zeros_like、torch.ones_like:根据输入数据的形状,创建全为0、1的张量
1
torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False, memory_format=torch.preserve_format)
· torch.full、torch.full_like:指定形状和数值,创建全为指定数值的张量
1
torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

fill_value:张量中每一个元素的值。

· torch.arrage:创建1维等差张量
1
torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

start:数列起始值;

end:数列结束值,开区间,取不到结束值;

step:公差,默认为 1。

· torch.linspace:创建对区间等分的1维张量
1
torch.linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

start:数列起始值;

end:数列结束值;

step:数列长度。(元素个数)

· torch.logspace:创建对区间对数等分的1维张量
1
torch.logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

start:数列起始值;

end:数列结束值;

step:数列长度;(元素个数)

base:对数函数的底,默认为 10。

· torch.eye:创建单位对角矩阵(2 维张量)
1
torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

n:矩阵行数。通常只设置 n,为方阵;

m:矩阵列数。

根据概率创建Tensor

· torch.normal:生成正态分布 (高斯分布)
1
torch.normal(mean, std, *, generator=None, out=None)
· torch.randn和torch.randn_like:生成标准正态分布
1
torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
· torch.rand和torch.rand_like:在区间[0, 1)上生成均匀分布
1
torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
· torch.randint和torch.randint_like:在指定区间上生成整数均匀分布
1
2
randint(low=0, high, size, *, generator=None, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)
· torch.randperm:生成从0到n-1的随机排列,常用于生成索引
1
torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)
· torch.bernoulli:以input为概率,生成伯努利分布(0-1 分布,两点分布)
1
torch.bernoulli(input, *, generator=None, out=None)

input:概率值

拼接

· torch.cat:将张量按照dim维度进行拼接
1
torch.cat(tensors, dim=0, out=None)

tensors:张量序列。

1
2
3
t = torch.ones((2, 3))
t_0 = torch.cat([t, t], dim=0)
t_1 = torch.cat([t, t], dim=1)
· torch.stack:将张量在新创建的dim维度上进行拼接
1
torch.stack(tensors, dim=0, out=None)

切分

· torch.chunk:将张量按照维度dim进行平均切分
1
torch.chunk(input, chunks, dim=0)

将张量按照维度dim进行平均切分。若不能整除,则最后一份张量小于其他张量。

· torch.split:将张量按照dim维度进行平均切分

1
torch.split(tensor, split_size_or_sections, dim=0)

将张量按照维度dim进行平均切分。可以指定每一个分量的切分长度。

split_size_or_sections:为int时,表示每一份的长度,如果不能被整除,则最后一份张量小于其他张量;为list时,按照list元素作为每一个分量的长度切分。如果list元素之和不等于切分维度(dim)的值,就会报错;

索引

· torch.index_select:取出指定的数据
1
torch.index_select(input, dim, index, out=None)

在维度 dim 上,按照 index 索引取出数据拼接为张量返回。

· torch.mask_select:取出指定的数据
1
torch.masked_select(input, mask, out=None)

按照mask中的True进行索引拼接得到一维张量返回,mask于input同形状,mask为布尔类型张量。

变换

· torch.reshape:变换张量的形状
1
torch.reshape(input, shape)

当张量在内存中是连续时,返回的张量和原来的张量共享数据内存,改变一个变量时,另一个变量也会被改变。

· torch.transpose:交换张量的两个维度
1
torch.transpose(input, dim0, dim1)
· torch.t:转置二维张量
1
torch.t() = torch.transpose(input, 0, 1)
· torch.squeeze:压缩长度为 1 的维度
1
torch.squeeze(input, dim=None, out=None)

dim:若为None,则移除所有长度为1的维度;若指定维度,则当且仅当该维度长度为1时可以移除。

· torch.unsqueeze:根据dim扩展维度
1
torch.unsqueeze(input, dim)

数学运算

· torch.add:加
1
2
torch.add(input, other, out=None)
torch.add(input, other, *, alpha=1, out=None)

逐元素计算input + alpha * other。因为在深度学习中经常用到先乘后加的操作。

· torch.mul:乘
1
torch.mul(input, b, out=None)

将input与b相乘,b可以为标量或者张量(总元素数目需要一致)。

· torch.mean:计算均值

1
torch.mean(input, dim, out=None)

返回输入张量指定维度上的均值。

· torch.addcdiv
1
torch.addcdiv(input, tensor1, tensor2, *, value=1, out=None)

out = input + value × tensor1/tensor2.

· torch.addcmul
1
torch.addcmul(input, tensor1, tensor2, *, value=1, out=None)

out = input + value × tensor1 × tensor2.