pytorch之nn.Module使用介绍

news2024/9/20 6:25:26

在 PyTorch 中,nn.Module 是所有神经网络模型的基类,提供了许多重要的成员函数。以下是一些常用的成员函数及其功能:

1. __init__(self)

描述:初始化模块。在用户定义的模型中,通常用来定义层和其他模块。

示例:

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv = nn.Conv2d(1, 16, 3)

2. forward(self, *input)

描述:定义前向传播逻辑。必须实现此方法,用于定义如何通过模型进行推理。

示例:

def forward(self, x):
    return self.conv(x)

3. parameters(self, recurse=True)

描述:返回模型中所有可学习参数的迭代器。可以选择是否递归到子模块。

示例:

for param in model.parameters():
    print(param.shape)

4. named_parameters(self, recurse=True)

描述:与 parameters() 类似,但是返回一个包含参数名称和值的元组。

示例:

for name, param in model.named_parameters():
    print(name, param.shape)

5. modules(self)

描述:返回模型中所有子模块的迭代器。

示例:

for module in model.modules():
    print(module)

6. named_modules(self, memo=None, prefix='')

描述:返回一个包含模块名称和实例的迭代器,可以使用 memo 防止循环引用。

示例:

f =  open("model_modules.txt","w")
for k, v in model.named_modules():
   f.write("{}\n".format(k))
   f.write("{}\n".format(v))
f.close()

保存内容(部分,yolov8n)如下:

7. train(self, mode=True)

描述:设置模块为训练模式或评估模式。训练模式会启用 Dropout 和 BatchNorm 等层的训练行为。

示例:

model.train()  # 训练模式

model.eval()   # 评估模式

8. to(self, *args, **kwargs)

描述:将模型及其参数移动到指定设备(如 GPU、CPU)或转换为指定数据类型。

示例:

model.to('cuda')  # 移动到 GPU

9. load_state_dict(self, state_dict, strict=True)

描述:加载模型的状态字典。可以控制是否严格匹配参数名。

示例:

model.load_state_dict(torch.load('model.pth'))

10. state_dict(self)

描述:返回模型的状态字典,包含所有可学习参数和缓冲区的状态。

示例:

with open(wts_file, 'w') as f:
    f.write('{}\n'.format(len(model.state_dict().keys())))
    for k, v in model.state_dict().items():
        print("key={0}, v={1}".format(k,v))
        vr = v.reshape(-1).cpu().numpy()
        f.write('{} {} '.format(k, len(vr)))
        for vv in vr:
            f.write(' ')
            f.write(struct.pack('>f', float(vv)).hex())

保存内容(部分)如下:

11. apply(self, fn)

描述:递归地将函数 fn 应用到模块及其子模块中。常用于初始化参数或修改子模块的行为。

示例:

def init_weights(m):
    if isinstance(m, nn.Linear):
        nn.init.normal_(m.weight, mean=0, std=0.01)
        
model.apply(init_weights)

12. forward_hooks

描述:在前向传播过程中,可以注册钩子函数以在输入和输出之间修改数据。

使用示例:

def hook_fn(module, input, output):
    print(f'Input: {input}, Output: {output}')

hook = model.conv.register_forward_hook(hook_fn)

13. backward_hooks

描述:在反向传播过程中,可注册钩子函数以修改梯度。

使用示例:

def backward_hook(module, grad_input, grad_output):
    print(f'Grad Input: {grad_input}, Grad Output: {grad_output}')

hook = model.conv.register_backward_hook(backward_hook)

14. trainable

描述:可以通过设置 requires_grad 属性控制哪些参数参与训练。

示例:

for param in model.parameters():
    param.requires_grad = False  # 冻结参数

15. extra_repr(self)

描述:可以重写此方法以添加额外的模块描述信息。通常在调用 print(model) 时会显示。

示例:

def extra_repr(self):
    return f"Input size: {self.input_size}, Output size: {self.output_size}"

16.高级用法

16.1 自定义损失函数:

通过继承 nn.Module 来定义自定义损失函数。

class MyLoss(nn.Module):
    def __init__(self):
        super(MyLoss, self).__init__()

    def forward(self, output, target):
        return torch.mean((output - target) ** 2)  # 均方误差

16.2 使用预训练模型:

可以利用 torchvision.models 中的预训练模型,并根据需求修改模型。

import torchvision.models as models

model = models.resnet18(pretrained=True)
model.fc = nn.Linear(model.fc.in_features, num_classes)  # 替换最后一层

16.3 模型集成:

可以通过将多个模型结合在一起,创建一个更复杂的模型。

class EnsembleModel(nn.Module):
    def __init__(self, model1, model2):
        super(EnsembleModel, self).__init__()
        self.model1 = model1
        self.model2 = model2

    def forward(self, x):
        return (self.model1(x) + self.model2(x)) / 2  # 平均结果

16.4 序列模型:

通过 nn.Sequential 构建简单的线性网络。

model = nn.Sequential(
    nn.Conv2d(1, 16, 3),
    nn.ReLU(),
    nn.Linear(16 * 6 * 6, 10)
)

总结:

        nn.Module 提供了许多常用的功能,方便构建和管理神经网络模型。了解这些成员函数有助于更有效地使用 PyTorch 进行深度学习任务

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

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

相关文章

【hot100篇-python刷题记录】【最大子数组和】

R5-普通数组 印象题,讲思路: 1.0个元素,返回0 2.将从left到right的计算简化为为left-mid,mid1-right 以及left-mid-right 3者的最大值(因为有负数) 3.上面左右两边的计算可以递归调用本身函数&#xff0…

第二十二节、创建人物状态栏

一、可视化插件 在层级面板名字加上对应的图标,会显示颜色,需要运行一下 二、UI 1、创建一个画布 由于使用新的新输入系统,需要替换一下 2、设置锚点 作用是:当屏幕分辨率更改后,ui图标不会位移 3、设置填充 4、制…

tomcat 运行javaweb项 提示无法将资源添加到Web应用程序缓存解决方法

javaweb项目tomcat启动提示web资源缓存不足,具体如下,不影响项目运行 15-Aug-2024 13:35:20.200 警告 [localhost-startStop-1] org.apache.catalina.webresources.Cache.getResource 无法将位于[/WEB-INF/classes/web-vue2/ssdev/ux/login/style/font/f…

2000-2022年 上市公司代理成本(原始数据、上市公司代理成本的最终结果、do文件,参考文献等等)

上市公司代理成本(2000-2022年) 上市公司的代理成本是公司治理中一个重要的概念,它涉及到公司内部不同利益相关者之间的利益冲突和协调问题。主要包含以下几个方面: 监督成本:股东为了确保经理人的行为符合公司和股东的…

VR游戏移植到Apple Vision Pro的技术挑战与解决方案

核心观点: 30Hz手部追踪在90Hz游戏中的适配 是最大挑战,需要创新性解决方案。Vision Pro的独特架构 要求重新思考着色器编译和缓存策略。全沉浸模式下的空间音频实现 需要自定义解决方案。早期适配 可能面临技术限制,但也带来市场先机。学习指南: 深入研究Vision Pro的手部…

分代回收机制

分代回收机制 JVM分代回收策略 JVM分代回收策略就是Java 虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代、老年代,永久代,不过永久代在JDK1.8永久移除了,被元空间取代了 新生代 新生代主要是用来…

【docker】docker compose进阶

docker compose docker compose简介docker compose yaml格式1、docker-compose部署tomcat2、docker-compose部署mysql3、docekr-compose部署lnmp项目需求准备依赖文件、配置nginx配置mysql配置php编写docker-compose.yml配置mysql 4、容器部署registry,进行容器上传…

Springboot+公寓信息服务小程序—计算机毕业设计源码无偿分享需要私信20481

摘要 本论文主要论述了如何使用springboot开发一个公寓信息服务小程序,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述公寓信息服务小程序的当前背景以及系统开发的目的,后续…

STL介绍以及string类

什么是STL 是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 为什么要学习string类 C语言中的字符串 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便&am…

3-4 RGB LED(智能应用篇)

3-4 RGB LED(智能应用篇) 3-4 RGB LEDRGB-LED及电路示例程序效果演示 3-4 RGB LED Led的灯珠和灯带,相当于点和线(可以画出丰富否画面) 主要介绍led灯珠 RGB-LED及电路 RGB-LED可以发出红、绿、蓝色的光芒&#xff0…

Flutter 09 Future 和 Stream

一、Future 和 Stream 是处理异步操作的两个重要概念: Future: Future 用于表示一个延迟操作的值或错误,即异步操作的结果。通过 Future,可以在异步操作完成后获取其结果。可以使用 async 和 await 关键字来处理 Future&#xf…

Cisco Catalyst 8000v Edge Software, IOS XE Release IOSXE-17.14.01a ED

Cisco Catalyst 8000v Edge Software, IOS XE Release IOSXE-17.14.01a ED Cisco Catalyst 8000V 边缘软件 - 虚拟路由器 请访问原文链接:https://sysin.org/blog/cisco-catalyst-8000v/,查看最新版。原创作品,转载请保留出处。 作者主页&…

Redis笔记-分布式存储方案中哨兵模式配置

以前在系统分析师中学习到了Redis哨兵模式,只知道其中基本概念,但不知道怎么去配这个,今天看到某项目,特意记录下其配置过程。哨兵模式比主从模式,更具有容错性。 Redis分布式存储方案 分布式存储方案 核心特点 主从…

centos 7.9 迁移到 openEuler22.03-LTS-SP3

openEuler移植案例 | 移植操作指南 | openEuler社区官网 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要两台机器, 不通过原因 在待升级节点检查是否有安装x2openEuler-core时, 发现已经安装了,不能作为升级节点。该节点为: 解…

开发日记:Object-c 中的 NSString 和 NSMutableString的常用方法

今天讲不可变数组 NSArray 可变数组 NSMutableArray。话不多说,直接上干货。 oc中的数组 可变数组 NSMutableArray使用初始化方法创建可变数组使用便利构造器创建可变数组可变数组追加元素可变数组追加一个不可变数组可变数组删除一个元素可变数组删除指定下标的元素…

IPD推行成功的核心要素(十七)矩阵型组织架构设计实现多组织协同以便快速抓取市场机会

随着企业规模不断增长,业务越来越复杂,组织架构对企业高效运作的影响也越来越大。加之企业所处的市场环境瞬息万变,机会稍纵即逝。传统金字塔型的组织架构,完全无法满足这样快速灵活的要求。而IPD体系设计了产品线(IPM…

decoy靶机复现

靶机设置 设置网卡ens33 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机ip为192.168.112.149 端口扫描 nmap 192.168.112.149 -p- -sV -O -Pn 访问浏览器 默认是8080,需要更改为80端口 下载好之后发现解压需要密码 破解密码 将该安装包放到kali中…

配置Prettier+Vscode setting提高前端开发效率

前言 大家好,上一篇一文读懂 系列的文章中我们介绍了前端的代码格式化校验工具ESLient。代码格式是进行自动校验了,但你还要一个个的微调,很麻烦不是吗? 本文介绍和ESLient配合使用的Prettier实现编译器自动将代码格式化。 同时也…

Nat Methods编委:积极探索AI与生物学交叉的高质量基于人工智能方法的论文发表|顶刊速递·24-08-19

小罗碎碎念 今天分享的这篇文献(特刊)发表于《Nat Methods》,目前IF36.1。 分享这篇文献是临时做的决定,因为在朋友圈看到有关这篇特刊的介绍,对标题很感兴趣,所以我立刻找到对应的文章来详细分析一下。 在…

Leetcode JAVA刷刷站(35)搜索插入位置

一、题目概述 二、思路方向 为了实现这一功能,我们可以使用二分查找的变种来找到目标值或确定其应插入的位置。在二分查找过程中,我们不仅检查中间元素是否等于目标值,还根据比较结果更新搜索的上下界。如果目标值大于中间元素,则…