1.张量
张量(tensor)类似于numpy里的n维数组ndarray,用于存储和操作模型的输入和输出以及模型的参数,可以是标量(0维)、向量(1维)、矩阵(2维)或多维数组(3维或以上),区别在于张量可以在 GPU 上运行以加速计算。
构造一个简单的张量:
此外tensor还可以通过torch.from_numpy()函数和torch_tensor.numpy()函数与numpy中的数据相互转换。
torch.tensor函数的参数:
torch.tensor(data, dtype = None, device = None, requires_grad = False, pin_memory = False)
data为数据类型;dtype是生成的Tensor数据类型(不进行设置则根据输入的data的数据类型来决定);device默认为None,会在当前的设备上为生成的Tensor分配内存; requires_grad若设置为True,则可以计算梯度;pin_memory设置为True,则在固定内存中分配当前Tensor,不过只适用于CPU中的Tensor。
2.计算图
计算图是用于描述运算的有向无环图,图中节点表示数据(向量、张量等),边表示运算(包括加减乘除等)。计算图的好处在于使运算更加简洁,同时方便进行梯度求导。
如下图表示e=(a+b)*(b+1)的计算过程:
pytorch中的计算图是动态图机制,在pytorch运行之前,不会去创建所谓的神经网络,这完全由python代码定义的forward函数来描述。即我们手工编写的forward函数就是pytorch前向运行的动态图。当代码执行到哪一句的时候,网络就运行到哪一步。
3.自动微分
autograd 包是 Pytorch 中所有神经网络的核心,为 Tensors 上的所有操作提供自动微分。
torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True,则会开始跟踪针对 tensor 的所有操作。完成计算后,我们可以调用 .backward() 来自动计算所有梯度。该张量的梯度将累积到 .grad 属性中。还有一个类对于 autograd 实现非常重要那就是 Function。Tensor 和 Function 互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息。每个张量都有一个 .grad_fn 属性保存着创建了张量的 Function 的引用。
如果想计算导数,可以调用 Tensor.backward()。创建一个Tensor时,它的梯度为None,只有当调用backward()方法计算了梯度之后,这个属性才会变成一个tensor并且存放梯度值,并且这个值可以累加。
4.pytorch的常用模块