跳至主要內容
四、PyTorch—自定义反向传播

四、PyTorch—自定义反向传播

  • 神经网络 —— 损失函数 & 反向传播中已经介绍了反向传播的基本概念。

    反向传播的本质就是NN条偏导链,通过最后的loss值往前逐层计算梯度,更新权重。

    PyTorch中,使用loss.backward()便是执行反向传播的过程,不过本文的重点主要是了解如何自定义反向传播过程。一般来说,有两种情况我们需要用到自定义反向传播:

    1. 引入了不可微的函数,此时需要自定义求导方式;
    2. 希望在偏导链中引入新的约束(类似损失函数的惩罚项)。

Xenny原创大约 3 分钟机器学习机器学习PyTorch
三、PyTorch—模型

三、PyTorch—模型

  • 在第一篇 一、PyTorch 基础 中的例子我们已经使用了nn.Module来创建了一个线性回归模型。本文将来介绍Module的具体属性以及行为,了解如何搭建一个复杂的机器学习模型。

Module

  • 这里我们介绍的是torch.nn子包的Module类,它是所有网络层的基类。我们将通过继承该类来实现自己的网络。

    class myNet(nn.Module):
        def __init__(self):
            pass
    
        def forward(self, x):
            pass
    

    这是一个基本的网络模型结构,对于一般的网络模型,我们只需要在__init__定义每一层的结构,在forward实现具体正向传播预测过程即可。


Xenny原创大约 4 分钟机器学习机器学习PyTorch
二、PyTorch—DataLoader & Transforms

二、PyTorch—DataLoader & Transforms

  • 在训练时,我们读取各种不同类型的数据以及需要对数据做一些预处理,这里介绍的便是PyTorch中的数据读取和图像预处理模块。

DataLoader

  • 在上一篇博文文末例子中我们已经使用了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)。

Xenny原创大约 5 分钟机器学习机器学习PyTorch
一、PyTorch基础

一、PyTorch基础

  • 环境安装请自己百度,这里不记录。

张量

  • 张量(tensor)是torch中的数据结构,也是最基本的概念,一个张量本质就是一个多维数组,统一了标量、向量、矩阵的概念。

    张量
    张量

    在torch中一个张量包含以下8个属性。

    1. data:数据,带包装类的。

    2. dtype:张量数据类型。

    3. shape:张量的性质。一个n维列表,第i个代表第i维的元素个数。

    4. device:张量所在设备。

    5. grad:数据的梯度。

    6. grad_fn:张量生成的函数过程,如果是用户生成的则为None,依赖于其他张量生成时则为相应操作。通过它可以得到当前张量的梯度。

      就是记录张量的依赖关系,利用链式法则简化求梯度运算。

    7. requires_grad:是否需要梯度,不需要则不会记录自动生成的grad_fn属性。

    8. 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操作、运算,这些就不写了,不知道就找文档就行,基本你想要的操作/运算都是实现好的了,别想着自己写个函数。


Xenny原创大约 6 分钟机器学习机器学习PyTorch