pytorch中Sequential()的三种构造方法

对于图像分类任务中,一般神经网络的框架都是卷积、激活、池化,然后不断堆叠,最终嘉善输出层,并不会有较为复杂的连接结构,都是每一层的输出为下一层的输入。

对于简单的前馈神经网络,为了在forward中避免重复的运算操作,可以使用pytorch中内置的Sequential()这个特殊的module,我们可以将重复操作放在Sequential()中,然后模型就会自动识别内部的子module,然后就会按照顺序一层一层进行传播。

方法一

首先创建一个Sequential,然后不断添加模型子层,传入的第一个参数为该层的名称,第二个是该层的实例。

model1 = nn.Sequential()
model1.add_module('conv', nn.Conv2d(1, 5, 2))
model1.add_module('fc', nn.Linear(10, 2))
model1.add_module('sigmoid', nn.Sigmoid())

方法二

对于上面方法进行简化,可以直接将所有实例化的子类按顺序传入,但是这种方法有个缺点,就是不能对每个层进行命名,默认每个层的名称是0,1,2。

model2 = nn.Sequential(nn.Conv2d(1, 5, 2),
                      nn.Linear(10, 2),
                      nn.Sigmoid())

方法三

对于方法三是首先创建一个字典,然后将这个字典传入,这个字典和方法一一致都是层的名称和该层的实例化的键值对。

from collections import OrderedDict

model3 = nn.Sequential(OrderedDict([
    ('conv', nn.Conv2d(1, 5, 2)),
    ('fc', nn.Linear(10, 2)),
    ('sigmoid', nn.Sigmoid())
]))

输出模型结构

我们可以打印模型,查看模型的每层参数

print(model1)
print(model2)
print(model3)
Sequential(
  (conv): Conv2d(1, 5, kernel_size=(2, 2), stride=(1, 1))
  (fc): Linear(in_features=10, out_features=2, bias=True)
  (sigmoid): Sigmoid()
)
Sequential(
  (0): Conv2d(1, 5, kernel_size=(2, 2), stride=(1, 1))
  (1): Linear(in_features=10, out_features=2, bias=True)
  (2): Sigmoid()
)
Sequential(
  (conv): Conv2d(1, 5, kernel_size=(2, 2), stride=(1, 1))
  (fc): Linear(in_features=10, out_features=2, bias=True)
  (sigmoid): Sigmoid()
)

查看指定层

可以查看Sequential中的具体的某一个子模块,对于方法一和方法三都是需要传入层的名称,所以我们可以直接使用名称获得该层,而对于方法二没有名字,所以只可以通过索引获取。

print(model1.conv)
print(model2[0])
print(model3.conv)
Conv2d(1, 5, kernel_size=(2, 2), stride=(1, 1))
Conv2d(1, 5, kernel_size=(2, 2), stride=(1, 1))
Conv2d(1, 5, kernel_size=(2, 2), stride=(1, 1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋 之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值