当前位置: 首页 > news >正文

Pytorch构建网络模型结构都有哪些方式

目录

前言

1.使用nn.Module基类

2.使用nn.Sequential容器

3. 使用nn.ModuleList

4. 使用nn.ModuleDict

5. 混合使用nn.Module和原生Python代码

6.表格总结


前言

  • nn.Module:最通用、最灵活的方式,适用于几乎所有场景。
  • nn.Sequential:适合简单的顺序模型,代码简洁。
  • nn.ModuleListnn.ModuleDict:适合需要动态调整层的模型,方便子模块的管理和访问。
  • 混合使用原生Python代码:适合需要动态逻辑或复杂决策的网络模型。

这些方式可以根据具体项目需求进行选择,通常,nn.Module是最常用的方式,它能够满足几乎所有的模型设计需求。

1.使用nn.Module基类

这是最常用的方法之一。你可以通过继承nn.Module基类来定义自己的神经网络。nn.Module提供了神经网络层的封装以及模型参数的管理。

示例:

import torch
import torch.nn as nnclass SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc1 = nn.Linear(784, 128)self.relu = nn.ReLU()self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return xmodel = SimpleNet()

详细步骤:

  • __init__方法:在这里定义网络层。self.fc1 = nn.Linear(784, 128) 表示创建了一个输入大小为784、输出大小为128的全连接层。
  • forward方法:定义了数据的前向传播方式。输入数据依次通过定义的各个层,最后得到输出。

优点:灵活,适合复杂网络。

2.使用nn.Sequential容器

如果你的模型是一个简单的顺序网络(即各层按顺序逐个执行,没有复杂的网络结构),可以使用nn.Sequential来简化代码。

示例:

import torch.nn as nnmodel = nn.Sequential(nn.Linear(784, 128),nn.ReLU(),nn.Linear(128, 10)
)

详细步骤:

  • nn.Sequential接受一系列的层作为参数,并按顺序逐个应用于输入数据。
  • 各个层之间的前向传播方式自动处理,减少了手动编写forward方法的工作。

优点:简洁,适合简单的线性模型。

3. 使用nn.ModuleList

nn.ModuleList可以用来存储一个nn.Module的列表,但不会定义网络的前向传播逻辑,需要在forward方法中手动实现。

class CustomNet(nn.Module):def __init__(self):super(CustomNet, self).__init__()self.layers = nn.ModuleList([nn.Linear(100, 100) for i in range(5)])self.relu = nn.ReLU()def forward(self, x):for layer in self.layers:x = self.relu(layer(x))return xmodel = CustomNet()

详细步骤:

  • 使用nn.ModuleList存储多个相同或不同的层。
  • forward方法中循环这些层,自定义前向传播逻辑。

优点:适合需要灵活定义多个子层的网络结构。

4. 使用nn.ModuleDict

nn.ModuleDictnn.ModuleList类似,但它以字典的形式存储模块,允许通过键值对的方式来访问不同的子模块。

class CustomNet(nn.Module):def __init__(self):super(CustomNet, self).__init__()self.layers = nn.ModuleDict({'fc1': nn.Linear(784, 128),'fc2': nn.Linear(128, 64),'fc3': nn.Linear(64, 10)})self.relu = nn.ReLU()def forward(self, x):x = self.relu(self.layers['fc1'](x))x = self.relu(self.layers['fc2'](x))x = self.layers['fc3'](x)return xmodel = CustomNet()

详细步骤:

  • 使用nn.ModuleDict来存储模块,可以通过键值访问。
  • 灵活构建前向传播路径,适合需要不同路径的网络结构。

优点:适合需要动态访问或选择子模块的网络。

5. 混合使用nn.Module和原生Python代码

在某些情况下,你可能需要在模型中嵌入一些动态的逻辑。此时,可以将nn.Module与原生Python控制流(如if-elsefor循环等)结合使用,构建更加复杂的模型。

class DynamicNet(nn.Module):def __init__(self):super(DynamicNet, self).__init__()self.fc1 = nn.Linear(784, 128)self.fc2 = nn.Linear(128, 10)self.relu = nn.ReLU()def forward(self, x):if x.mean() > 0.5:x = self.fc1(x)else:x = self.fc2(x)return self.relu(x)model = DynamicNet()

详细步骤:

  • forward中使用Python原生的控制流来决定前向传播路径。
  • 这种方式非常灵活,适合复杂的模型逻辑需求。

优点:灵活且强大,适合复杂模型。

6.表格总结

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 通过C# 读取PDF页面大小、方向、旋转角度
  • 攀高行为检测识别摄像机
  • JavaWeb系列四: DOM 上
  • 多线程篇(基本认识 - 线程相关API)(持续更新迭代)
  • 数学建模笔记(四):熵权
  • 排序算法-堆排序
  • 甲方(北汽)渗透测试面试经验分享
  • Nginx: 负载均衡场景下上游服务器异常时的容错机制
  • github访问加速项目@一键部署自动更改host修改加速Github访问
  • k8s调度器Scheduler
  • Lodash——JavaScript中的工具库
  • buuctf [MRCTF2020]hello_world_go
  • 速盾:服务器接入cdn后上传图片失败怎么解决?
  • 主控和从控!!!
  • (二) 初入MySQL 【数据库管理】
  • @jsonView过滤属性
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • ECMAScript6(0):ES6简明参考手册
  • JAVA 学习IO流
  • JavaScript-Array类型
  • JS字符串转数字方法总结
  • Nacos系列:Nacos的Java SDK使用
  • NSTimer学习笔记
  • Python利用正则抓取网页内容保存到本地
  • Theano - 导数
  • Vue.js源码(2):初探List Rendering
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里云Kubernetes容器服务上体验Knative
  • 后端_MYSQL
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 我的zsh配置, 2019最新方案
  • 进程与线程(三)——进程/线程间通信
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • !$boo在php中什么意思,php前戏
  • #、%和$符号在OGNL表达式中经常出现
  • (~_~)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (论文阅读11/100)Fast R-CNN
  • (区间dp) (经典例题) 石子合并
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (一)、python程序--模拟电脑鼠走迷宫
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • .jks文件(JAVA KeyStore)
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net 4.0发布后不能正常显示图片问题
  • .net core使用EPPlus设置Excel的页眉和页脚