-
在神经网络 —— 损失函数 & 反向传播中已经介绍了反向传播的基本概念。
反向传播的本质就是条偏导链,通过最后的loss值往前逐层计算梯度,更新权重。
在
PyTorch
中,使用loss.backward()
便是执行反向传播的过程,不过本文的重点主要是了解如何自定义反向传播过程。一般来说,有两种情况我们需要用到自定义反向传播:- 引入了不可微的函数,此时需要自定义求导方式;
- 希望在偏导链中引入新的约束(类似损失函数的惩罚项)。
原创2024/7/2大约 3 分钟
在神经网络 —— 损失函数 & 反向传播中已经介绍了反向传播的基本概念。
反向传播的本质就是N条偏导链,通过最后的loss值往前逐层计算梯度,更新权重。
在PyTorch
中,使用loss.backward()
便是执行反向传播的过程,不过本文的重点主要是了解如何自定义反向传播过程。一般来说,有两种情况我们需要用到自定义反向传播:
nn.Module
来创建了一个线性回归模型。本文将来介绍Module的具体属性以及行为,了解如何搭建一个复杂的机器学习模型。这里我们介绍的是torch.nn
子包的Module
类,它是所有网络层的基类。我们将通过继承该类来实现自己的网络。
class myNet(nn.Module):
def __init__(self):
pass
def forward(self, x):
pass
这是一个基本的网络模型结构,对于一般的网络模型,我们只需要在__init__
定义每一层的结构,在forward
实现具体正向传播预测过程即可。
在上一篇博文文末例子中我们已经使用了torch.utils.data.DataLoader
来处理数据,这个类的初始化参数为
DataLoader(dataset,
batch_size=1,
shuffle=False,
sampler=None,
num_workers=0,
collate_fn=<function default_collate>, pin_memory=False, drop_last=False)
其中我们平时会用到的参数如下
dataset
(Dataset) – 加载数据的数据集;batch_size
(int, optional) – 每个batch加载多少个样本(默认: 1);shuffle
(bool, optional) – 设置为True时会在每个epoch重新打乱数据(默认: False);num_workers
(int, optional) – 用多少个子进程加载数据。0表示数据将在主进程中加载(默认: 0);drop_last
(bool, optional) – 如果数据集大小不能被batch size整除,则设置为True后可删除最后一个不完整的batch。如果设为False并且数据集的大小不能被batch size整除,则最后一个batch将更小。(默认: False)。张量(tensor)是torch中的数据结构,也是最基本的概念,一个张量本质就是一个多维数组,统一了标量、向量、矩阵的概念。
在torch中一个张量包含以下8个属性。
data
:数据,带包装类的。
dtype
:张量数据类型。
shape
:张量的性质。一个n维列表,第i个代表第i维的元素个数。
device
:张量所在设备。
grad
:数据的梯度。
grad_fn
:张量生成的函数过程,如果是用户生成的则为None,依赖于其他张量生成时则为相应操作。通过它可以得到当前张量的梯度。
就是记录张量的依赖关系,利用链式法则简化求梯度运算。
requires_grad
:是否需要梯度,不需要则不会记录自动生成的grad_fn
属性。
is_leaf
:是否为叶节点。
torch创建张量
torch.tensor() # 直接创建
torch.from_numpy() # 从np创建
torch.zeros() # 根据大小创建全0的张量
torch.ones() # 根据大小创建全1的张量
torch.full() # 根据大小创建自定义填充的张量
torch.arange(start, end) # range语法创建一维张量。
torch.linspace() # 创建均分的1维张量,闭区间。
torch.logspace() # 创建对数均分的1维张量,闭区间。
torch.eye() # 创建单位对角矩阵。
torch.normal(mean, std) # 高斯分布
torch.bernoulli(mean, std) # 伯努利分布
torch操作、运算,这些就不写了,不知道就找文档就行,基本你想要的操作/运算都是实现好的了,别想着自己写个函数。