PyTorch学习(1)——张量
参考:
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 | arr = np.array([[1, 2, 3], [4, 5, 6]]) |
修改数组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 | randint(low=0, high, size, *, generator=None, out=None, |
· 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 | t = torch.ones((2, 3)) |
· 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 | torch.add(input, other, 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.