个人主页:十二月的猫-CSDN博客
系列专栏: 《PyTorch科研加速指南:即插即用式模块开发》CSDN博客十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
1. 前言
2. Sequential类的使用
2.1 序列容器简单注入
2.2 序列容器字典注入
2.3 序列容器函数注入
2.4 序列容器修改
2.5 序列容器删除
3. nn.ModuleList()的使用
3.1 定义模型
3.2 使用模型
4. 总结
正在更新中
项目运行环境:
nn.Sequential是一个序列容器,用于搭建神经网络的模块按照被传入构造器的顺序添加到容器中。除此之外,一个包含神经网络模块的OrderedDict也可以被传入nn.Sequential()容器中。利用nn.Sequential()搭建好模型架构,模型前向传播时调用forward()方法,模型接收的输入首先被传入nn.Sequential()包含的第一个网络模块中。然后,第一个网络模块的输出传入第二个网络模块作为输入,按照顺序依次计算并传播,直到nn.Sequential()里的最后一个模块输出结果。
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]) # 通过索引获取第几个层
运行结果:
前面的 简单序列容器注入 的问题是过于简单了,导致我们无法为模型的每一层(每一模块)指定名称。这在小模型中没有问题,但是一旦模型变大型后,模型层次变多,没有名称将导致模型的使用变得复杂。
于是就出现了 字典序列容器注入 ,这个时候每一个层都有了自己的名称,但是我们获取层仍然只能通过索引,名称仅仅是为了阅读代码/理解模型方便。
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]) # 通过索引获取第几个层
运行结果:
这里猫猫创建字典的方法是:元组列表法
其他常见的创建字典的方法有:大括号法、dict法(关键字法、元组列表法)、updata法等等
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]) # 通过索引获取第几个层
运行结果:
这里使用的是 函数序列容器注入 利用函数将模型按照顺序注入
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)
运行结果:
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.ModuleList() 是 PyTorch 中的一个类,用于管理神经网络模型中的子模块列表。它允许将多个子模块组织在一起,并将它们作为整个模型的一部分进行管理和操作。
使用 nn.ModuleList() 需要进行两个步骤:
举个例子,定义了一个名为 MyModel
的自定义模型类,该类继承自 nn.Module
。在 __init__
方法中,使用 nn.ModuleList()
创建了一个空的子模块列表 module_list
,然后将三个子模块依次添加到该列表中:
nn.Linear
)。nn.ReLU
)。 这些子模块在初始化时一次性添加到 module_list
中,但可以用module_list.append(layer)
动态添加更多的子模块。在 forward
方法中,输入数据 x
会依次传递给 module_list
中的每个子模块,模型的输出是经过所有子模块处理后的最终结果。这通过迭代 module_list
来实现。
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),
])
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
综上注入方式有:
- 列表注入
【如果想学习更多深度学习文章,可以订阅一下热门专栏】
如果想要学习更多pyTorch/python编程的知识,大家可以点个关注并订阅,持续学习、天天进步你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~