1、nn.Sequential

模块按照顺序进行排列的,确保输入与输出模块的通道数相同(实际上是feature map数量)。

nn.Sequential写法有3种:

第一种写法:

创建nn.Sequential()对象并用add_module方法添加

  self.con2=nn.Sequential()self.con2.add_module('conv',nn.Conv2d(16,32,3,1,1))self.con2.add_module('relu',nn.ReLU())self.con2.add_module('bn',nn.BatchNorm2d(32))self.con2.add_module('pool',nn.MaxPool2d(2,2))

第二种写法:

nn.Sequential(*多个层class的实例)

self.con1=nn.Sequential(nn.Conv2d(3,16,3,1,1),nn.ReLU(),nn.BatchNorm2d(16),nn.MaxPool2d(2,2))

第三种写法:

nn.Sequential(OrderedDict([*多个(层名,层class的实例)]))

  self.con3=nn.Sequential(OrderedDict([('con',nn.Conv2d(32,64,3,1,1)),('bn',nn.BatchNorm2d(64)),('relu',nn.ReLU()),('pool',nn.MaxPool2d(2,2))]))

2、nn.ModuleList

nn.ModuleList仅仅类似于pytho中的list类型,只是将一系列层装入列表,并没有实现forward()方法,因此也不会有网络模型产生的副作用。nn.ModuleList接受的必须是subModule类型,即不管ModuleList包裹了多少个列表,内嵌的所有列表的内部都要是可迭代的Module的子类。参考

 #列表需要遍历self.liner=nn.ModuleList([nn.Linear(64*56*56,1000),nn.Linear(1000,1000),nn.Linear(1000,10)])for liner in self.liner:ly4=liner(ly4)

3、nn.Sequential与nn.ModuleList的区别

不同点1:

nn.Sequential内部实现了forward函数,因此可以不用写forward函数。而nn.ModuleList则没有实现内部forward函数。

不同点2:

nn.Sequential可以使用OrderedDict对每层进行命名

不同点3:

nn.Sequential里面的模块按照顺序进行排列的,所以必须确保前一个模块的输出大小和下一个模块的输入大小是一致的。而nn.ModuleList 并没有定义一个网络,它只是将不同的模块储存在一起,这些模块之间并没有什么先后顺序可言。

不同点4:

有的时候网络中有很多相似或者重复的层,我们一般会考虑用 for 循环来创建它们,而不是一行一行地写

查看Pytorch网络的各层输出(feature map)、权重(weight)、偏置(bias)

综上代码如下:

import torch.nn as nn
import torch
from collections import OrderedDict
import cv2
import matplotlib.pyplot as plt
import numpy as npclass mytest(nn.Module):def __init__(self):super(mytest, self).__init__()#第一种写法self.con1=nn.Sequential(nn.Conv2d(3,16,3,1,1),nn.ReLU(),nn.BatchNorm2d(16),nn.MaxPool2d(2,2))# 第二种写法self.con2=nn.Sequential()self.con2.add_module('conv',nn.Conv2d(16,32,3,1,1))self.con2.add_module('relu',nn.ReLU())self.con2.add_module('bn',nn.BatchNorm2d(32))self.con2.add_module('pool',nn.MaxPool2d(2,2))# 第三种写法self.con3=nn.Sequential(OrderedDict([('con',nn.Conv2d(32,64,3,1,1)),('bn',nn.BatchNorm2d(64)),('relu',nn.ReLU()),('pool',nn.MaxPool2d(2,2))]))#列表需要遍历self.liner=nn.ModuleList([nn.Linear(64*56*56,1000),nn.Linear(1000,1000),nn.Linear(1000,10)])# self.liner = nn.Linear(64 * 56 * 56, 1000)def forward(self,x):ly1=self.con1(x)ly2=self.con2(ly1)ly3=self.con3(ly2)ly4=ly3.view(ly3.size()[0],-1)# x=self.liner[0](x)for liner in self.liner:ly4=liner(ly4)return ly1,ly2,ly3,ly4#返回各层结果x=torch.randn(2,3,448,448)
model=mytest()
_,_,_,pred=model(x)
print(pred.shape)
print(model.con1[0])
print(model.con2.pool)
print(model.con3[0])
print(model.con3.relu)
print(model.liner[0])#https://blog.csdn.net/xwmwanjy666/article/details/100927858
img0=cv2.imread('D:/data/testpic/3.jpg')
print(img0.shape)
img=cv2.resize(img0,(448,448))
input=torch.tensor(img).float()#必须转为float类型的数据
input=input.permute(2,0,1)
input=input.unsqueeze(0)#相当于增加一个batch维度
print(input.shape)ly1,ly2,ly3,ly4=model(input)#各层的shape
print(ly1.shape)
print(ly2.shape)
print(ly3.shape)
print(ly4.shape)#各层部分特征图
plt.subplot(3,2,1)
img1_1=ly1.squeeze(0).permute(1,2,0).detach().numpy()
img1_1=img1_1[:,:,:3]#取3个通道显示
# img1_1=img1_1[:,:,0]
# img = np.ascontiguousarray(img, dtype=np.float32)
plt.title("conv1:feature map1")
plt.imshow(img1_1)plt.subplot(3,2,2)
img1_2=ly1.squeeze(0).permute(1,2,0).detach().numpy()
img1_2=img1_2[:,:,3:6]
plt.title("conv1:feature map2")
plt.imshow(img1_2)plt.subplot(3,2,3)
img2_1=ly2.squeeze(0).permute(1,2,0).detach().numpy()
img2_1=img2_1[:,:,:3]
plt.title("conv2:feature map1")
plt.imshow(img2_1)plt.subplot(3,2,4)
img2_2=ly2.squeeze(0).permute(1,2,0).detach().numpy()
img2_2=img2_2[:,:,3:6]
plt.title("conv2:feature map2")
plt.imshow(img2_2)plt.subplot(3,2,5)
img3_1=ly3.squeeze(0).permute(1,2,0).detach().numpy()
img3_1=img3_1[:,:,:3]
plt.title("conv3:feature map1")
plt.imshow(img3_1)plt.subplot(3,2,6)
img3_2=ly3.squeeze(0).permute(1,2,0).detach().numpy()
img3_2=img3_2[:,:,3:6]
plt.title("conv3:feature map2")
plt.imshow(img3_2)#
# plt.imshow(img0)plt.show()

各卷积层特征图

参考:

https://blog.csdn.net/e01528/article/details/84397174

https://zhuanlan.zhihu.com/p/75206669

nn.Sequential与nn.ModuleList相关推荐

  1. PyTorch学习笔记(1)nn.Sequential、nn.Conv2d、nn.BatchNorm2d、nn.ReLU和nn.MaxPool2d

    文章目录 一.nn.Sequential 二.nn.Conv2d 三.nn.BatchNorm2d 四.nn.ReLU 五.nn.MaxPool2d 一.nn.Sequential torch.nn. ...

  2. nn.Sequential nn.ModuleList

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

  3. PyTorch 笔记(16)— torch.nn.Sequential、torch.nn.Linear、torch.nn.RelU

    PyTorch 中的 torch.nn 包提供了很多与实现神经网络中的具体功能相关的类,这些类涵盖了深度神经网络模型在搭建和参数优化过程中的常用内容,比如神经网络中的卷积层.池化层.全连接层这类层次构 ...

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

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

  5. pytorch使用torch.nn.Sequential构建网络

    以一个线性回归的例子为例: 全部代码 import torch import numpy as npdef get_x_y():x = np.random.randint(0, 50, 300)y_v ...

  6. nn.Module、nn.Sequential和torch.nn.parameter学习笔记

    nn.Module.nn.Sequential和torch.nn.parameter是利用pytorch构建神经网络最重要的三个函数.搞清他们的具体用法是学习pytorch的必经之路. 目录 nn.M ...

  7. Pytorch中nn.Module和nn.Sequencial的简单学习

    文章目录 前言 1.Python 类 2.nn.Module 和 nn.Sequential 2.1 nn.Module 2.1.1 torch.nn.Module类 2.1.2 nn.Sequent ...

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

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

  9. nn.Sequential(*modules)

    将写好的模型进行修剪再结合 创建模型model = 巴拉巴拉 modules = list(model.children())# 可以添加索引[] 用于切片 swintransformer = nn. ...

最新文章

  1. HttpHand和HttpModule的详细解释,包括Asp.Net对Http请求的处理流程。
  2. Soldier and Bananas
  3. IOS学习笔记之十七 (NSDate、NSDateFormatter、NSCalendar、NSDateComponents、NSTimer)
  4. LeetCode 217 存在重复元素
  5. resize 按钮不会被伪元素遮盖
  6. 计算机网络( 二十二)-数据链路层(补充)
  7. 分布式全局唯一ID的实现
  8. 电脑ping_Windows系统——ping打开教程
  9. 穿透、击穿、雪崩…Redis这么多问题,如何解决
  10. OFFICE技术讲座:JDK绘制旋转字体的效果(水平)
  11. 【java】java 安全 jaas 文件 何时 解析 以及 怎么解析的
  12. lacp协议文档概要
  13. html表格的基础知识及源代码-尚硅谷
  14. Layer2 DAO基础协议Metis与IDO平台Paid Network达成战略合作
  15. c语言.jpg图片转成数组_JPG图片怎么转换成PDF?可以试试这些转换方法!
  16. tyvj 1027 木瓜地 简单模拟
  17. 扛过字节Java研发岗4轮面试,收到sp offer(月薪35k)!揭秘字节面试流程及考题(附带答案)
  18. c语言作业答,C语言练习作业及答案
  19. iTunes备份文件路径正确修改方法(亲测可用,2018.10.19更新)
  20. 供应思科无线AP 华为无线AP 华三无线AP aruba无线AP ruckus无线AP

热门文章

  1. 盛夏之梦A Dream of Summer 汉化发布[PC+PSP版]
  2. flask项目之5:短信验证码发送
  3. JavaScript(总结完毕)2021.3.7
  4. php画钟,canvas如何绘制钟表的方法_html5教程技巧
  5. 【重识前端】什么是BFC、IFC、GFC 和 FFC
  6. 1.1.8 DR和BDR
  7. 一名优秀的clickbaitor必备的技能XD
  8. 面经系列:2020年联发科技数字IC设计岗
  9. 使用Python在Markdown插入图片并自动获取链接
  10. 【HDU 2612 Find a Way(BFS)】(兼BFS入门笔记)