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

news2024/12/23 17:17:00

目录

前言

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 nn

class 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 x

model = SimpleNet()

详细步骤:

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

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

2.使用nn.Sequential容器

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

示例:

import torch.nn as nn

model = 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 x

model = 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 x

model = 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.表格总结

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

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

相关文章

基于Springboot/Vue的企业内部培训考试系统

本系统不开源! 本系统不开源! 本系统不开源! 前言: 时间宝贵的朋友直接跳过这段进入主题吧。 首先,好久没有静心写点东西了,有些经验之谈、生活经历以及一些规划和感悟吧,大体写一下就当自我…

Linux下编译安装PETSc

本文记录在Linux编译安装PETSc的流程。 1 下载代码 git clone https://gitlab.com/petsc/petsc.git cd ./petsc git checkout v3.21.4 2 安装依赖 3 PETSc Without MPI 3.1 Debug版本 3.1.1 配置 export PETSC_ARCHarch-linux-c-debug-dto python3 ./configure --prefix/…

水凝胶与柔性电子啥关系?能用来干啥?

大家好,今天我们来聊一聊一篇关于水凝胶在柔性电子领域应用的文章——《Smart materials for flexible electronics and devices: hydrogel》发表于《RSC Advances》。随着科技的不断发展,柔性电子设备越来越受到关注,而水凝胶作为一种具有独…

python-小理和01串(赛氪OJ)

[题目描述] 小理有一个 01 串,串中只包含 0 和 1 ,小理要把这个串划分成连续的 m 段,使得每一段至少包含一个 0 和一个 1 。小理想最大化 m ,m 最大是多少呢?输入格式: 输入包含一行一个 01 串 S 。保证中至…

OpenCV绘图函数详解及其用法示例

MFC类库中的CDC类有划线,画矩形,画椭圆,画多边形,文字等绘图函数,OpenCV也有类似的绘图函数。二者的区别在于MFC画图是在一定的区域内绘制图形,而OpenCV则是在图像上绘制,主要用于图像标注。 OpenCV的常用绘图函数有arrowedLine,circle ,drawContours, drawMarker, dra…

Date.now()与performance.now()

前言 Date.now() 和 performance.now() 都是 JS 中用于获取当前时间的方法,本文将讲述二者的区别与优劣。 Date.now() 返回自 Unix 时间纪元(1970年1月1日 00:00:00 UTC)以来的毫秒数。 在大多数环境下,Date.now() 的精度为 1毫…

Spring Cloud Consul精选面试题及答案

Spring Cloud Consul 面试题及答案: 1. 什么是Spring Cloud Consul? 答:Spring Cloud Consul 是一个基于 Spring Boot 和 Spring Cloud 的微服务框架,用于实现服务发现、配置中心和负载均衡等功能。Consul 是 HashiCorp 公司开源…

【C/C++】Sleep()函数详解

🦄个人主页:修修修也 🎏所属专栏:Linux ⚙️操作环境:Visual Studio 2022 / Xshell (操作系统:CentOS 7.9 64位) 目录 📌Windows系统下Sleep()函数简介 🎏函数功能 🎏函数参数 🕹️DWORD milliseconds &…

连Llama3都坐冷板凳,市场正在抛弃开源模型

Llama3被亚马逊、微软“打入冷宫”,罪在开源? 俗话说,是骡子是马,牵出来溜溜就知道。 最近,开源大模型届的“汗血宝马”Llama3,似乎要露馅了。 据美国媒体The Information报道,在全球最大云计…

2024.8.24

130124202408241009 DATE #:20240824 ITEM #:DOC WEEK #:SATURDAY DAIL #:捌月廿壹 TAGS < BGM "风屿&#xff0d;&#xff0d;闫东炜" > < theme oi-graph theory > < [NULL] > < [空] > < [空] > 与风为名&#xff0c;屿之齐鸣。…

MFC工控项目实例之六CFile添加菜单栏

本程序基于前期我的博客文章《MFC工控项目实例之五CFile类读写系统参数》 添加两个对话框如下 具体添加菜单栏参考我的博客文章MFC_ CFile类实现下拉菜单读写实例&#xff08;源码下载&#xff09; 这里给出相关代码 在 SEAL_PRESSURE.h文件中添加 #include <afxtempl.…

github源码指引:共享内存、数据结构与算法

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码目录&#xff1a;shmfc 相…

一键拼图神器CollageIt,让你的照片秒变艺术大作!

前言 嘿&#xff0c;你是否曾对着满屏的照片发愁&#xff0c;想要快速整理成精美的作品集&#xff0c;却又被繁琐的排版搞得头昏脑涨&#xff1f;如果有一款神器&#xff0c;能让你一键搞定这些烦恼&#xff0c;轻松提升办公效率&#xff0c;是不是觉得升职加薪的曙光就在眼前…

Python 进度条tqdm应用记录

tqdm 简介 tqdm 是一个非常流行的 Python 库&#xff0c;用于快速添加进度条到循环中。它可以方便地集成到脚本中&#xff0c;并且支持多种类型的迭代器。 安装 首先确保你安装了 tqdm。如果还没有安装&#xff0c;可以通过 pip 安装它&#xff08;如果要在 jupyter noteboo…

游戏开发设计模式之单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;其主要目的是确保一个类在整个程序的生命周期中只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。在游戏开发中&#xff0c;单例模式具有广泛的应用和重要的作用。 单例模式的…

如何评估Redis的性能

如果系统中出现了大 key、热 key 等&#xff0c;往往会导致 Redis 变慢&#xff0c;但是这个慢该如何界定&#xff1f;多久算慢&#xff1f;1秒还是3秒&#xff1f; 这个肯定是没有标准答案&#xff0c;因为这个和你的硬件设备有关。 硬件差一些&#xff0c;平时响应时间都是…

OSPF路由原理详解与关键点

目录 一. OSPF简介: 二. OSPF原理描述: 三. OSPF的核心内容: 四. OSPF的邻居关系和邻接 五. LSA在各区域中传播的支持情况 一. OSPF简介: 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&…

打造编程学习的知识宝库:高效笔记与整理技巧

在编程的海洋中&#xff0c;知识的深度和广度都是难以估量的。要想在这片海洋中航行而不迷失方向&#xff0c;一个高效的笔记系统是不可或缺的。本文将探讨如何建立一个既能快速记录又易于回顾的笔记系统&#xff0c;以及如何在繁忙的学习中保持笔记的条理性。 目录 一、确定笔…

数三角形(二)》-筛除法斜线结论

算法思路&#xff1a; 1、一个直观的思路是筛除法&#xff0c;即&#xff1a;答案总数-三点共线的种数 总数易求得&#xff0c;为组合数C((n1)*(m1),3)&#xff0c;考虑到n、m数值范围&#xff0c;考虑用long long。 2、三点共线的情况有&#xff1a; &#xff08;1&#xff09…

Linux驱动学习之按键读取

按键读取我们需要实现read函数&#xff0c; read 函数的 第二个参数被__user 修饰&#xff0c;原则上在内核层我们不能直接访问&#xff0c;需要调用 copy_to_user()这个函数&#xff0c;从内核获取数据到上层。 copy_to_user(void __user volatile * to, const void * from,…