pytorch-nn.Module

1. nn.Module

是所有nn.类的父类,其中包括nn.Linear nn.BatchNorm2d nn.Conv2d nn.ReLU nn.Sigmoid等等

2. nn.Sequential容器

如下图,定义一个net网络,将所有继承自nn.Module的子类定义的网络层加入到了nn.Sequential容器中,与一层一层的单独调用模块组成序列相比,nn.Sequential() 可以允许将整个容器视为单个模块(即相当于把多个模块封装成一个模块),forward()方法接收输入之后,nn.Sequential()按照内部模块的顺序自动依次计算并输出结果。因此可以利用nn.Sequential()搭建模型架构

在这里插入图片描述

3. 网络参数parameters

如下图,通过net.parameters()可以获取到net的参数,转换成list后,通过index访问第几个参数,比如:图中的list(net.named_parameters())[0]就可以获取到网络的第一个参数,也就是网络第一层的w参数。
通过list(net.named_parameters()).items()获取到所有网络层,从获取结果可以看到,每一层都被pytorch命名了,比如:‘0.weight’,‘0.bias’,即第一层网络的weight和bias.
在这里插入图片描述

4. Modules内部管理

与根节点相连的直系亲属叫children,其他再与children连接的节点都叫modules
如下图,nn.Sequential是Net的children,其他的是modules,包括nn.ReLU、nn.Linear、BasicNet
在这里插入图片描述
从下面这张截图可以看出,Net本身和Children也都是modules
在这里插入图片描述

5. checkpoint

为了防止train过程意外停止,需从头train的问题,train过程需要定期保持checkpoint,而一旦出现train意外停止,就可以从最后一次checkpoint接着训练。
torch.save保存checkpoint
torch.load_state_dict(torch.load(‘chpt.md’))用于load checkpoint
在这里插入图片描述

6. train/test状态切换

所有nn.类都继承自nn.Module,因此在切换train和test状态时,只需要调用一次net.train()或net.eval即可,而不需要那些train和test(dropout)行为不一致的类每个单独去切换.
在这里插入图片描述

6. 实现自己的网络层

6.1 实现打平操作

全连接层层需要打平输入,打平操作通过.view方法实现,由于Flatten继承自nn.Module,因此可以直接放到nn.Sequential中。
在这里插入图片描述

6.2 实现自己的线性层

通过net.parameters()可以将网络参数加到优化器中。
在这里插入图片描述
troch.tensor是不会自动加到nn.parameters中,因此需要使用nn.Parameter将tensor加到nn.parameters,从而才能加到SGD等优化器中。

在这里插入图片描述

7. 代码

import  torch
from    torch import nn
from    torch import optim

class MyLinear(nn.Module):

    def __init__(self,
### PyTorch 中 `nn.Module` 的使用方法 #### 定义神经网络模型 `nn.Module` 是 PyTorch 提供的一个基类,用于定义神经网络模型。通过继承此基类并重写其构造函数 (`__init__`) 和前向传播函数 (`forward`) 来创建自定义的神经网络模型[^3]。 ```python import torch.nn as nn import torch.nn.functional as F class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 初始化卷积层和其他组件 self.conv1 = nn.Conv2d(in_channels=1, out_channels=20, kernel_size=5) self.conv2 = nn.Conv2d(in_channels=20, out_channels=20, kernel_size=5) def forward(self, x): # 前向传播逻辑 x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) return x ``` 在此示例中,`SimpleCNN` 类继承了 `nn.Module` 并实现了两个主要部分: - **初始化阶段**:在 `__init__` 方法内完成,负责设置各种层对象(如卷积层),这些对象会被自动注册到模块内部以便后续管理和优化。 - **前向计算过程**:由 `forward` 函数描述,接收输入张量 `x` 并返回经过一系列变换后的输出张量。这里采用了激活函数 `F.relu()` 对每一层的结果进行了非线性转换[^4]。 #### 构建复杂结构 除了简单的单一层级外,`nn.Module` 还支持构建更为复杂的层次化架构。这可以通过组合多个子模块来实现,甚至可以嵌套其他 `nn.Module` 实例形成更深的层级关系[^5]。 例如,在上述基础上进一步扩展模型时,可以在新的类里引入更多类型的层或操作,并将它们合理组织起来构成完整的网络体系。 #### 参数管理与持久化 值得注意的是,基于 `nn.Module` 创建的对象不仅能够轻松地访问所有可学习参数,还提供了便捷的方法来进行状态保存和恢复工作。这意味着开发者可以直接利用内置接口高效处理模型权重文件的操作而不必手动编码繁琐的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值