对于图像分类任务中,一般神经网络的框架都是卷积、激活、池化,然后不断堆叠,最终嘉善输出层,并不会有较为复杂的连接结构,都是每一层的输出为下一层的输入。
对于简单的前馈神经网络,为了在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))