【零基础入门】一篇弄懂nn.Sequential以及ModuleList的使用(呕心沥血版)

 个人主页:十二月的猫-CSDN博客
 系列专栏: 《PyTorch科研加速指南:即插即用式模块开发》CSDN博客

 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

目录

1. 前言

2. Sequential类的使用

2.1 序列容器简单注入

2.2 序列容器字典注入

2.3 序列容器函数注入

2.4 序列容器修改

2.5 序列容器删除

3. nn.ModuleList()的使用

3.1 定义模型

3.2 使用模型

4. 总结


1. 前言

  • 《PyTorch科研加速指南:即插即用式模块开发》专栏持续更新中,未来最少文章数量为60篇。由于专栏刚刚建立,促销价为9.9。后续将慢慢恢复原价至99.9【在校大学生】评论区留言并私信我免费订阅
  • 《PyTorch科研加速指南:即插即用式模块开发》专栏主要针对零基础入门的小伙伴。不需要Python基础,不需要深度学习基础,只要你愿意学,这一个专栏将真正让你做到零基础入门。
  • 每例项目都包括理论讲解、数据集、源代码

正在更新中

项目运行环境:

  • 平台:Window11
  • 语言环境:Python3.8
  • 运行环境1:PyCharm 2021.3
  • 运行环境2:Jupyter Notebook 7.3.2
  • 框架:PyTorch 2.5.1(CUDA11.8)

2. Sequential类的使用

        nn.Sequential是一个序列容器,用于搭建神经网络的模块按照被传入构造器的顺序添加到容器中。除此之外,一个包含神经网络模块的OrderedDict也可以被传入nn.Sequential()容器中。利用nn.Sequential()搭建好模型架构,模型前向传播时调用forward()方法,模型接收的输入首先被传入nn.Sequential()包含的第一个网络模块中。然后,第一个网络模块的输出传入第二个网络模块作为输入,按照顺序依次计算并传播,直到nn.Sequential()里的最后一个模块输出结果。

2.1 序列容器简单注入

import torch.nn as nn
model = nn.Sequential(
                  nn.Conv2d(1,3,5),
                  nn.ReLU(),
                  nn.Conv2d(3,20,5),
                  nn.ReLU()
                )
 
print(model)
print(model[0]) # 通过索引获取第几个层

运行结果:

【零基础入门】一篇弄懂nn.Sequential以及ModuleList的使用(呕心沥血版)_第1张图片

2.2 序列容器字典注入

        前面的 简单序列容器注入 的问题是过于简单了,导致我们无法为模型的每一层(每一模块)指定名称。这在小模型中没有问题,但是一旦模型变大型后,模型层次变多,没有名称将导致模型的使用变得复杂。

        于是就出现了 字典序列容器注入 ,这个时候每一个层都有了自己的名称,但是我们获取层仍然只能通过索引,名称仅仅是为了阅读代码/理解模型方便。

import torch.nn as nn
from collections import OrderedDict
model = nn.Sequential(OrderedDict([
                  ('conv1', nn.Conv2d(1,3,5)),
                  ('relu1', nn.ReLU()),
                  ('conv2', nn.Conv2d(3,20,5)),
                  ('relu2', nn.ReLU())
                ]))
 
print(model)
print(model[0]) # 通过索引获取第几个层

运行结果: 

【零基础入门】一篇弄懂nn.Sequential以及ModuleList的使用(呕心沥血版)_第2张图片


这里猫猫创建字典的方法是:元组列表法

其他常见的创建字典的方法有:大括号法、dict法(关键字法、元组列表法)、updata法等等

2.3 序列容器函数注入

        add_module() 方法是 PyTorch 中 nn.Module 类的一个方法,用于将一个新的子模块(层)添加到模型中。该方法接收两个参数:第一个是该子模块的名称(字符串),第二个是子模块本身(如卷积层 Conv2d、激活函数层 ReLU 等)。通过 add_module(),我们可以以有序的方式构建模型,并且每个子模块都被赋予一个可辨识的名称。这对于后续模型的管理、访问或调试非常有用。

import torch.nn as nn
model = nn.Sequential()
model.add_module("conv1",nn.Conv2d(1,3,5))
model.add_module('relu1', nn.ReLU())
model.add_module('conv2', nn.Conv2d(3,20,5))
model.add_module('relu2', nn.ReLU())
 
print(model)
print(model[0]) # 通过索引获取第几个层

 运行结果: 

【零基础入门】一篇弄懂nn.Sequential以及ModuleList的使用(呕心沥血版)_第3张图片

这里使用的是 函数序列容器注入 利用函数将模型按照顺序注入

2.4 序列容器修改

import torch.nn as nn
from collections import OrderedDict
 
model = nn.Sequential(OrderedDict([('h1', nn.Linear(28*28, 32)),
                                     ('relu1', nn.ReLU()),
                                     ('out', nn.Linear(32, 10)),
                                     ('softmax', nn.Softmax(dim=1))]))
model[1] = nn.Sigmoid()
print(model)

 运行结果: 

【零基础入门】一篇弄懂nn.Sequential以及ModuleList的使用(呕心沥血版)_第4张图片

2.5 序列容器删除

import torch.nn as nn
from collections import OrderedDict
 
model = nn.Sequential(OrderedDict([('h1', nn.Linear(28*28, 32)),
                                     ('relu1', nn.ReLU()),
                                     ('out', nn.Linear(32, 10)),
                                     ('softmax', nn.Softmax(dim=1))]))
del model[2]
print(model)

 运行结果: 

【零基础入门】一篇弄懂nn.Sequential以及ModuleList的使用(呕心沥血版)_第5张图片

综上注入方式有:

  • 简单注入
  • 字典注入 

3. nn.ModuleList()的使用

        nn.ModuleList() 是 PyTorch 中的一个类,用于管理神经网络模型中的子模块列表。它允许将多个子模块组织在一起,并将它们作为整个模型的一部分进行管理和操作。

        使用 nn.ModuleList() 需要进行两个步骤:

  1. 定义模型:在模型的 __init__ 方法中,定义一个 nn.ModuleList 实例。
  2. 使用模型:在模型的 forward 方法中,使用 nn.ModuleList 实例来访问和操作子模块。

         举个例子,定义了一个名为 MyModel 的自定义模型类,该类继承自 nn.Module。在 __init__ 方法中,使用 nn.ModuleList() 创建了一个空的子模块列表 module_list,然后将三个子模块依次添加到该列表中:

  1. 一个线性层(nn.Linear)。
  2. 一个 ReLU 激活函数层(nn.ReLU)。
  3. 另一个线性层。

        这些子模块在初始化时一次性添加到 module_list 中,但可以用module_list.append(layer) 动态添加更多的子模块。在 forward 方法中,输入数据 x 会依次传递给 module_list 中的每个子模块,模型的输出是经过所有子模块处理后的最终结果。这通过迭代 module_list 来实现。

3.1 定义模型

import torch
import torch.nn as nn
 
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
 
        self.module_list = nn.ModuleList([
            nn.Linear(3, 4),
            nn.ReLU(),
            nn.Linear(4, 3),
        ])

3.2 使用模型

import torch
import torch.nn as nn
 
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
 
        self.module_list = nn.ModuleList([
            nn.Linear(3, 4),
            nn.ReLU(),
            nn.Linear(4, 3),
        ])
 
    def forward(self, x):
        for module in self.module_list:
            x = module(x)
            print(x)
        return x

综上注入方式有:

  • 列表注入

4. 总结

 【如果想学习更多深度学习文章,可以订阅一下热门专栏】

  • 《PyTorch科研加速指南:即插即用式模块开发》_十二月的猫的博客-CSDN博客
  • 《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客
  • 《AI认知筑基三十讲》_十二月的猫的博客-CSDN博客

如果想要学习更多pyTorch/python编程的知识,大家可以点个关注并订阅,持续学习、天天进步你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~

你可能感兴趣的:(PyTorch深度学习,pytorch,零基础入门)