在介绍nn.Sequential和nn.ModuleDict之前,我们需要知道在pytorch构建的model核心是nn.Module模块,下面举个例子

class model(nn.Module):def __init__(self):super(Model, self).__init__()self.conv = nn.Conv2d(3, 20, 5)def forward(self, x):x = F.relu(conv(x))return x

在了解这个基本概念之后,我们分别介绍这两个模块

nn.Sequential

nn.Sequential继承自nn.Module模块,因此他自带forward函数,下面我们看一个例子

model = nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),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()
)
'''# 给每一步的模块进行命名
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((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()
)
'''input = torch.randn([1, 1, 10, 10])
output = model(input)
print(output.size()) # torch.Size([1, 64, 2, 2])

如上所示,我们可以得到一些结论

  1. 在nn.Sequential里面的每一个操作是逐步执行的,不可改变顺序,如果第一步的输出与第二步的输入不匹配就会报错
  2. 可以通过OrderedDict来改变nn.Sequential里面每一步的名字。注意,即使改变了名字,索引时也需要用0,1,2…,例如model[0]=Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1),model[‘conv1’]会报错

nn.ModuleList

nn.ModuleDict没有继承自nn.Module,所以不能像nn.Sequential那样有forward功能。可以将其看做一个列表的形式,能够将多个操作存放在一个列表里

class MyModule(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 intsfor i, l in enumerate(self.linears):x = self.linears[i](x)return xmodel = MyModule()
input = torch.randn([1, 10])
output = model(input)
print(output.size())  # torch.Size([1, 10])

如上所示,这里总结nn.ModelList的一些特点

  1. nn.ModelList是单纯的列表形式,当我们想快速构建一些操作(例如例子中的linear操作时,可以使用modellist)
  2. nn.ModelList不具备forward功能,所以我们调用里面的操作时,需要进行索引,然后才能运行这个操作
  3. nn.ModelList列表内的操作可以是乱序的,比如我先用list[3],再用list[0],而nn.Sequential的执行顺序不能打乱

为什么不能用python中的list来代替nn.ModelList呢?

因为nn.ModelList可以将里面的列表操作自动注册到整个网络中,但是如果是python的list,则会出问题,如下

class net_modlist(nn.Module):def __init__(self):super(net_modlist, self).__init__()self.modlist = nn.ModuleList([nn.Conv2d(1, 20, 5),nn.Conv2d(20, 64, 5),])def forward(self, x):for m in self.modlist:x = m(x)return xmodel = net_modlist()
for param in model.parameters():print(type(param.data), param.size())'''
nn.ModuleList
<class 'torch.Tensor'> torch.Size([20, 1, 5, 5])
<class 'torch.Tensor'> torch.Size([20])
<class 'torch.Tensor'> torch.Size([64, 20, 5, 5])
<class 'torch.Tensor'> torch.Size([64])将nn.ModuleList换为单纯的list
None # 输出为None,表示conv操作并没有加入到模型参数中
'''

nn.Sequential nn.ModuleList相关推荐

  1. 43_pytorch nn.Module,模型的创建,构建子模块,API介绍,Sequential(序号),ModuleList,ParameterList,案例等(学习笔记)

    1.40.PyTorch nn.Module 1.40.1.模型的创建 1.40.2.构建子模块 1.40.3.nn.Module API介绍 1.40.3.1.核心功能 1.40.3.2.查看模块 ...

  2. nn.Sequential与nn.ModuleList

    1.nn.Sequential 模块按照顺序进行排列的,确保输入与输出模块的通道数相同(实际上是feature map数量). nn.Sequential写法有3种: 第一种写法: 创建nn.Sequ ...

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

    模型容器Containers之nn.ModuleDict.nn.moduleList.nn.Sequential nn.Sequential()对象 建立nn.Sequential()对象,必须小心确 ...

  4. nn.Sequential()

    nn.Sequential nn.Sequential()介绍 Pytorch官网举例 nn.Sequential()的本质作用 nn.Sequential()源码 nn.Sequential()介绍 ...

  5. 【深度学习】torch.nn.Sequential方法介绍

    torch.nn.Sequential是一个Sequential容器,模块将按照构造函数中传递的顺序添加到模块中. 另外,也可以传入一个有序模块. 作用:Sequential除了本身可以用来定义模型之 ...

  6. pytorch 学习笔记:nn.Sequential构造神经网络

    1 两种等价的构造方式 1.1 构建Net类: 1.2 使用torch.nn.Sequential nn.Sequential里面的模块按照顺序进行排列的,所以必须确保前一个模块的输出大小和下一个模块 ...

  7. Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现

    二 架构对参数量/计算量的影响 在自建架构的时候,除了模型效果之外,我们还需要关注模型整体的计算效率.深度学习模型天生就需要大量数据进行训练,因此每次训练中的参数量和计算量就格外关键,因此在设计卷积网 ...

  8. pytorch torch.nn.Sequential(* args)(嘎哈用的?构建神经网络用的?)

    class torch.nn.Sequential(* args) 一个时序容器.Modules 会以他们传入的顺序被添加到容器中.当然,也可以传入一个OrderedDict. 为了更容易的理解如何使 ...

  9. pytorch:nn.Sequential讲解

    接下来想讲一下参数初始化方式对训练的影响,但是必须要涉及到pytorch的自定义参数初始化,然而参数初始化又包括在不同结构定义中初始化方式,因而先讲一下pytorch中的nn.Sequential n ...

最新文章

  1. [云炬python3玩转机器学习笔记] 2-7开发环境搭建笔记
  2. ETL AUTOMATION介绍
  3. 互联网日报 | 7月4日 星期日 | 高途回应招聘团队被裁传闻;恒大半年劲销3568亿领跑行业;吉利发布共同富裕计划行动纲领...
  4. 三星Galaxy Note系列旗舰今年确定缺席:超万名粉丝请愿望其回归
  5. WinForm 设置窗体启动位置在活动屏幕右下角
  6. (转)后监管时代的资本市场,数字金融能否迎来大爆发?
  7. 【数学分析笔记01】平均值不等式证明
  8. BES系列蓝牙开发总结
  9. 全世界最全牛人博客,你可以学习到太多!
  10. 夜神模拟器 Fiddler Tunnel to......443
  11. 前端3D轨迹可视化渲染
  12. 【CPM同步】连续相位调制(CPM)通信调制方法的载波同步和定时同步研究和matlab仿真
  13. 批处理Bat教程-第七章:常用实例 下
  14. Stellarium 0.19.0 发布,开源 3D 天象模拟软件
  15. 为什么我的echarts字体样式这么丑?Echarts 柱状图、饼图 等标签、字体、样式调整
  16. 传说华为面试爱问正则,这不海外留学生校招面试题来了
  17. 2021SC@SDUSC Zxing开源代码(四)QR码的编码(一)
  18. Java项目实战【超级详细】
  19. 【数据结构和算法】赫夫曼树 | 实战演练(二)
  20. vba 批量生成条形图代码

热门文章

  1. mysql 回收高水位_Oracle 高水位(HWM)回收原理及操作方法
  2. 如果让你做技术负责人,你会如何从0搭建公司后端技术栈
  3. 密码学协议举例(一):带有防欺骗的承诺
  4. Java8环境下使用restTemplate单/多线程下载大文件和小文件
  5. Postman API测试工具的使用
  6. java定义数组长度_在JAVA中定义数组时,可不可以一开始不设定数组的长度?
  7. 你迷茫的原因在于读书太少而想的太多!!!
  8. DialogResult的使用一
  9. Linux中$1、$@等含义是什么
  10. 阿里云CDN购买流量包仍旧扣费的问题及解决方法...