https://tangshusen.me/

数据模块

torch.util.data模块能够找到适用于数据加载和处理的工具。需要用到的两个主要的类是DatasetDataLoaderDataset承担了你的自定义的数据(可以是任何一种格式)与标准PyTorch张量之间的转换任务。DataLoader可以在后台生成子进程来从Dataset中加载数据,使数据准备就绪并在循环可以使用后立即等待训练循环。

并行模块

在最简单的情况下,模型将在本地CPU或单个GPU上运行所需的计算。因此,当训练循环获取到数据时就能够立即开始运算。然而更常见的情形是使用专用的硬件(例如多个GPU)或利用多台计算机的资源来训练模型。在这些情况下,可以通过torch.nn.DataParalleltorch.distributed来使用其他的可用硬件。

优化模块

当模型根据训练数据得到输出结果后,torch.optim提供了更新模型的标准方法,从而使输出更接近于训练数据中的标签。

张量基础

存储(Storage)是一个一维的数值数据数组,例如一块包含了指定类型(可能是float或int32)数字的连续内存块。PyTorch的张量(Tensor)就是这种存储(Storage)的视图(view),我们可以使用偏移量和每一维的跨度索引到该存储中。

尺寸(size)、存储偏移(storage offset)和步长(stride)

与NumPy的互通性

points_np = points.numpy()

points = torch.from_numpy(points_np)

除了dtype之外,PyTorch张量还具有设备(device)的概念,这是在设置计算机上放张量(tensor)数据的位置。

独热编码

您可以使用scatter_方法来实现独热编码,该方法将源张量中的值沿作为参数提供的索引进行填充。

现在看一下scatter_的作用。 首先请注意,其名称下划线结尾。PyTorch中,此约定表示该方法不会返回新的张量,而是就地修改源张量。 scatter_的参数是

  • 指定后面两个参数所处理的维度
  • 列张量,指示要填充的索引
  • 包含填充元素的张量或者单个标量(上例中即1.0)

自动求导

注意到了张量构造函数的require_grad = True吗?这个参数告诉PyTorch需要追踪在params上进行运算而产生的所有张量。

相反,应该通过调用.detatch()将新的params张量从与其更新表达式关联的计算图中分离出来。这样,params就会丢失关于生成它的相关运算的记忆。然后,你可以调用.requires_grad_(),这是一个就地(in place)操作(注意下标“_”),以重新启用张量的自动求导。现在,你可以释放旧版本params所占用的内存,并且只需通过当前权重进行反向传播。

对张量的元素进行打乱等价于重新排列其索引。randperm函数完成了这个操作

为了解决这个问题,PyTorch允许你通过使用torch.no_grad上下文管理器在不需要时关闭autograd

  1. with torch.no_grad():
  2. val_t_p = model(val_t_u, *params) val_loss = loss_fn(val_t_p, val_t_c) assert val_loss.requires_grad == False

使用相关的set_grad_enabled上下文管理器,你还可以根据布尔表达式(通常表示在训练还是在推理中)来调节代码在启用或禁用autograd的情况下运行。你可以定义一个calc_forward函数,该函数接受输入中的数据,并根据布尔值is_train参数运行带或不带autogradmodelloss_fn

  1. def calc_forward(t_u, t_c, is_train):
  2. with torch.set_grad_enabled(is_train):
  3. t_p = model(t_u, *params)
  4. loss = loss_fn(t_p, t_c)
  5. return loss

nn.Module

PyTorch模块都是从基类nn.Module继承而来的Python类。模块可以具有一个或多个参数(Parameter)实例作为属性,这些参数就是在训练过程中需要优化的张量(在之前的线性模型中即w和b)。模块还可以具有一个或多个子模块(nn.Module的子类)属性,并且也可以追踪其参数。

使用一组参数调用nn.Module实例最终会调用带有相同参数的名为forward的方法,forward方法会执行前向传播计算;不过在调用之前和之后还会执行其他相当重要的操作。因此,虽然从技术上讲直接调用forward是可行的,并且它产生的结果与调用nn.Module实例相同,但用户不应该这样做

nn中的任何模块都被编写成同时产生一个批次(即多个输入)的输出。 因此,假设你需要对10个样本运行nn.Linear,则可以创建大小为 B x Nin 的输入张量,其中 B 是批次的大小,而 Nin 是输入特征的数量,然后在模型中同时运行

nn提供了一种通过nn.Sequential容器串联模块的简单方法

实际上,Sequential中每个模块的名称都是该模块在参数中出现的顺序。有趣的是,Sequential还可以接受OrderedDict作为参数,这样就可以给Sequential的每个模块命名

Image.png
Image [2].png
Image [3].png

⼀个常⽤的函数就是 item() , 它可以将⼀个标量 Tensor 转换成⼀个Python number

Image [4].png
Image [5].png
Image [6].png

通过 .requiresgrad() 来⽤in-place的⽅式改变 requires_grad 属性

  • torch.utils.data 模块提供了有关数据处理的⼯具,
  • torch.nn 模块定义了⼤量神经⽹络的层,
  • torch.nn.init模块定义了各种初始化⽅法
  • torch.optim 模块提供了模型参数初始化的各种⽅法。
    Image [7].png

初始化方法

  1. from torch.nn import init
  2. init.normal_(net[0].weight,mean=0,std=0.01)
  3. init.constant_(net[0].bias,val=0)
  • input.contiguous() 将tensor整合到内存中的连续区域