PyTorch -- nn.Module 快速实践

  • 网络层父类 nn.Module:Evrey Layer is nn.Module (nn.Linear, nn,Conv2d ...)
  • 具体的,我们在定义自已的网络时:需要继承 nn.Module,并重新实现
    • __init__ 方法: 一般放置网络中具有可学习参数的层(如全连接层、卷积层等)
      • 也可放置不具有可学习参数的层(如ReLU、dropout 等);or 直接在 forward 方法 直接用 nn.functional 来代替
      • 除了基础模块,还可以用 nn.Sequential 来定义复合层
    • forward 方法:实现各个层之间的连接关系

经典代码示例:

python3 复制代码
import torch
 
class MyNet(torch.nn.Module):
    def __init__(self):
        super(MyNet, self).__init__()  
        self.conv1 = torch.nn.Conv2d(3, 32, 3, 1, 1)
        self.relu1=torch.nn.ReLU()
        self.max_pooling1=torch.nn.MaxPool2d(2,1)
 
        self.conv2 = torch.nn.Conv2d(3, 32, 3, 1, 1)
        self.relu2=torch.nn.ReLU()
        self.max_pooling2=torch.nn.MaxPool2d(2,1)
 
        self.dense1 = torch.nn.Linear(32 * 3 * 3, 128)
        self.dense2 = torch.nn.Linear(128, 10)
 
    def forward(self, x):
        x = self.conv1(x)
        x = self.relu1(x)  					## 写法一
        # x = torch.relu(x)  			    ## 写法二 (__init__ 中不需要定义 relf.relu1) 
        # x = torch.nn.functional.relu(x)  	## 写法三 (__init__ 中不需要定义 relf.relu1) 
        x = self.max_pooling1(x)
        x = self.conv2(x)
        x = self.relu2(x)
        x = self.max_pooling2(x)
        x = self.dense1(x)
        x = self.dense2(x)
        return x
 
model = MyNet()  

print(model) 的结果如下所示:可参照结果对照理解

MyNet(
  (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu1): ReLU()
  (max_pooling1): MaxPool2d(kernel_size=2, stride=1, padding=0, dilation=1, ceil_mode=False)
  (conv2): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu2): ReLU()
  (max_pooling2): MaxPool2d(kernel_size=2, stride=1, padding=0, dilation=1, ceil_mode=False)
  (dense1): Linear(in_features=288, out_features=128, bias=True)
  (dense2): Linear(in_features=128, out_features=10, bias=True)
)

Module 类的常见方法:
  • .children(), .named_children(): 返回模型的直接子模块,不包括嵌套的子模块

    • 适合快速查看模型的主要组成部分
    python3 复制代码
    >>> list(model.children())[0]
    Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  # 对应 `conv1`
  • .modules(), .named_modules(): 递归遍历模型本身及其所有嵌套的子模块

    • 适合查看模型的完整结构。
    python3 复制代码
    >>> list(model.modules())[0]  
    MyNet(  # 对应模型本身
      (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (relu1): ReLU()
      (max_pooling1): MaxPool2d(kernel_size=2, stride=1, padding=0, dilation=1, ceil_mode=False)
      (conv2): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (relu2): ReLU()
      (max_pooling2): MaxPool2d(kernel_size=2, stride=1, padding=0, dilation=1, ceil_mode=False)
      (dense1): Linear(in_features=288, out_features=128, bias=True)
      (dense2): Linear(in_features=128, out_features=10, bias=True)
    )

此外,使用 nn.Module 定义 model 可以使下列操作方便实现:

  • 可转移到指定 device = torch.device('cuda),使用 model.to(device)
  • 可加载和保存 model 参数:
    • 加载: model.load_state_dict(torch.load('xxx.mdl'))
    • 保存: torch.save(model.state_dict(), 'xxx.del')
  • 可进行状态转化 train/test:model.train()model.eval() 一键切换

相关推荐
皓741几秒前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
coberup8 分钟前
django Forbidden (403)错误解决方法
python·django·403错误
985小水博一枚呀39 分钟前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
龙哥说跨境39 分钟前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
AltmanChan40 分钟前
大语言模型安全威胁
人工智能·安全·语言模型
985小水博一枚呀43 分钟前
【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer·迁移学习
数据与后端架构提升之路1 小时前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
flashman9111 小时前
python在word中插入图片
python·microsoft·自动化·word
爱技术的小伙子1 小时前
【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
人工智能·chatgpt