数据模块
torch.util.data模块能够找到适用于数据加载和处理的工具。需要用到的两个主要的类是Dataset和DataLoader。Dataset承担了你的自定义的数据(可以是任何一种格式)与标准PyTorch张量之间的转换任务。DataLoader可以在后台生成子进程来从Dataset中加载数据,使数据准备就绪并在循环可以使用后立即等待训练循环。
并行模块
在最简单的情况下,模型将在本地CPU或单个GPU上运行所需的计算。因此,当训练循环获取到数据时就能够立即开始运算。然而更常见的情形是使用专用的硬件(例如多个GPU)或利用多台计算机的资源来训练模型。在这些情况下,可以通过torch.nn.DataParallel和torch.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
with torch.no_grad():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参数运行带或不带autograd的model和loss_fn:
def calc_forward(t_u, t_c, is_train):with torch.set_grad_enabled(is_train):t_p = model(t_u, *params)loss = loss_fn(t_p, t_c)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 [2].png](/uploads/projects/nnniu-01xq1@wvxdl4/2628bf36d0172bd18db4ed04a982f67f.png)
![Image [3].png](/uploads/projects/nnniu-01xq1@wvxdl4/472c473f74a554594978cc243629ae1e.png)
⼀个常⽤的函数就是 item() , 它可以将⼀个标量 Tensor 转换成⼀个Python number
![Image [4].png](/uploads/projects/nnniu-01xq1@wvxdl4/cca0584233bc544c4d59450621668b7b.png)
![Image [5].png](/uploads/projects/nnniu-01xq1@wvxdl4/cde08e9cdf32742aa6641d4ca41847d3.png)
![Image [6].png](/uploads/projects/nnniu-01xq1@wvxdl4/00617714e34e6f686d57a2c16ba0b051.png)
通过 .requiresgrad() 来⽤in-place的⽅式改变 requires_grad 属性
torch.utils.data模块提供了有关数据处理的⼯具,torch.nn模块定义了⼤量神经⽹络的层,torch.nn.init模块定义了各种初始化⽅法torch.optim模块提供了模型参数初始化的各种⽅法。![Image [7].png](/uploads/projects/nnniu-01xq1@wvxdl4/6ce67e2a68416c641bb18f1331dcd79a.png)
初始化方法
from torch.nn import initinit.normal_(net[0].weight,mean=0,std=0.01)init.constant_(net[0].bias,val=0)
input.contiguous()将tensor整合到内存中的连续区域
