当前位置: 首页 > news >正文

从0开始深度学习(18)——层和块

1 层和块

1.1层

层是神经网络的基本组成单位。每一层由多个神经元(或单元)组成,这些神经元在前一层的输出上执行某种计算,并将结果传递给下一层。根据功能,层可以分为以下几种类型:

  • 输入层(Input Layer):接收外部数据并将其传递给网络。
  • 隐藏层(Hidden Layer):位于输入层和输出层之间,执行特征提取和表示学习。深度学习模型通常包含多个隐藏层。
  • 输出层(Output Layer):生成最终的输出,例如分类结果或预测值。

1.2 块

块通常指的是一组层的组合,具有特定功能或结构,能够执行某种复杂的操作或特征提取。块的设计目的是为了重用和组织模型的部分。例如:

  • 卷积块(Convolutional Block):通常包括卷积层、激活函数和归一化层的组合。
  • 残差块(Residual Block):包含跳跃连接(skip connections),可以帮助模型训练更深的网络。
  • 循环块(Recurrent Block):包含一个或多个循环层(如LSTM或GRU),用于处理序列数据。

1.3 以多层感知机为例

在这里插入图片描述
多个层组合成块,然后块又与块组合形成更大的模型。

从编程的角度来看,块由类(class)表示。 它的任何子类都必须定义一个将其输入转换为输出的前向传播函数, 并且必须存储任何必需的参数。 注意,有些块不需要任何参数。 最后,为了计算梯度,块必须具有反向传播函数。

2 自定义块

在实现我们自定义块之前,我们简要总结一下每个块必须提供的基本功能:

  1. 将输入数据作为其前向传播函数的参数。
  2. 通过前向传播函数来生成输出。请注意,输出的形状可能与输入的形状不同。
  3. 计算其输出关于输入的梯度,可通过其反向传播函数进行访问。通常这是自动发生的。
  4. 存储和访问前向传播计算所需的参数。
  5. 根据需要初始化模型参数。

在下面的代码片段中,我们从零开始编写一个块。 它包含一个多层感知机,其具有256个隐藏单元的隐藏层和一个10维输出层。

自定义的MLP 类继承自 nn.Module,这是 PyTorch 中所有神经网络模块的基类,通过继承 nn.Module,可以利用 PyTorch 提供的很多功能,如参数管理和自动求导。

import torch
from torch import nn
from torch.nn import functional as Fclass MLP(nn.Module):def __init__(self):# 类的构造函数,用于初始化网络结构。super().__init__() # 调用父类的构造函数,确保父类 nn.Module 得到正确初始化。self.hidden=nn.Linear(20,256)self.out=nn.Linear(256,10)def forward(self,x):a=self.hidden(x)re=self.out(F.relu(a))return re

整段代码实现了一个基本的多层感知机模型,具有以下特点:

  1. 输入层接受 20 维特征。
  2. 隐藏层由一个线性层(输出 256 维)和 ReLU 激活函数组成。
  3. 输出层由另一个线性层(输出 10 维)组成。

运行结果:

X = torch.rand(2, 20)
net = MLP()
net(X)

在这里插入图片描述

2 顺序块

我们曾在从0开始深度学习(13)——多层感知机的简洁实现中使用过Sequential类
在这里插入图片描述
接下来我们将构建自己的顺序块,为了构建自己的简化的MySequential, 我们只需要定义两个关键函数:

  1. 一种将块逐个追加到列表中的函数。
  2. 一种前向传播函数,用于将输入按追加块的顺序传递给块组成的“链条”。
class MySequential(nn.Module):def __init__(self, *args):# *args 表示可以接受任意数量的参数,这些参数通常是 nn.Module 的实例super().__init__()for idx, module in enumerate(args):# 通过 enumerate 函数遍历所有传入的模块,并为每个模块分配一个索引 idx。#将每个模块以字符串形式的索引存储在 _modules 字典中。#_modules 是 nn.Module 中定义的一个属性,用于存储子模块。#使用字符串索引可以确保按照添加的顺序进行存储。self._modules[str(idx)] = moduledef forward(self, X):# OrderedDict保证了按照成员添加的顺序遍历它们for block in self._modules.values():X = block(X)return X

运行结果:

net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net(X)

在这里插入图片描述

3 在前向传播函数中执行代码

需要更强的灵活性时,我们需要定义自己的块。 例如,我们可能希望在前向传播函数中执行Python的控制流。 此外,我们可能希望执行任意的数学运算, 而不是简单地依赖预定义的神经网络层。

例如,我们需要一个计算函数 f ( x , w ) = c ⋅ w ⊤ x f(\mathbf{x},\mathbf{w}) = c \cdot \mathbf{w}^\top \mathbf{x} f(x,w)=cwx的层,其中 x x x是输入, w w w是参数, c c c是某个在优化过程中没有更新的指定常量。因此我们实现了一个FixedHiddenMLP类,如下所示:

class FixedHiddenMLP(nn.Module):def __init__(self):super().__init__()# 在训练期间这个权重不计算梯度,因此它在训练期间保持不变。self.rand_weight = torch.rand((20, 20), requires_grad=False)self.linear = nn.Linear(20, 20)def forward(self, X):X = self.linear(X)# 对 X 和 rand_weight 进行矩阵乘法。这里 rand_weight 是不计算梯度的随机权重。X = F.relu(torch.mm(X, self.rand_weight) + 1)# 这里再次将处理后的 X 传递给之前定义的线性层 self.linear,这表示这个全连接层的参数在两次调用中是相同的(共享参数)。X = self.linear(X)# 控制流while X.abs().sum() > 1:X /= 2return X.sum()

在这个FixedHiddenMLP模型中,我们实现一个隐藏层, 权重rand_weight在实例化时被随机初始化之后为常量。 这个权重不是一个模型参数,因此它永远不会被反向传播更新。 然后,神经网络将这个固定层的输出通过一个全连接层。

还展示了如何控制数据流:运行了一个while循环,在 L 1 L_{1} L1范数大于 1 1 1的条件下, 将输出向量除以 2 2 2,直到它满足条件为止。

最后展示一个进行了各种混搭的例子:

class NestMLP(nn.Module):def __init__(self):super().__init__()self.net = nn.Sequential(nn.Linear(20, 64), nn.ReLU(),nn.Linear(64, 32), nn.ReLU())self.linear = nn.Linear(32, 16)def forward(self, X):return self.linear(self.net(X))chimera = nn.Sequential(NestMLP(), nn.Linear(16, 20), FixedHiddenMLP())
chimera(X)

即自定义了一个NestMLP类,里面有netlinear,其中net又是一个Sequential

最后还定义了一个chimera 网络,按照顺序包含了NestMLPLinear,FixedHiddenMLP三个网络


http://www.mrgr.cn/news/56944.html

相关文章:

  • kotlin 入门总结
  • 萤石云服务支持云端视频AI自动剪辑生成
  • Java岗临近面试,如何短期突击通过?
  • 【WSL2】Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试
  • 基于fpga技术的脉冲信号源设计(论文+源码)
  • TikTok运营对IP有什么要求?
  • Java岗临近面试,如何短期突击通过?
  • Qml 动态元素---状态与过渡 --学习测试用例
  • 精华帖分享 | 散户看法-基于邢大散户反着买小视频衍生出的择时指标及这个指标的应用-如何由此构成择时策略
  • 二、KNN算法详解
  • 探索工业自动化网络新境界:FR-TSN交换机与CC-Link IE TSN协议的结合应用
  • 5GC核心网中的南向与北向
  • 智能听诊器:猫咪健康的智能守护者
  • 「C/C++」C++ STL容器库 之 std::map 键值对的集合容器
  • 什么是机器人流量?如何识别和预防有害机器人流量?
  • 预售即断货!西圣H1头戴式耳机好评如潮,99%满意度引爆市场!
  • 『完整代码』坐骑召唤
  • 如何让别人喜欢你的代码
  • 视觉分析在烟火检测中的应用
  • 光谱共焦位移传感器的应用方案组成及测量领域
  • 功能自动化测试工具Appium使用步骤讲解
  • 【uniapp使用内置组件barcode遇到的问题】
  • 2024最新版鸿蒙纯血原生应用开发教程文档丨HarmonyOS 开发准备-成为华为开发者
  • 全面解读商用条码扫描器通信方式
  • 跨域问题曲折探索背后的一个小小的插曲:header is present on the requested resource错误
  • 自动化抖音点赞取消脚本批量处理