神经网络的层与块

什么是层?什么是块?

在深度学习中,层(Layer) 和块(Block) 是构建神经网络的核心概念,尤其在 PyTorch、TensorFlow 等框架中,二者既紧密关联又有明确分工。理解它们的定义、关系和用法,是掌握神经网络设计的基础。

一、核心定义

1. 层(Layer)

层是神经网络中最基本的计算单元,实现特定的数学操作(如线性变换、卷积、激活函数等)。

  • 功能单一:通常只完成一种特定计算(如nn.Linear实现线性变换y = Wx + bnn.ReLU实现激活函数y = max(0, x))。
  • 可复用性低:单个层一般不单独使用,需与其他层组合才能完成复杂任务。
2. 块(Block)

块是由多个层(或其他块)组合而成的复杂单元,封装了一组相关的计算逻辑。

  • 功能复合:可以包含多个层(如 “卷积层 + 激活函数 + 池化层” 组成的卷积块),甚至嵌套其他块(如 ResNet 中的残差块包含多个卷积块)。
  • 可复用性高:块可以被看作 “超级层”,在网络中重复使用(如 Transformer 中的 Encoder 块被重复堆叠)。

二、本质关系:层是块的 “原子”,块是层的 “组合”

在 PyTorch 中,所有层和块都继承自nn.Module,因此它们在接口上保持一致(都有__init__初始化方法和forward前向传播方法)。

  • 层是 “最小化的块”:单个层(如nn.Linear)可以视为只包含一个计算步骤的特殊块。
  • 块是 “结构化的层集合”:块通过组合多个层(或块),实现更复杂的功能(如特征提取、残差连接等)。

三、具体区别与联系

维度层(Layer)块(Block)
组成单一计算单元(如矩阵乘法、卷积)多个层 / 块的组合(如 “线性层 + 激活函数 + dropout”)
功能实现基础操作(如线性变换、非线性激活)实现复杂功能(如特征提取、残差连接、注意力机制)
复用性低(通常作为块的组成部分)高(可作为模块重复嵌入到不同网络中)
示例nn.Linearnn.Conv2dnn.ReLUnn.Sequential、ResNet 的残差块、Transformer 的 Encoder 块

为什么需要自定义 Sequential?

虽然 PyTorch 已有nn.Sequential,但自定义版本有以下用途:

  1. 学习原理:理解 PyTorch 如何管理模块和参数。
  2. 扩展功能:例如,添加日志记录、中间输出缓存等功能。
  3. 简化接口:在特定场景下提供更简洁的 API。

MySequentialnn.Sequential功能基本相同,有那些细微差异?

特性MySequentialnn.Sequential
模块命名自动生成索引(如 "0", "1")可自定义名称(如nn.Sequential(relu=nn.ReLU())
初始化方式接收任意数量的模块接收多个模块或有序字典
实现复杂度约 20 行代码更复杂(支持更多特性)

完整代码

"""
文件名: 5.1
作者: 墨尘
日期: 2025/7/13
项目名: dl_env
备注:  输出结果不一样,是因为Linear权值是随机初始化的
"""
import torch
from torch import nn
from torch.nn import functional as F"""多层感知机,使用自定义块实现"""
class MLP(nn.Module):# 用模型参数声明层。这里,我们声明两个全连接的层def __init__(self):# 调用MLP的父类Module的构造函数来执行必要的初始化。# 这样,在类实例化时也可以指定其他函数参数,例如模型参数params(稍后将介绍)super().__init__()self.hidden = nn.Linear(20, 256)  # 隐藏层self.out = nn.Linear(256, 10)  # 输出层# 定义模型的前向传播,即如何根据输入X返回所需的模型输出def forward(self, X):# 注意,这里我们使用ReLU的函数版本,其在nn.functional模块中定义。return self.out(F.relu(self.hidden(X)))"""自定义顺序块,按传入顺序连接多个模块"""# MySequential的核心目标是:将多个层按传入的顺序连接起来,前一层的输出作为后一层的输入
class MySequential(nn.Module):def __init__(self, *args):"""初始化顺序块,接收任意数量的PyTorch模块参数:*args: 任意数量的nn.Module子类实例(如nn.Linear, nn.ReLU等)"""# 调用父类nn.Module的构造函数,完成必要的初始化super().__init__()# 遍历所有传入的模块for idx, module in enumerate(args):# 将模块添加到PyTorch内置的有序字典_modules中# 键: 模块的索引(字符串形式)# 值: 具体的模块实例# _modules是nn.Module的特殊属性,PyTorch会自动管理其中的所有模块# 包括参数初始化、设备同步、序列化等self._modules[str(idx)] = moduledef forward(self, X):"""定义前向传播逻辑,按顺序依次调用所有模块参数:X: 输入张量返回:经过所有模块处理后的输出张量"""# 按_modules中保存的顺序遍历所有模块# OrderedDict保证了遍历时模块的顺序与添加时一致for block in self._modules.values():# 将输入数据依次通过每个模块# 前一个模块的输出直接作为下一个模块的输入X = block(X)# 返回最终输出return X"""在前向传播函数中执行代码"""
class FixedHiddenMLP(nn.Module):def __init__(self):"""自定义神经网络模块,展示PyTorch中的特殊用法:1. 使用固定权重(训练期间不更新)2. 层参数共享3. 前向传播中的控制流"""super().__init__()# 创建固定权重矩阵(随机初始化,但不参与训练)# requires_grad=False:禁用梯度计算,训练时权重不会更新self.rand_weight = torch.rand((20, 20), requires_grad=False)# 定义可训练的线性层self.linear = nn.Linear(20, 20)def forward(self, X):"""定义前向传播逻辑,包含非常规操作:1. 使用固定权重矩阵进行矩阵乘法2. 复用同一个线性层(参数共享)3. 使用while循环控制输出规模"""# 第一层:可训练的线性变换X = self.linear(X)# 第二层:使用固定随机权重进行矩阵乘法,添加偏置1,再通过ReLU激活# torch.mm:矩阵乘法# self.rand_weight在训练过程中保持不变X = F.relu(torch.mm(X, self.rand_weight) + 1)# 第三层:复用第一个线性层(参数共享)# 相当于两个不同层共享同一组参数X = self.linear(X)# 控制流:如果张量X的绝对值之和大于1,则不断将X除以2# 这是一个自定义的输出规范化策略while X.abs().sum() > 1:X /= 2# 返回标量值:所有元素的和return X.sum()if __name__ == '__main__':"""多层感知机构建一个包含输入层→隐藏层→输出层的全连接神经网络,对随机生成的输入数据进行计算并输出结果。"""# 线性变换负责特征的线性映射,激活函数负责注入非线性,两者交替使用才能让网络有能力学习复杂数据。# 传播过程拆解:# 输入X(形状(2,20))→ 第 1 层线性变换 → 输出X1(形状(2,256))# X1→ 第 2 层 ReLU 激活 → 输出X2(形状(2,256),所有元素非负)# X2→ 第 3 层线性变换 → 输出Y(形状(2,10))# 1. 定义神经网络# 这个前向传播函数非常简单: 它将列表中的每个块连接在一起,将每个块的输出作为下一个块的输入。net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))# 2. 生成输入数据X = torch.rand(2, 20)# 3. 前向传播并打印输出print(net(X))"""自定义块"""net = MLP()print(net(X))"""顺序块"""net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))print(net(X))"""在前向传播函数中执行代码"""net = FixedHiddenMLP()print(net(X))

实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91468.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用Qt写一个安卓Android应用

对于不会安卓开发的同胞来讲(比如我),想要做一个安卓应用(.apk)使用Qt是一个不错的方法,今天就来聊聊如何使用Qt结合C写一个安卓应用。 首先我们得拥有一个Qt,我使用的是5.14.2版本的,新版本可直接到qt官网去下载qt.io,老版本的现在qt官网不支…

泰语OCR识别技术方案

一、痛点分析1.1 泰语文字特性带来的挑战复杂字符集:泰语有44个辅音字母、15个元音符号、4个声调符号和10个数字,组合形式多样上下叠加结构:泰文字符常在垂直方向叠加组合,增加分割难度无词间空格:泰语单词间无明确分隔…

MER-Factory:多模态情感识别与推理数据集自动化工厂工具介绍

🛠️ 工具 如果这个项目对你有帮助,欢迎给 https://github.com/Lum1104/MER-Factory/ 仓库点一个 Star 🌟 ,这对我们帮助很大 MER-Factory 提供交互式工具来帮助您管理数据和配置处理流水线。 调优仪表板 调优仪表板 是一个基…

Python基础数据结构详解:字符串、列表、元组和字典的常用方法

目录 一、引言:为什么学习这些数据结构? 二、字符串(String)的常用方法 1. 基本操作 2. 查找索引 3. 大小写转换 4. 位置调整 5. 开头和结尾检查 6. 分割和连接 7. 删除空白字符 8. 类型判定 9. 替换内容 字符串小结 …

Liunx练习项目5.1-周期化任务;时间同步服务;

1.系统周期化任务1.1 at命令的用法at 时间 指定在规定的时间上执行相应的操作,完成操作crtlD完成编辑一分钟后输入的指令完成,创建了file{1..5}的文件at -l 查看系统上面所有用户的调度at -c 可以查看该任务的指令at -d 加编号可以删除该任务at -v 可以…

小皮面板搭建pikachu靶场

一、搭建所需的工具 1.下载小皮面板 下载地址为:小皮面板(phpstudy) - 让天下没有难配的服务器环境! 2.下载靶场所需的文件 下载地址为:https://github.com/zhuifengshaonianhanlu/pikachu 二、环境的搭建 打开小皮面板,使用所…

使用aiohttp实现高并发爬虫

使用aiohttp来编写一个高并发的爬虫,想法很不错,现实很骨感。这里我们要知道,由于高并发可能会对目标服务器造成压力,请确保遵守目标网站的robots.txt,并合理设置并发量,避免被封IP。 我将通过示例代码&…

【Linux庖丁解牛】— 信号量ipc管理!

1. 并发编程概念铺垫> 多个执行流【进程】看到同一份资源:共享资源。> 被保护起来的资源叫做临界资源。> 在进程中,涉及临界资源的程序段叫做临界区。【说人话就是程序中访问共享资源的代码】> 什么是互斥:任何时刻,只…

Spring Boot全局异常处理详解

原代码:package com.weiyu.exception;import com.weiyu.pojo.Result; import com.weiyu.utils.ErrorFileResponseUtils; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import …

FHE技术将彻底改变在线隐私保护方式

1. 在线隐私的简史 互联网刚刚诞生时,所有的内容都是未加密的。人们通过一个特定的地址访问网站,这个地址以“HTTP”开头。当时,这并不是什么大问题,因为人们在线访问的都是内容,而这些内容本身已经是公开的。但随着电…

Cursor配置Java环境、创建Spring Boot项目

一:配置JDK和Maven cursor默认会读取环境变量JAVA_HOME和MAVEN_HOME,如果没有配置去找默认路径~/.m2/settings.xml也可以手动指定:Ctrl Shift P 输入"Preferences:Open User Settings(JSON)"打开settings.json文件,然…

win11添加无线显示器(两个笔记本实现双屏)

前置条件: 两个笔记本要要支持无线显示器,支持蓝牙; 1、自己重装的win11系统,首先根据网上说明进去的时候,红色显示无无线投屏; 2、安装网上操作,查看自己电脑是否支持无线投屏(是支…

【MAC技巧】Bash/Zsh切换失败的故障排除

【MAC技巧】Bash/Zsh切换失败的故障排除 Troubleshooting to Failure " chsh: no changes made" By JacksonML 在Mac电脑中,终端(Terminal)是常用的命令行工具,对开发和运维至关重要。 依照苹果电脑的系统软件迭代,终端中存有B…

卷积神经网络-卷积的分类

卷积的定义卷积是图像处理中最核心的操作之一,其本质是通过卷积核(滤波器)与图像进行滑动窗口计算(像素值乘积之和),实现对图像特征的提取、增强或抑制。一、二维卷积--针对二维矩阵进行处理1.1单通道见得最…

全网首发:使用GIT下载时崩溃退出,是因为机械硬盘

前面有几篇文章,说是GIT下载会退出。开始以为是虚拟机问题。把家里的虚拟机复制到公司,照样崩溃。后来认为是内存不足。昨天在家里下载代码,也崩溃退出。心里觉得奇怪,试了一次,还是退出。差别在哪里?之前是…

YAML 自动化用例中 GET vs POST 请求的参数写法差异

GET 请求:用 params 传参(附加在 URL 上) config:name: "GET 查询用户信息"base_url: "https://api.example.com"teststeps:- name: "根据 userId 查询用户信息"request:method: GETurl: /api/user/detailpara…

使用 SeaTunnel 建立从 MySQL 到 Databend 的数据同步管道

SeaTunnel 是一个非常易用、超高性能的分布式数据集成平台,支持实时海量数据同步。 每天可稳定高效地同步数百亿数据,已被近百家企业应用于生产,在国内较为普及。 Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分…

linux服务器换ip后客户端无法从服务器下载数据到本地问题处理

服务器换ip后客户端无法从服务器下载数据到本地,根据上图提示,让用户清理下~/.ssh/known_hosts文件,下载恢复正常。

从0到1实现Shell!Linux进程程序替换详解

目录从0到1实现Shell!Linux进程程序替换详解 🚀引言:为什么进程需要"变身术"?一、程序替换:进程的"换衣服"魔法 🔄1.1 什么是程序替换?1.2 程序替换的原理:内存…

暑期算法训练.2

目录 6.力扣 11.盛水最多的容器 6.1 题目解析: 6.2 算法思路: 6.2.1 暴力解法: 6.2.2 优化算法: 6.3 代码演示: ​编辑 6.4 总结反思: 7.力扣 611.有效的三角形个数 7.1 题目解析: 7.2…