nn.Sequential和nn.Module区别与选择

2023-11-05

一、nn.Sequential

torch.nn.Sequential是一个Sequential容器,模块将按照构造函数中传递的顺序添加到模块中。另外,也可以传入一个有序模块。 为了更容易理解,官方给出了一些案例:

# Sequential使用实例

model = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )

# Sequential with OrderedDict使用实例
model = nn.Sequential(OrderedDict([
          ('conv1', nn.Conv2d(1,20,5)),
          ('relu1', nn.ReLU()),
          ('conv2', nn.Conv2d(20,64,5)),
          ('relu2', nn.ReLU())
        ]))

二、nn.Module

下面我们再用 Module 定义这个模型,下面是使用 Module 的模板



class 网络名字(nn.Module):
    def __init__(self, 一些定义的参数):
        super(网络名字, self).__init__()
        self.layer1 = nn.Linear(num_input, num_hidden)
        self.layer2 = nn.Sequential(...)
        ...

        定义需要用的网络层

    def forward(self, x): # 定义前向传播
        x1 = self.layer1(x)
        x2 = self.layer2(x)
        x = x1 + x2
        ...
        return x


注意的是,Module 里面也可以使用 Sequential,同时 Module 非常灵活,具体体现在 forward 中,如何复杂的操作都能直观的在 forward 里面执行

三、对比

为了方便比较,我们先用普通方法搭建一个神经网络。

class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)

    def forward(self, x):
        x = F.relu(self.hidden(x))
        x = self.predict(x)
        return x
net1 = Net(1, 10, 1)

net2 = torch.nn.Sequential(
    torch.nn.Linear(1, 10),
    torch.nn.ReLU(),
    torch.nn.Linear(10, 1)
)

打印这两个net

print(net1)
"""
Net (
  (hidden): Linear (1 -> 10)
  (predict): Linear (10 -> 1)
)
"""
print(net2)
"""
Sequential (
  (0): Linear (1 -> 10)
  (1): ReLU ()
  (2): Linear (10 -> 1)
)
"""

我们可以发现,打印torch.nn.Sequential会自动加入激励函数,
在 net1 中, 激励函数实际上是在 forward() 功能中被调用的,没有在init中定义,所以在打印网络结构时不会有激励函数的信息.

解析源码,在torch.nn.Sequential中:

    def forward(self, input):
        for module in self:
            input = module(input)
        return input

可以看到,torch.nn.Sequential的forward只是简单的顺序传播,操作性有限.

总结

  • 使用torch.nn.Module,我们可以根据自己的需求改变传播过程,如RNN等
  • 如果你需要快速构建或者不需要过多的过程,直接使用torch.nn.Sequential即可。

参考:pytorch官方手册

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nn.Sequential和nn.Module区别与选择 的相关文章

随机推荐

  • 毕业设计 嵌入式 单片机智能路灯

    文章目录 1 简介 2 绪论 2 1 项目背景 2 2 需求分析 3 系统设计 3 1 功能设计 3 1 1 系统角色分析 3 1 2 开发环境 3 2 总体设计 3 3 硬件部分 3 3 1 整体架构 3 3 2 stm32部分 3 3
  • 短视频去水印小程序源码 附带详细搭建教程

    开发语言 PHP 数据库 MySQL 无需授权 文件完全开源 可以二次开发 后台可以自己添加自己的接口 压缩包里包含一个免费 接口 不敢保证能一直使用 下载地址
  • 慌的一批!妹子一个rm -rf把公司服务器数据删没了...

    来源 https www cnblogs com zhouyu629 p 3734494 html 作者 zhouyu 责编 linse 经历了两天不懈努力 终于恢复了一次误操作删除的生产服务器数据 对本次事故过程和解决办法记录在此 警醒自
  • mysql字符串函数

    mysql的字符串函数 对于针对字符串位置的操作 第一个位置被标记为1 1 ASCII str 返回字符串str的最左面字符的ASCII代码值 如果 str是空字符串 返回 0 如果 str是 NULL 返回 NULL mysql gt s
  • 解决bootstrapTable动态添加的一行不会被$(“#bootstrap-table“).bootstrapTable(‘getSelections‘)获取到

    背景 业务需要bootstrapTable表格选中某一行数据 并将按钮表示为可点击状态 当选中多行或没选中数据时设置为不可点击状态 解决 a class btn btn success i class fa fa plus i 所选行下方添
  • (23)[CS13] LSTM Generating:Generating Sequences With Recurrent Neural Networks

    计划完成深度学习入门的126篇论文第二十三篇 UT的Alex Graves等领导研究通过LSTM来生成不同风格的文本和手写体handwriting ABSTRACT INTRODUCTION 摘要 本文通过对一个数据点的预测 说明了LSTM
  • Anaconda(Miniconda) 安装(Windows下)

    下载地址 https www anaconda com download or https conda io miniconda html 下载之后直接安装 可能需要设置路径 之后在cmd中输入 conda list 查看安装内容 如需要更
  • 测试用例的设计方法(七种)详细分析

    1 需求分析法 需求分析法 按照需求 设计测试用例 其中的需求分为两种 用户需求 软件需求 1 验证需求是否正确 完整 无二义性 并且逻辑一致 2 要从 黑盒 的角度 设计出充分并且必要的测试集 以保证设计和代码都能完全符合需求 2 等价类
  • 2023华为OD机试真题【数字游戏】

    题目内容 小明玩一个游戏 系统发1 n张牌 每张牌上有一个整数 第一张给小明 后n张按照发牌顺序排成连续的一行 需要小明判断 后n张牌中 是否存在连续的若干张牌 其和可以整除小明手中牌上的数字 输入描述 输入数据有多组 每组输入数据有两行
  • vue中native的用法

    vue中native的用法 官方解释 你可能想在某个组件的根元素上监听一个原生事件 可以使用 v on 的修饰符 native 举例 比如a标签可以直接绑定原生事件 如果你通过自定义封装了button标签 命名mao button 这时候绑
  • js 取数组对象的交集内容

    一 简单数组 两数组a 1 2 3 b 2 4 5 求a b数组 var a 1 2 3 var b 2 4 5 并集 var union a concat b filter function n return a indexOf n 1
  • vue3+element Plus使用el-tabs标签页,页面刷新不会到默认页(1)

    当我们使用el tabs标签页 在页面刷新后就会回到默认的那一页 如果我们想让页面停留在当前页 可以使用localStorage存储当前页的值 1 引入el tabs
  • vue cli3 性能优化实战

    性能优化 知识追寻者搞了个人站点后 心血来潮来了一波前端性能优化实战 个人站点地址 https zszxz com index 生成分析报告 在 packge json 中引入 analyz vue cli service build mo
  • 企业微信的外部联系人回调处理技巧

    一 关于设置接收事件服务器的信息 在企业微信管理后台的 客户联系 客户 页面 点开 API 小按钮 再点击 接收事件服务器 配置 进入配置页面 要求填写URL Token EncodingAESKey三个参数 URL是企业后台接收企业微信推
  • vbs 文件用于删除符合条件的文件夹

    数据库备份后的文件夹名称为 2011 06 30 2011 07 01 2011 07 02 2011 07 03 2011 07 04 2011 07 05 文件夹内为数据库的备份文件 现考虑只保存最后两天的文件夹 因此 做了一个定时任务
  • go 进阶 RPC相关: 一. RPC 与 Protobuf 基础问题

    目录 一 什么是RPC 1 RPC 实现原理 2 有http为什么还要出现RPC 3 Protobut Protobuf 编码方式 Protobuf 数据存储方式 Protobuf对于数据存储的三大原则 Protobuf 序列化原理 4 其
  • GBDT浅谈以及代码实现

    GBDT作为近年很热门的模型 其性能非常突出 用途也是涵盖了从特征选择到分类 回归 被广大从业者和爱好者所使用 网上关于gbdt的原理和数学推导已经有很多 我就谈谈我个人的浅见 如有错误还望指正 同时还附上我自己实现的简单的python代码
  • MSP430 LCD控制器解释

    CC430F613x的LCD控制器最多能控制160段 The LCD B controller features are Display memory Automatic signal generation Configurable fra
  • 关于微信开发的 appid,openid,unionid

    1 appid 公众号的唯一标识 注册即分配 可在公众号后台查询 用来进行公众号 小程序等的各种交互功能 2 openid 用户的唯一标识 加密后的微信号 对同一公众号 openid唯一 但对于不同公众号 openid不同 用户在关注公众号
  • nn.Sequential和nn.Module区别与选择

    一 nn Sequential torch nn Sequential是一个Sequential容器 模块将按照构造函数中传递的顺序添加到模块中 另外 也可以传入一个有序模块 为了更容易理解 官方给出了一些案例 Sequential使用实例