PyTorch中的Sequential、ModuleList和ModuleDict用法总结

PyTorch 中的 ModuleList 和 Sequential: 区别和使用场景 PyTorch 中有一些基础概念在构建网络的时候很重要,比如 nn.Module, nn.ModuleList, nn.Sequential,这些类我们称之为容器 (containers),因为我们可以添加模块 (module) 到它们之中。这些容器之间很容易混淆,本文中我们主要学习一下 nn.ModuleList 和 nn.Sequential,并判断在什么时候用哪一个比较合适 阅读详情

1. 区别与联系

首先来一张图,总体概括一下它们的区别:
在这里插入图片描述

  • 区别
  1. nn.Sequential内部实现了forward函数,因此可以不用写forward函数。而nn.ModuleList和nn.ModuleDict则没有实现内部forward函数。
  2. nn.Sequential需要严格按照顺序执行,而其它两个模块则可以任意调用。

下面分别进行介绍。

1.1 nn.Sequential

  • nn.Sequential里面的模块按照顺序进行排列的,所以必须确保前一个模块的输出大小和下一个模块的输入大小是一致的。
  • nn.Sequential中可以使用OrderedDict来指定每个module的名字。

1.2 nn.ModuleList

  • nn.ModuleList里面储存了不同 module,并自动将每个 module 的 parameters 添加到网络之中的容器(注册),里面的module是按照List的形式顺序存储的,但是在forward中调用的时候可以随意组合。
  • 可以任意将 nn.Module 的子类 (比如 nn.Conv2d, nn.Linear 之类的) 加到这个 list 里面,方法和 Python 自带的 list 一样,也就是说它可以使用 extend,append 等操作。

1.3 nn.ModuleDict

  • ModuleDict可以像常规Python字典一样索引,同样自动将每个 module 的 parameters 添加到网络之中的容器(注册)。
  • 同样的它可以使用OrderedDict、dict或者ModuleDict对它进行update,也就是追加。

2. nn.sequential

这里举两个例子来说明nn.sequential,一个是直接通过nn.Sequential添加子模块,另一个方法是使用OrderedDict来指定每个模块的名字。

下面两种方法可以达到同样的效果。

import torch.nn as nn

model = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )
print(model)
print('='*50)
from collections import OrderedDict
# Using Sequential with OrderedDict. This is functionally the
# same as the above code
model = nn.Sequential(OrderedDict([
          ('conv1', nn.Conv2d(1,20,5)),
          ('relu1', nn.ReLU()),
          ('conv2', nn.Conv2d(20,64,5)),
          ('relu2', nn.ReLU())
        ]))

print(model)

输出:

Sequential(
  (0): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
  (1): ReLU()
  (2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
  (3): ReLU()
)
==================================================
Sequential(
  (conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
  (relu1): ReLU()
  (conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
  (relu2): ReLU()
)

3. nn.ModuleList

一些常用方法:

  • append():在ModuleList后面添加网络层
  • extend():拼接两个ModuleList
  • insert():指定ModuleList中位置插入网络层
import torch.nn as nn
class MyNet(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])

    def forward(self, x):
        # ModuleList can act as an iterable, or be indexed using ints
        for i, l in enumerate(self.linears):
            x = self.linears[i // 2](x) + l(x)
        return x

myNet = MyNet()
print(myNet)

输出:

MyModule(
  (linears): ModuleList(
    (0): Linear(in_features=10, out_features=10, bias=True)
    (1): Linear(in_features=10, out_features=10, bias=True)
    (2): Linear(in_features=10, out_features=10, bias=True)
    (3): Linear(in_features=10, out_features=10, bias=True)
    (4): Linear(in_features=10, out_features=10, bias=True)
    (5): Linear(in_features=10, out_features=10, bias=True)
    (6): Linear(in_features=10, out_features=10, bias=True)
    (7): Linear(in_features=10, out_features=10, bias=True)
    (8): Linear(in_features=10, out_features=10, bias=True)
    (9): Linear(in_features=10, out_features=10, bias=True)
  )
)

4. nn.ModuleDict

一些常用方法:

  • clear(): 清空ModuleDict
  • items(): 返回可迭代的键值对(key-value pairs)
  • keys(): 返回字典的键(key)
  • values(): 返回字典的值(value)
  • pop(): 返回一对键值,并从字典中删除
  • update():添加dict、OrderedDict或者ModuleDict结构。
import torch.nn as nn
class MyNet(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.choices = nn.ModuleDict({
                'conv': nn.Conv2d(10, 10, 3),
                'pool': nn.MaxPool2d(3)
        })
        self.activations = nn.ModuleDict([
                ['lrelu', nn.LeakyReLU()],
                ['prelu', nn.PReLU()]
        ])

    def forward(self, x, choice, act):
        # x = self.choices[choice](x)
        # x = self.activations[act](x)
        return x
    
my_net = MyNet()
print(my_net)

输出如下,forward不管怎么设计,都不能很好的打印出my_net网络。

MyModule(
  (choices): ModuleDict(
    (conv): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1))
    (pool): MaxPool2d(kernel_size=3, stride=3, padding=0, dilation=1, ceil_mode=False)
  )
  (activations): ModuleDict(
    (lrelu): LeakyReLU(negative_slope=0.01)
    (prelu): PReLU(num_parameters=1)
  )
)

5. 自行设计网络

(1)使用python的list添加(不可行)

import torch.nn as nn
class MyNet(nn.Module):
    def __init__(self):
        super(net_modlist, self).__init__()
        self.modlist = [
                       nn.Conv2d(1, 20, 5),
                       nn.ReLU(),
                        nn.Conv2d(20, 64, 5),
                        nn.ReLU()
                        ]

    def forward(self, x):
        for m in self.modlist:
            x = m(x)
        return x

my_net = MyNet()
print(my_net)

print('====================================')
for param in my_net.parameters():
    print(type(param.data), param.size())

输出如下,可以看到使用 Python 中的list形式添加卷积层和它们的 parameters 并没有自动注册到我们的网络中。

net_modlist()
====================================

(2)手动添加(可行)

也可以手工挨个的添加网络。

import torch.nn as nn
class MyNet(nn.Module):
    def __init__(self):
        super(net_modlist, self).__init__()
        self.conv2d_1 = nn.Conv2d(1, 20, 5)
        self.ReLU = nn.ReLU()
        self.conv2d_2 = nn.Conv2d(20, 64, 5),

    def forward(self, x):
        x = self.conv2d_1(x)
        x = self.ReLU(x)
        x = self.conv2d_2(x)
        x = self.ReLU(x)
        return x

my_net = MyNet()
print(my_net)

print('====================================')
for param in my_net.parameters():
    print(type(param.data), param.size())

输出如下,可以看到手动设置也可以把添加的卷积层和它们的 parameters 注册到我们的网络中。

net_modlist(
  (conv2d_1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
  (ReLU): ReLU()
)
====================================
<class 'torch.Tensor'> torch.Size([20, 1, 5, 5])
<class 'torch.Tensor'> torch.Size([20])

参考:
nn.Sequential官网
nn.ModuleList官网
nn.ModuleDict官网

Pytorch深度学习(1) -- 建模基础 Pytorch深度学习 -- 建模相关1 模型构建1.1 模型构造1.1.1 继承`Module`类来构造模型1.1.2 `Module`的子类1.1.2.1 `Sequential`类1.1.2.2 `ModuleList`类1.1.2.3 `ModuleDict`类1.1.3 构造复杂的模型1.1小结1.2 模型参数的访问、初始化和共享1.2.1 访问模型参数1.2.2 初始化模型参数1.2.... 阅读详情

相关推荐

pytorch中nn.Sequential详解

nn.Sequential是一个序列容器,用于搭建神经网络的模块被按照被传入构造器的顺序添加到容器中。除此之外,一个包含神经网络模块的OrderedDict也可以被传入nn.Sequential()容器中。利用nn.Sequential()搭建好模型架构,模型前向传播时调用forward()方法,模型接收的输入首先被传入nn.Sequential()包含的第一个网络模块中。然后,第一个网络模块的输出传入第二个网络模块作为输入,按照顺序依次计算并传播,直到nn.Sequential()里的最后一个模块输出结果

十年以上架构设计经验,专注于软件架构和人工智能领域,对机器视觉、NLP、音视频等领域都有涉猎 1万+

Python神经网络模型--Sequential应用举例

本篇文章都是Sequential应用的例子 如果想要了解模型,可以先看一下这篇文章: Sequential模型详解 下面是样例展示: 这里有几个可以帮助你开始的例子! 在 examples 目录 中,你可以找到真实数据集的示例模型: CIFAR10 小图片分类:具有实时数据增强的卷积神经网络 (CNN) IMDB 电影评论情感分类:基于词序列的 LSTM Reuters 新闻主题分类:多层感知器 (MLP) MNIST 手写数字分类:MLP 和 CNN 基于 LSTM 的字符级文本生成 基于多层感知器

查数菇乐园 1万+

大麦网抢票协议逆向分析:从Web安全到高并发风控实战

在当今高并发Web应用场景下,理解网络协议交互与反爬虫机制是后端开发和系统架构设计的核心技能。其基本原理涉及客户端与服务器之间通过HTTP/HTTPS协议进行数据交换,关键环节包括请求参数构造、身份认证与会话管理。这一技术的核心价值在于保障系统安全与公平性,通过动态令牌、签名算法及设备指纹等多重手段,有效抵御自动化脚本攻击。典型应用场景包括票务系统、电商秒杀等需要严格管控资源访问的高并发业务。本文以热门票务平台为例,深入剖析其**请求链与令牌体系**及**行为生物特征分析**等风控策略,通过实战演示协议逆向

weixin_34354173的博客 442

PyTorch基础模块nn.Sequential

nn.Sequential模块学习

weixin_45653897的博客 6730

BeikeShop跨境电商独立站系统V1.5.0免授权全开源版

BeikeShop 一款开源好用的跨境电商系统,BeikeShop 是基于 Laravel 开发的一款开源商城系统,主要面向外贸/跨境电商行业提供商品管理、订单管理、会员管理、支付、物流、系统管理等功能。BeikeShop商城 Beike多语言商城 多货币商城B2C商城系统 代码100%开源 PHP商城系统 H5/PC商城 跨境电商系统 跨境商城系统 电商商城系统 Laravel 9 框架插件化开发,MVC架构 支持插件市场。Event 机制实现Hook功能,自定义可视化装修。

809

头歌 JAVA 桥接模式实验

这样,通过客户端代码配置不同的 FileConvertor 子类和 DataHandler 子类(如 OracleHandler 或 SQLServerHandle),即可实现从不同数据库读取数据并转换成不同格式的功能,而无需修改已有代码。

m0_74091276的博客 3185

【Pytorch使用】Sequential、ModuleList 与 ModuleDict 的设计与取舍

PyTorch提供了三种主要模块容器来组织神经网络结构:nn.Sequential、nn.ModuleList和nn.ModuleDict。nn.Sequential适用于固定顺序的线性结构,自动处理前向传播;nn.ModuleList仅存储模块顺序,需要手动定义forward逻辑,适合动态或复杂结构;nn.ModuleDict通过字典提供更灵活的模块访问。选择合适容器对编写清晰、可维护的模型代码至关重要:Sequential适合简单线性结构,而ModuleList和ModuleDict更适合需要动态控制或

Rabbit_QL的博客 949

【异常】解决JDK21升级中的SecurityException: JCE无法验证BC提供者问题

本文详细解析了JDK21升级中常见的SecurityException: JCE无法验证BC提供者问题的根源与解决方案。核心在于JDK21强化了JCE安全验证,导致签名不合规的老版本Bouncy Castle库被拒绝。文章提供了通过Maven依赖树精准定位、排除旧版本并引入兼容的bcprov-jdk18on新库的完整步骤,以及清理缓存等实战技巧,帮助开发者彻底解决此兼容性问题。

weixin_29197051的博客 481

PyTorch 容器类详解:nn.Sequential、nn.ModuleList 与 nn.ModuleDict

容器类核心特点适用场景顺序执行多个层简单的、线性的网络结构,层与层之间是严格的顺序依赖关系。类似 list 管理层需要动态创建、管理一组网络层,或对多个层进行统一操作(如共享参数的层组)。类似 dict 管理层(键值对)需要为层命名,或根据键动态选择不同的层分支。在实际的模型构建中,我们可以根据网络结构的复杂度和灵活性需求,选择合适的容器类,甚至将它们结合起来使用,以构建出强大且灵活的神经网络模型。

sweet_ran的博客 1066

别再硬拔了!用这3个终端命令轻松搞定Mac上移动硬盘‘被程序占用’的问题

本文介绍了3个终端命令解决Mac上移动硬盘‘被程序占用’的问题,包括使用`diskutil list`定位硬盘、`lsof`查找占用进程以及`diskutil unmount`安全卸载。这些方法能有效避免数据风险,提升操作效率,特别适合开发者和技术爱好者。

weixin_33507732的博客 290

大模型微调框架之TRL

近年来,大语言模型(LLMs)的快速发展推动了下游应用的繁荣,但如何高效地对这些模型进行对齐和微调,依然是研究与应用的热点。Hugging Face 开源的 TRL(Transformer Reinforcement Learning) 框架,提供了基于强化学习的语言模型训练方法,并支持 SFT(监督微调)、PPO(近端策略优化)、DPO(直接偏好优化)等多种方式,是目前对齐和微调 LLM 的重要工具。

和大家一起涨芝士 891

PyTorch|保存及加载模型、nn.Sequential、ModuleList和ModuleDict

在保存一般检查点时,不仅仅是保存模型的state_dict,还包括保存优化器的state_dict、停止使用的时间,最近记录的训练损失,外部的torch.nn.Embedding层等等。如果输入的是一个字典,init函数会采用遍历字典的方式,如果是一个一个的模块,init函数也会针对性的采取其他遍历方法。nn.Sequential是有序的,当实例化nn.Sequential时,传入的模块顺序就是神经网络前向传播的顺序。对于一个模型的输入,nn.Sequential会依次的过其中的子模块。

weixin_47748259的博客 1937

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 800

PyTorch C++ 前端容器模块完全指南:Sequential、ModuleList、ModuleDict 与参数容器

本文以 PyTorch 官方文档 [Containers](https://link.gitcode.com/i/82e8b4f660b9c89b060f0964fde86178) 为骨架,系统讲解 C++ 前端(libtorch)中 `torch::nn::Sequential`、`ModuleList`、`ModuleDict`、`ParameterList` 与 `ParameterDict

gitblog_00278的博客 1917

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1572

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【PyTorch】模型构造:Module 和其子类Sequential、ModuleList、ModuleDict

0. 导入用到的库 import torch import torch.nn as nn from collections import OrderedDict 1. 继承Module构造和访问模型 Module 类是 torch.nn 模块里提供的⼀个模型构造类,是所有神经⽹络模块的基类,我们可以继承它来定义我们想要的模型。 只需重写 forward方法 class MLP(nn.Module): def __init__(self, **kwargs): su.

qq_19655645的博客 632

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

pytorch的python API略读--Sequential/ModuleList/ModuleDict

作者:机器视觉全栈er 网站:cvtutorials.com torch.nn.Sequential:序列容器,顾名思义,就是将构造函数中的子模块会按照你定义的序列顺序被添加到模块中。这里有个注意的小点,要注意区分Sequential和torch.nn.ModuleList,后者就是一个简单的列表,里面的元素是模块,但是模块之间是孤立的,前者则是互相连通的模块。还是以上面的网络模块为例,使用Sequential可以实现快速搭建: import torch.nn as nn import torch c.

机器视觉全栈er的博客 1904

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

pytorch的容器Sequential、Modulelist、ModuleDict用法介绍

nn.Module   容器   Sequential import torchimport torchvisionimport torch.nn as nnfrom collections import OrderedDict class LeNetSequential(nn.Module):    def __init__(self, class...

wangxuecheng666的博客 447

笔记5:pytorch 中的Module与容器(Sequential、Modulelist、ModuleDict)

nn.Module 容器 Sequential import torch import torchvision import torch.nn as nn from collections import OrderedDict class LeNetSequential(nn.Module): def __init__(self, classes): ...

David's Tweet 2010

别再傻傻分不清了!PyTorch中Sequential、ModuleList、ModuleDict到底怎么选?

本文深入解析PyTorch中Sequential、ModuleList和ModuleDict三种容器的核心差异与适用场景,通过真实案例展示如何根据网络架构需求选择最佳容器。从设计哲学到实战技巧,帮助开发者避免常见陷阱,提升模型构建效率与代码可维护性,特别适合需要处理动态深度学习模式的场景。

weixin_30321709的博客 245

pytorch容器之nn.Sequential, nn.ModuleList, nn.ModuleDict介绍

pytorch容器之nn.Sequential, nn.ModuleList, nn.ModuleDict介绍

chase 2666

【PyTorch】4-模型定义(Sequential、ModuleList/ModuleDict、模型块组装、修改模型、模型保存和读取)

Module类是torch.nn模块里提供的一个模型构造类 (nn.Module),是网络模型的基类。

m0_65787507的博客 1371

pytorch模型容器Containers nn.ModuleDict、nn.moduleList、nn.Sequential

模型容器Containers之nn.ModuleDict、nn.moduleList、nn.Sequential nn.Sequential()对象 建立nn.Sequential()对象,必须小心确保一个块的输出大小与下一个块的输入大小匹配。基本上,它的行为就像一个nn.Module。 模型建立方式 第一种写法: nn.Sequential()对象.add_module(层名,层class的实例) net1 = nn.Sequential() net1.add_module('conv', nn.Co

发呆的比目鱼的博客 1753

PyTorch容器模块详解:Sequential、ModuleList、ModuleDict选型与实战

在深度学习模型开发中,如何高效组织网络结构是工程实践的核心问题。PyTorch作为主流深度学习框架,提供了nn.Sequential、nn.ModuleList与nn.ModuleDict三种容器模块,分别以有序流水线、列表遍历和字典映射的方式管理子模块。理解它们背后的参数注册机制,是避免模型训练时参数不被优化的关键。这三种工具不仅影响代码的可读性与可维护性,更决定了动态网络、多分支结构、多任务头等复杂场景的实现效率。本文从工程实战角度,对比三种容器的适用边界,结合Transformer编码器、多任务模型等

weixin_33391446的博客 263

PyTorch容器选型指南:Sequential、ModuleList与ModuleDict深度解析

在深度学习模型构建中,如何高效组织子模块并确保参数被正确优化是工程实践的核心问题。PyTorch通过Module的自动注册机制,让所有子模块对parameters()、state_dict()等操作透明可见,而Sequential、ModuleList和ModuleDict正是这一机制下的三种典型容器。理解它们的设计差异,不仅关乎代码可读性,更直接影响模型能否正常训练。Sequential适合线性堆叠,自动串联前向逻辑;ModuleList提供灵活的索引访问,适用于动态层数或循环结构;ModuleDict则

weixin_27889245的博客 139
上一篇: 【点云处理技术之open3d】第四篇:使用open3d绘制常用类型——箭头、圆柱、长方体、球形、箭头、坐标轴和线条
下一篇: python的一些常用内置函数(内建函数)详解
非晚非晚
博客等级 码龄10年 4万+粉丝 222原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值