pytorch学习(十四)层结构容器

本篇文章列举了nn.Sequential,nn.ModuleList,nn.ModuleDict三个容器的使用方法,并且还学习了一种使用类封装模块的方法。通过本篇博客的学习,你将学习到三个容器和使用类构建容易的方法。

1.nn.Sequential

第一种方法直接列出每一层结构,第二种方法通过add_module的方式堆叠层,第三种方法使用字典的方式对层进行组织,第四种方法通过LIST列表的方式先堆叠层,然后再用sequential来骄傲如每一层,*表示拆散成一个一个的。

import torch
import torch.nn as nn
from collections import OrderedDict#Sequential 1 直接添加网络层
net1 = nn.Sequential(nn.Conv2d(3,6,kernel_size=5,padding=2),nn.Conv2d(6, 12, kernel_size=3, padding=1),nn.BatchNorm2d(12),nn.ReLU()
)print('***************Sequential 1********************')
print(net1)#Sequential 2 先定义容器,后添加网络层
net2 = nn.Sequential()
net2.add_module("conv1", nn.Conv2d(3,6,kernel_size=5,padding=2))
net2.add_module("conv2", nn.Conv2d(6, 12, kernel_size=3, padding=1))
net2.add_module("bn1", nn.BatchNorm2d(12))
net2.add_module("relu", nn.ReLU())print('***************Sequential 2********************')
print(net2)#Sequential 3 使用有序字典添加网络结构
net3 = nn.Sequential(OrderedDict([("conv1",nn.Conv2d(3,32,3,1,1)),("conv2", nn.Conv2d(32, 32, 3, 1, 1)),("Relu1", nn.ReLU()),("pool", nn.MaxPool2d(2))
]))print('****************Sequential 3*******************')
print(net3)#Sequential 4 使用有序字典添加网络结构
layers = []
layers.append(nn.Conv2d(3,32,3,1,1))
layers.append(nn.Conv2d(32, 32, 3, 1, 1))
layers.append(nn.ReLU())
layers.append(nn.MaxPool2d(2))
net4 = nn.Sequential(*layers)
print('*****************Sequential 4******************')
print(net4)

2.nn.ModuleList

第一种方法也是直接列出来,第二种方法使用了列表的方式。


#ModuleList 如果添加了extend,虽然使用更加灵活,但是整体上不是那么直观
model = nn.ModuleList([nn.Conv2d(3, 6, kernel_size=5, padding=2),nn.Conv2d(6, 12, kernel_size=3, padding=1),nn.BatchNorm2d(12),nn.ReLU()
])
model.extend([nn.Linear(12,12) for i in range(2)])
model.extend([nn.Linear(12,10)])
print('*****************ModuleList 1******************')
print(model)make_layers = []
def make_module(idx):layer = []layer.append(nn.Conv2d(3,16,3,1,1))layer.append(nn.BatchNorm2d(16))return nn.Sequential(*layer)for i in range(3):make_layers.append(make_module(i))net_moduleList = nn.ModuleList(make_layers)
print('*****************ModuleList 2******************')
print(net_moduleList)

3.nn.ModuleDict

使用字典的方式,在forward中通过传入参数的形式确定所采用的激活函数和模型


#ModuleDict
class MyModuleDict(nn.Module):def __init__(self):super(MyModuleDict,self).__init__()self.choices = nn.ModuleDict({"conv1":nn.Conv2d(10,12,3,1,1),"pool":nn.MaxPool2d(2)})self.activates = nn.ModuleDict({"relu":nn.ReLU(),"leakyRelu":nn.LeakyReLU(),"sigmoid":nn.Sigmoid()})def forward(self,x,choice,acti):x = self.choices[choice](x)x = self.activates[acti](x)return x
net_moduleDict = MyModuleDict()
print('*****************ModuleDict 1******************')
print(net_moduleDict)

4.类包裹的方法

对采用重复层(参数不同,代码相同)的局部模型,可以用一个类进行封装,每一通过传入参数来构建一个处理模块。


class ContinuousConv(nn.Module):def __init__(self,in_channels, out_channels, pre_batch_norm = True):super(ContinuousConv, self).__init__()self.in_channels = in_channelsself.out_channels = out_channelsif pre_batch_norm:self.ConvFoward = nn.Sequential(nn.BatchNorm2d(self.in_channels),nn.ReLU(),nn.Conv2d(self.in_channels,self.out_channels,3,padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(self.out_channels,self.out_channels,3,padding=1))else:self.ConvFoward = nn.Sequential(nn.Conv2d(self.in_channels,self.out_channels,3,padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(self.out_channels,self.out_channels,3,padding=1))def forward(self,x):x = self.ConvFoward(x)return xclass UNetPlusPlus(nn.Module):def __init__(self, num_class, deep_supervision=False):super(UNetPlusPlus,self).__init__()self.num_classes = num_classself.deep_supervision = deep_supervisionself.filters = [64, 128,256,512,1024]self.conv3_1 = ContinuousConv(512*2,512,pre_batch_norm=True)self.conv2_2 = ContinuousConv(256*3,256,pre_batch_norm=True)self.conv2_1 = ContinuousConv(256*2,256,pre_batch_norm=True)def forward(self,x):x = self.conv2_1(x)x = self.conv3_1(x)return xdeep_supervision = True
model_class = UNetPlusPlus(num_class=3,deep_supervision=deep_supervision)
print(model_class)print('*****************class wrap******************')
print(model_class)

5.总的代码

通过查看print的网络结构,可以看到每一个网络的结构

import torch
import torch.nn as nn
from collections import OrderedDict#Sequential 1 直接添加网络层
net1 = nn.Sequential(nn.Conv2d(3,6,kernel_size=5,padding=2),nn.Conv2d(6, 12, kernel_size=3, padding=1),nn.BatchNorm2d(12),nn.ReLU()
)print('***************Sequential 1********************')
print(net1)#Sequential 2 先定义容器,后添加网络层
net2 = nn.Sequential()
net2.add_module("conv1", nn.Conv2d(3,6,kernel_size=5,padding=2))
net2.add_module("conv2", nn.Conv2d(6, 12, kernel_size=3, padding=1))
net2.add_module("bn1", nn.BatchNorm2d(12))
net2.add_module("relu", nn.ReLU())print('***************Sequential 2********************')
print(net2)#Sequential 3 使用有序字典添加网络结构
net3 = nn.Sequential(OrderedDict([("conv1",nn.Conv2d(3,32,3,1,1)),("conv2", nn.Conv2d(32, 32, 3, 1, 1)),("Relu1", nn.ReLU()),("pool", nn.MaxPool2d(2))
]))print('****************Sequential 3*******************')
print(net3)#Sequential 4 使用有序字典添加网络结构
layers = []
layers.append(nn.Conv2d(3,32,3,1,1))
layers.append(nn.Conv2d(32, 32, 3, 1, 1))
layers.append(nn.ReLU())
layers.append(nn.MaxPool2d(2))
net4 = nn.Sequential(*layers)
print('*****************Sequential 4******************')
print(net4)#ModuleList 如果添加了extend,虽然使用更加灵活,但是整体上不是那么直观
model = nn.ModuleList([nn.Conv2d(3, 6, kernel_size=5, padding=2),nn.Conv2d(6, 12, kernel_size=3, padding=1),nn.BatchNorm2d(12),nn.ReLU()
])
model.extend([nn.Linear(12,12) for i in range(2)])
model.extend([nn.Linear(12,10)])
print('*****************ModuleList 1******************')
print(model)make_layers = []
def make_module(idx):layer = []layer.append(nn.Conv2d(3,16,3,1,1))layer.append(nn.BatchNorm2d(16))return nn.Sequential(*layer)for i in range(3):make_layers.append(make_module(i))net_moduleList = nn.ModuleList(make_layers)
print('*****************ModuleList 2******************')
print(net_moduleList)#ModuleDict
class MyModuleDict(nn.Module):def __init__(self):super(MyModuleDict,self).__init__()self.choices = nn.ModuleDict({"conv1":nn.Conv2d(10,12,3,1,1),"pool":nn.MaxPool2d(2)})self.activates = nn.ModuleDict({"relu":nn.ReLU(),"leakyRelu":nn.LeakyReLU(),"sigmoid":nn.Sigmoid()})def forward(self,x,choice,acti):x = self.choices[choice](x)x = self.activates[acti](x)return x
net_moduleDict = MyModuleDict()
print('*****************ModuleDict 1******************')
print(net_moduleDict)class ContinuousConv(nn.Module):def __init__(self,in_channels, out_channels, pre_batch_norm = True):super(ContinuousConv, self).__init__()self.in_channels = in_channelsself.out_channels = out_channelsif pre_batch_norm:self.ConvFoward = nn.Sequential(nn.BatchNorm2d(self.in_channels),nn.ReLU(),nn.Conv2d(self.in_channels,self.out_channels,3,padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(self.out_channels,self.out_channels,3,padding=1))else:self.ConvFoward = nn.Sequential(nn.Conv2d(self.in_channels,self.out_channels,3,padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(self.out_channels,self.out_channels,3,padding=1))def forward(self,x):x = self.ConvFoward(x)return xclass UNetPlusPlus(nn.Module):def __init__(self, num_class, deep_supervision=False):super(UNetPlusPlus,self).__init__()self.num_classes = num_classself.deep_supervision = deep_supervisionself.filters = [64, 128,256,512,1024]self.conv3_1 = ContinuousConv(512*2,512,pre_batch_norm=True)self.conv2_2 = ContinuousConv(256*3,256,pre_batch_norm=True)self.conv2_1 = ContinuousConv(256*2,256,pre_batch_norm=True)def forward(self,x):x = self.conv2_1(x)x = self.conv3_1(x)return xdeep_supervision = True
model_class = UNetPlusPlus(num_class=3,deep_supervision=deep_supervision)
print(model_class)print('*****************class wrap******************')
print(model_class)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux shell(上)

几个常用的shell命令 file 命令是一个方便的小工具,能够探测文件的内部并判断文件类型 file .bashrc # 检查文件 file Document # 检查目录df命令可以方便地查看所有已挂载磁盘的使用情况 du 命令可以显示某个特定目录(默认情况下是当前目录&#xff0…

大模型涉及到的知识点

1. 基础数学和统计学 **线性代数:**矩阵运算、特征值与特征向量、奇异值分解等。 **微积分:**导数和积分、链式法则、梯度下降法等。 **概率与统计:**概率分布、期望与方差、最大似然估计、贝叶斯定理等。 2. 机器学习基础 监督学习&#xf…

【BUG】已解决:python setup.py bdist_wheel did not run successfully.

已解决:python setup.py bdist_wheel did not run successfully. 目录 已解决:python setup.py bdist_wheel did not run successfully. 【常见模块错误】 解决办法: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主…

在Django项目中创建Django App

进入code虚拟环境 .\.venv\Scripts\activate创建demoapp python demo/manage.py startapp demoapp

Neuralink首款产品Telepathy:意念控制设备的革新与挑战

近年来,科技领域不断涌现出令人惊叹的突破,其中尤以脑机接口(BCI)技术为代表。近日,Elon Musk的Neuralink公司发布了其首款脑机接口产品Telepathy,引发了广泛关注。本文将详细探讨Telepathy的功能、技术原理…

十、继承

十、继承 继承的基本概念使用继承的原因继承的用途继承的注意事项继承的基本使用定义基类定义派生类使用派生类的对象注意事项示例:构造函数和析构函数的调用 继承基本规则继承方式注意事项示例 赋值兼容原则继承中的同名成员成员变量成员函数总结 继承中的静态成员…

PCIe总线-RK3588 PCIe平台驱动分析(十)

1.简介 RK3588 PCIe RC和EP使用同一个平台驱动,其主要的作用是解析设备树中的资源、初始化中断、使能电源、初始化PHY、使能时钟和释放复位,然后根据compatible属性初始化RC或者EP驱动。 2.入口 平台驱动的定义如下,当compatible属性为&qu…

【hadoop大数据集群 1】

hadoop大数据集群 1 文章目录 hadoop大数据集群 1一、环境配置1.安装虚拟机2.换源3.安装工具4.安装JDK5.安装Hadoop 一、环境配置 折腾了一下午/(ㄒoㄒ)/~~ 1.安装虚拟机 参考视频:https://www.bilibili.com/video/BV18y4y1G7JA?p17&vd_sourcee15e83ac6b22a…

C语言:静态库和动态(共享)库

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 在软件开发中,库(Library)是一个至关重要的概念。它们是由函数和数据的集合构成,用于实现特定的功能,供其他程…

使用Vuepress搭建个人网站

网站地址:bloggo.chat

vue中怎么改变状态值?

在Vue中,状态值通常指的是组件的data函数返回的对象中的属性,或者是Vuex状态管理库中的状态。以下是在Vue中改变状态值的几种常见方法: 1. 直接在组件内部改变状态值 在Vue组件中,你可以直接在methods中改变data函数返回的对象中…

MySQL学习作业二

作业描述 SQL语言 建库,使用库 mysql> create database mydb8_worker;#新建库mysql> use mydb8_worker; 建表,查看表 #建表 mysql> create table t_worker(department_id int(11) not null comment部门号,worker_id int(11) primary key no…

无人机足球比赛技术详解

一、无人机类型参数 在无人机比赛中,不同类型的无人机因其独特的参数配置而表现出不同的性能。这些参数包括但不限于: 1. 机体尺寸:小型无人机适合室内或狭窄空间比赛,而大型无人机则更适用于室外大场地赛事。 2. 动力系统&…

动态路由协议 —— EIGRP 与 OSPF 的区别

EIGRP(增强内部网关路由协议)和 OSPF(开放式最短路径优先)是两种最常见的动态路由协议,主要是用来指定路由器或交换机之间如何通信。将其应用于不同的情况下,可提高速率、延迟等方面的性能。那么它们之间到…

装修前需要提前准备啥

雅静说装修前自备15材料,才不会手慌脚乱      省的师父用的时候我们还得着急到处跑,关键质量和价格还没得选      1,保护膜,一开工就把入户门,电梯口的墙都包好      不然装完就像这样,磕碰的到处是口子      2,钥匙密码盒,有时候上班我们不在,师父或送材料的一…

IO多路复用-select的使用详解【C语言】

1.多进程/线程并发和IO多路复用的对比 IO多路转接也称为IO多路复用,它是一种网络通信的手段(机制),通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据…

【数据结构进阶】二叉搜索树

🔥个人主页: Forcible Bug Maker 🔥专栏: C || 数据结构 目录 🌈前言🔥二叉搜索树🔥 二叉搜索树的实现Insert(插入)find(查找)erase(删除)destro…

firefly rk3288 ubuntu23.10 网卡名为end0 改为eth0

1、内核源码修改u-boot/include/env_default.h文件第32行的bootargs参数,修改后: "bootargs net.ifrenames0 " CONFIG_BOOTARGS "\0"2、修改rootfs里的lib/systemd/network/99-default.link文件: [M…

分布式锁、Lua脚本、redisson、运行lua脚本优化代码

20240721 一、分布式锁1. 什么是分布式锁2. 分布式锁的实现3. 基于redis的分布式锁4 总结 二、对于lua脚本可以保证事务,要么成功要么失败。1. 在redis中调用lua脚本 三、Redisson1 步骤2. Redisson的总结3. 几种分布式锁的区别 三、优化我们的秒杀1. 我们在创建优惠…

Docker安装笔记

1. Mac安装Docker 1.1 Docker安装包下载 1.1.1 阿里云 对于10.10.3以下的用户 推荐使用 对于10.10.3以上的用户 推荐使用 1.1.2 官网下载 系统和芯片选择适合自己的安装包 1.2 镜像加速 【推荐】阿里镜像 登陆后,左侧菜单选中镜像加速器就可以看到你的专属地…