pytorch中的 ModuleList 和 Sequentia对比

本文探讨了PyTorch中的ModuleList和Sequential两种结构。ModuleList结合了Module和list特性,允许存储多个模型,支持序列化处理和灵活的网络结构,但执行顺序需在forward函数中决定。Sequential则按顺序执行模块,提供简洁的forward,但牺牲了部分灵活性,要求前后模块输入输出大小匹配。了解这两者的特点有助于更好地构建和理解PyTorch网络。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pytorch中的 ModuleList 和 Sequential对比


在构建深度神经网络时,我们经常会用到ModuleList 和 Sequential,它们都是用来组合深度网络中的nn.Module/block,从而创建一个新的网络用的,能够简化模型的创建方式,但二者在使用上有所差异。
下面是传统的模型创建方式:

class model1(nn.Module):
    def __init__(self):
        super(model1,self).__init__()
        self.linear1=nn.Linear(1,10)
        self.activation1=nn.ReLU()
        self.linear2=nn.Linear(10,100)
        self.activation2=nn.ReLU()
        self.linear3=nn.Linear(100,10)
        self.activation3=nn.ReLU()
        self.linear4=nn.Linear(10,1)
    def forward(self,x):
        out=self.linear1(x)
        out=self.activation1(out)
        out=self.linear2(out)
        out=self.activation2(out)
        out=self.linear3(out)
        out=self.activation3(out)
        out=self.linear4(out)
        return out
        

1 ModuleList

顾名思义,就是模块一个列表,实际上可以把它视作是 Module 和 list 的结合,ModuleList 可以存储多个 model。

class model2(nn.Module):
    def __init__(self):
        super(model2, self).__init__()
        self.layers=nn.ModuleList([
            nn.Linear(1,10), nn.ReLU(),
            nn.Linear(10,100),nn.ReLU(),
            nn.Linear(100,10),nn.ReLU(),
            nn.Linear(10,1)])
    def forward(self,x):
        out=x
        for i,layer in enumerate(self.layers):
            out=layer(out)
        return out
        

主要有以下特点:
(1)如果使用传统的方法,一个model 就要写一个 forward ,但是如果将它们存到一个 ModuleList 的话,就可以序列化处理。实际上也可以针对不同的模块单独写forward,这些模块之间并没有什么先后顺序可言,网络的执行顺序是根据 forward 函数来决定的,但是改变顺序可能使子模块间输入输出不一致,导致报错。
(2)用 ModuleList 也可以使得网络的结构具有灵活性,比如我需要将网络的层数设置为变量,传统的方法要借助 list 实现,并且不方便,而使用 ModuleList就可以简化这个操作。
(3)支持extend和append操作,如下:

self.linears.extend([nn.Linear(size1, size2) for i in range(1, num_layers)])
self.linears.append(nn.Linear(size1, size2)

2 Sequential

nn.Sequential里面的所构造的模块是要按照顺序进行排列的,如下,也可以给每个子模块取唯一名:

class model3(nn.Module):
    def __init__(self):
        super(model3, self).__init__()
        self.network=nn.Sequential(
            nn.Linear(1,10),nn.ReLU(),
            nn.Linear(10,100),nn.ReLU(),
            nn.Linear(100,10),nn.ReLU(),
            nn.Linear(10,1)
        )
    def forward(self, x):
        return self.network(x)
self.network=nn.Sequential(OrderedDict(
            ("linear1",nn.Linear(1,10)),
            ("activation1",nn.ReLU()),
            ("linear2",nn.Linear(10,100))
        ))

主要有以下特点:
(1)Sequential可以看成一个整体,真正只需要一个forward,虽然简单,但是代价就是失去了部分灵活性,不能自己去定制 forward 函数里面的内容。
(2) 可以添加和索引子模块,可以给子模型定义唯一的名称索引,方便获取:

self.network.add_module("linear1",nn.Linear(100,100))
linear=self.network.linear1

(3)模块按照顺序进行排列的,所以必须确保前一个模块的输出大小和下一个模块的输入大小是一致的。

参考资料
https://blog.youkuaiyun.com/b15040915/article/details/105732355
https://blog.youkuaiyun.com/qq_38863413/article/details/104118055

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值