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