核心要点

  • Sequential 自带 forward,按添加顺序逐层把上一层输出喂给下一层,无需手写

  • Sequential 本身就是 nn.Module 的子类,二者是「特例」而非「对立」关系

  • 残差、多分支、多输入输出等非线性拓扑只能靠自定义 Module 手写 forward 表达

  • 选型经验:纯线性堆叠的 MLP/特征提取栈用 Sequential,ResNet/U-Net/Transformer 用自定义 Module

标准回答

nn.Sequentialnn.Module特化子类,将子模块按添加顺序串联:

python
model = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Linear(256, 10),
)
out = model(x)  # 依次通过各层

自定义 nn.Module(残差等复杂结构):

python
class ResBlock(nn.Module):
    def __init__(self, dim):
        super().__init__()
        self.fc = nn.Linear(dim, dim)
    def forward(self, x):
        return F.relu(self.fc(x)) + x  # 残差

对比

Sequential 自定义 Module
forward 自动串联 手动定义
适用 线性栈 残差、多输入、条件
灵活性

关系:Sequential Module 的子类;nn.ModuleList 只负责注册子模块、不提供 forward,动态堆叠时仍要自己写循环调用。选型:简单 MLP/CNN 特征提取栈 → Sequential;ResNet、U-Net、Transformer → 自定义 Module。

常见误区

⚠️ 常见踩坑

想用 Sequential 实现残差 x+block(x)——Sequential 只能把每层输出单向传给下一层,拿不到「跳过若干层的原始输入」,硬塞会得到错误结构;另一个误区是以为 Sequential 和 Module 是两种并列写法,实际它就是 Module 子类,可以被自定义 Module 当作子模块嵌套使用。

追问

追问 1Sequential 能嵌套吗?

能。Sequential 是 Module,可以把一个 Sequential 作为元素放进另一个 Sequential,也可作为子模块放进自定义 Module。常见做法是把每个 stage 封成一个 Sequential,再组合成大网络,结构更清晰。

追问 2ModuleList 和 Sequential 区别?

两者都能持有一组子模块并被正确注册(参数能被 .parameters() 收集),但 ModuleList 没有 forward,调用时要自己写循环决定顺序与逻辑;Sequential 自带顺序 forward。需要条件分支或跳连用 ModuleList,纯顺序用 Sequential。

追问 3如何访问 Sequential 中某一层?

可用整数下标 model[0]、切片 model[1:3],或在构造时传入 OrderedDict 给层命名后用 model.conv1 访问。下标方式最常用于取出中间特征或替换某一层。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具