nn.Sequential()

本文介绍了nn.Sequential在PyTorch中的作用,如何通过该类将卷积层、BN层和激活函数组合成一个层次结构,简化模型构建过程。通过实例展示了如何创建一个包含多个层级的神经网络模块并实现前向传播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • nn.Sequential的作用
  • 示例

nn.Sequential的作用

定义:一个序列容器,用于搭建神经网络的模块被按照被传入构造器的顺序添加到nn.Sequential()容器中。

使用:通过nn.Sequential()将卷积层,BN层和激活函数层封装在一个层中,输入x经过卷积、BN和ReLU后直接输出激活函数作用之后的结果。

示例

from torch import nn


class net(nn.Module):
    def __init__(self, in_channel, out_channel):
        super(net, self).__init__()
        self.layer1 = nn.Sequential(nn.Conv2d(in_channel, in_channel / 4, kernel_size=1),
                                    nn.BatchNorm2d(in_channel / 4),
                                    nn.ReLU())
        self.layer2 = nn.Sequential(nn.Conv2d(in_channel / 4, in_channel / 4),
                                    nn.BatchNorm2d(in_channel / 4),
                                    nn.ReLU())
        self.layer3 = nn.Sequential(nn.Conv2d(in_channel / 4, out_channel, kernel_size=1),
                                    nn.BatchNorm2d(out_channel),
                                    nn.ReLU())
        
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        
        return x

### nn.Sequential 的定义与用法 `nn.Sequential` 是 PyTorch 中的一个容器类,用于按顺序堆叠多个神经网络层或操作。它简化了模型的构建过程,使得开发者能够以更直观的方式组合不同的 `nn.Module` 子模块[^3]。 #### 定义方式 可以通过两种主要方法来定义 `nn.Sequential`: 1. **传递一系列子模块作为参数** 可以直接将多个子模块传入 `nn.Sequential` 构造函数中。 2. **通过字典形式指定名称和对应的子模块** 使用有序字典 (`OrderedDict`) 来命名每一层的操作,这种方式更适合调试和可视化。 #### 示例代码 以下是使用 `nn.Sequential` 的两个典型例子: ```python import torch.nn as nn import torch.nn.functional as F # 方法一:简单地传递子模块 model = nn.Sequential( nn.Conv2d(1, 20, kernel_size=5), nn.ReLU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(20, 40, kernel_size=5), nn.ReLU(), nn.MaxPool2d(kernel_size=2) ) # 方法二:使用 OrderedDict 命名每一步 from collections import OrderedDict sequential_model = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(1, 20, 5)), ('relu1', nn.ReLU()), ('pool1', nn.MaxPool2d(2)), ('conv2', nn.Conv2d(20, 40, 5)), ('relu2', nn.ReLU()), ('pool2', nn.MaxPool2d(2)) ])) ``` 上述两段代码的功能完全相同,区别仅在于后者提供了更为清晰的层次结构描述[^3]。 #### 特性和注意事项 - **自动调用前向传播** 当实例化了一个 `nn.Sequential` 对象后,在其内部会自动生成一个默认的 `forward()` 函数,该函数按照添加子模块的顺序依次执行每一个操作[^4]。 - **灵活性不足** 如果某些层之间存在复杂的逻辑关系或者条件分支,则不适合单纯依赖于 `nn.Sequential`,此时应考虑手动实现 `forward()` 方法[^3]。 - **支持动态修改架构** 能够随时增删其中包含的组件,这为实验不同配置下的性能表现带来了便利。 --- ### 结合实际案例分析 假设我们需要设计一个多任务学习框架并利用流行库完成特征提取、微调等工作时,可以借助 `nn.Sequential` 组织基础部分[^1]。例如下面展示如何基于预训练权重快速搭建分类器: ```python class MultiTaskModel(nn.Module): def __init__(self, num_classes): super(MultiTaskModel, self).__init__() # 共享主干网路 backbone_layers = [ nn.Linear(in_features=784, out_features=256), nn.BatchNorm1d(num_features=256), nn.ReLU() ] self.shared_backbone = nn.Sequential(*backbone_layers) # 不同的任务头 task_heads = [] for i in range(len(num_classes)): head = nn.Sequential( nn.Dropout(p=0.5), nn.Linear(in_features=256, out_features=num_classes[i]) ) setattr(self, f'task_head_{i}', head) # 动态绑定成员变量 task_heads.append(head) def forward(self, x): features = self.shared_backbone(x.view(-1, 784)) # 展平输入 outputs = {} for idx, head in enumerate(task_heads): outputs[f'class_{idx}'] = getattr(self, f'task_head_{idx}')(features) return outputs ``` 此范例展示了多任务场景下共享表示以及独立预测路径的设计思路[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值