Pytorch-2
Tensor初识
我们发现,目前认识的几种数据表示:标量,向量,矩阵是有着联系的,标量可以组合成向量,向量可以组合成矩阵。那么,我们可否将它们看作是一种数据形式呢?答案是可以的,这种统一的数据形式,在 PyTorch 中我们称之为**张量 (Tensor)**。
Tensor的创建
直接创建
1 | torch.tensor(data, dtype=None, device=None, requires_grad=False) |
data是要传入的数据,可以传入list, tuple, numpy array, scalar等,均可以转为tensor
dtype是tensor的类型
device指定数据要返回的设备,暂时不用关注
requires_grad指定当前量是否需要在计算中保留对应的梯度信息在 PyTorch 中,只有当一个 Tensor 设置 requires_grad 为 True 的情况下,才会对这个 Tensor 以及由这个 Tensor 计算出来的其他 Tensor 进行求导,然后将导数值存在Tensor 的 grad 属性中,便于优化器来更新参数。
所以,你需要注意的是,把 requires_grad 设置成 true 或者 false 要灵活处理。如果是训
练过程就要设置为 true,目的是方便求导、更新参数。而到了验证或者测试过程,我们的
目的是检查当前模型的泛化能力,那就要把 requires_grad 设置成 Fasle,避免这个参数
根据 loss 自动更新。
从numpy创建
1 | torch.from_numpy(ndarray) |
创建特殊形式的Tensor
全零矩阵
1 | torch.zeros(size, dtype=None...) |
全1矩阵
1 | torch.ones(size, dtype=None...) |
单位矩阵
1 | torch.eye(size, dtype=None) |
随机矩阵
1 | torch.rand(size) |
torch.rand 用于生成数据类型为浮点型且维度指定的随机 Tensor,随机生成的浮点数据在 0~1 区间均匀分布。
torch.randn 用于生成数据类型为浮点型且维度指定的随机 Tensor,随机生成的浮点数的取值满足均值为 0、方差为 1 的标准正态分布。
torch.normal 用于生成数据类型为浮点型且维度指定的随机 Tensor,可以指定均值和标准差。
torch.randint 用于生成随机整数的 Tensor,其内部填充的是在[low,high) 均匀生成的随机整数。
Tensor的转换
int与tensor
1 | a = torch.Tensor(1) |
list与tensor
1 | a = [1, 2, 3] |
CPU与GPU的Tensor转换
1 | CPU->GPU: data.cuda() |
Tensor的常用操作
获取形状
1 | a = tensor.zero(2, 3, 5) |
a.numel()可以直接获得元素数量
维度转换&形状转换
permute函数或者transpose函数可以用来实现交换不同维度的数据
transpose每次只能转置两个维度
1 | x = x.permute(2, 1, 0) // 0维度和2维度换位置 |
view函数和reshape函数可以用来实现形状的转换
1 | x = x.reshape(2, 4) |
Tip: 如果之前用过形状转换等或者其他函数使得tensor存放的数据在内存中不连续,那么可以使用reshape函数
增减维度
unsqueeze和squeeze函数可以实现增减维度(需要指定增减的维度为1),否则返回原tensor
1 | y = x.squeeze(1) // 将x的第1维度删除 |
unsqueeze同理