type
status
date
slug
summary
tags
category
icon
password
默认执行代码 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