PyTorch基本使用
00 min
2024-4-23
默认执行代码 import tensor import numpy as np

1. 张量对象(Tensor)

1.1 创建张量的方法

  1. 根据指定数据创建张量
    1. torch.tensor
    2. torch.Tensor
  1. 根据形状创建张量
    1. torch.Tensor
  1. 创建指定类型的张量
    1. torch.IntTensor # int32
    2. torch.ShortTensor # int16
    3. torch.LongTensor # int64
    4. torch.FloatTensor # float32
    5. torch.DoubleTensor # float64
  1. 创建线性张量
    1. torch.arange # 指定步长
    2. torch.linspace # 指定数量
  1. 创建随机张量
    1. torch.randn(size) # 指定形状的随机张量
    2. torch.randint(start, end, size, dtype)
    3. 随机种子
      1. torch.random.init_seed() # 查看随机数种子
      2. torch.random.manual_seed(n: int) # 设置随机数种子
  1. 创建0-1张量
    1. 全为1张量
      1. torch.ones(size) # 创建指定形状全0张量
      2. torch.ones_like(Tensor) # 根据张量对象的形状创建全0张量
    2. 全为0张量
      1. torch.zeros
      2. torch.zeros_like
    3. 全为指定值张量
      1. torch.full(size, fill_value)
      2. torch.full_like(Tensor, fill_value)

1.2 张量中元素的数据类型

  1. 查看张量对象Tensor元素类型(dtype属性)
    1. Tensor.dtype 返回张量对象的元素类型
  1. 更改张量对象的元素类型(不能原地修改, 需要通过变量接收)
    1. 两种方法
      1. Tensor.type(torch.IntTensor)
      2. Tensor.int()
    2. 类型罗列
      1. 属性: IntTensor, LongTensor, ShortTensor, FloatTensor, DoubleTensor
      2. 方法: int(), long(), short(), float(), double()

1.3 张量对象的转换

  • Tensor.numpy() # Tensor对象 ⇒ Ndarray对象
    • 对象方法, 共享内存,可以使用 copy 函数(对Ndarray对象使用)避免共享
  • torch.from_numpy(Ndarray) # Ndarray对象 ⇒ Tensor对象
    • 类方法, 共享内存,可以使用 copy 函数(对Ndarray对象使用)避免共享
  • torch.tensor(Ndarray) # Ndarray对象 ⇒ Tensor对象
    • 类方法, 默认不共享内存
  • Tensor.item() # Tensor对象 ⇒ 标量
    • 对象方法, 张量中只有一个元素, 将其转化为变量.

1.4 张量计算

张量的计算包括张量间的运算和张量内部元素间的元算

1.4.1 张量间的运算

  • 不修改原数据
    • Tensor_1.add(Tensor_2) # 加
    • Tensor_1.sub(Tensor_2) # 减
    • Tensor_1.mul(Tensor_2) # (点)乘
      • (n, m) * (n, m) ⇒ (n, m)
    • Tensor_1.div(Tensor_2) # 除
    • Tensor_1.neg(Tensor_2) # 取反
    • Tensor_1.matmul(Tensor_2) # 矩阵乘法
      • (n, m) @ (m, p) ⇒ (n, p)
  • 修改原数据(同时返回修改后的对象
    • Tensor.add_(Tensor)
    • … …
对于不修改原数据的张量对象间的运算加、减、(点)乘、除、矩阵乘法可以使用+ 、-、*、/ 、@来代替

1.4.2 张量中元素的运算

函数
说明
Tensor.mean()
求平均
Tensor.sum()
求和
torch.pow(Tensor, n)
指数运算(Tensor对象各元素的n次方)
Tensor.sqrt()
Tensor对象的平方根,等同torch.pow(Tensor, 0.5)
Tensor.exp()
指数计算, e的n次方(n为Tensor对象中元素值)
Tensor.log()、Tensor.log2()、Tensor.log10()
对数计算, 分别以e、2、10为底
… …

1.5 张量索引

我们在操作张量时,经常需要去获取某些元素进行处理或者修改操作, 可以通过索引的方式实现, 返回的对象也依然是Tensor对象,同时,张量的索引操作和numpy中对于Ndarray数组的索引操作是完全一样的。包括行列索引、范围索引、布尔索引和多维索引
注:张量索引中的step必须大于0,否则报错

1.6 张量维度

1.6.1 张量维度查看(属性)

  • Tensor.ndim

1.6.2 张量形状查看(属性、方法)

  • Tensor.shape
  • Tensor.size()

1.6.3 张量元素个数(方法)

  • Tensor.numel()

1.6.4 张量降维、升维

  • Tensor.squeeze([dim]) → new_Tensor 指定维度降维
    • 参数缺省:将Tersor中所有为1的维度去除
    • 指定参数dim:将Tersor中指定的dim维度为1的维度去除
  • Tensor.unsqueeze(dim) → new_Tensor 升维
    • 参数dim不能缺
    • 将指定dim维度升维

1.6.5 张量形状变化

  • Tensor.flatten() → new_Tensor 任意维度张量转化为一维张量
  • Tensor.reshape(shape) → new_Tensor 改变形状
  • Tensor.view(dtype: dtype) → new_Tensor 改变形状(内存不连续的张量不能使用此方法
  • torch.transpose(input:Tensor, dim0, dim1) 交换Tensor指定的两个维度(一次只能交换两个维度)
    • Tensor.transpose()
  • torch.permute(input: Tensor,dims: Size | list[int] | tuple[int, ...]) → new_Tensor 交换Tensor指定的多个维度
    • Tensor.permute()对象方法
  • Tensor.is_contiguous() → Bool 判定Tensor对象中元素的内存是否连续,是返回True,否则False
注:transpose和permute方法会将内存连续的张量对象更改为内存不连续的张量对象。但是形状变化前后两对象中访问的元素是地址共享的,解决内存共享问题,可以使用Tensor对象的clone方法来解决,相当于Numpy中copy方法。

1.6.7 张量拼接

  • torch.cat(tensors: tuple[Tensor, ...] | list[Tensor], dim: int = 0)

2. 模型的基础使用

2.1 自动微分模块

训练神经网络时,最常用的算法就是反向传播。在该算法中,参数(模型权重)会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度,PyTorch内置了名为 torch.autograd 的微分引擎。它支持任意计算图的自动梯度计算:
notion image
接下来我们使用这个结构进行自动微分模块的介绍。我们使用backward 方法、grad 属性来实现梯度的计算和访问

2.2 线性回归案例

我们使用 PyTorch 的各个组件来构建线性回归的实现。在pytorch中进行模型构建的整个流程一般分为四个步骤:
  • 准备训练集数据
  • 构建要使用的模型
  • 设置损失函数和优化器
  • 模型训练
 
notion image