nn.Sequential 是一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为
元素的有序字典也可以作为传入参数。
# Example of using Sequential model = nn.Sequential( nn.Conv2d(1,20,5), nn.ReLU(), nn.Conv2d(20,64,5), nn.ReLU() ) # Example of using Sequential with OrderedDict model = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(1,20,5)), ('relu1', nn.ReLU()), ('conv2', nn.Conv2d(20,64,5)), ('relu2', nn.ReLU()) ]))
下面来看一下它的源码。在初始化函数 __init__
中,首先是 if 条件判断,如果传入的参数为 1 个,并且类型为 OrderedDict,通过
字典索引的方式将子模块添加到 self._module
中,否则,通过 for 循环遍历参数,将所有的子模块添加到 self._module
中。
注意:Sequential 模块的初始换函数没有异常处理,所以在写的时候要注意。
由于每一个神经网络模块都继承于 nn.Module,因此都会实现 __call__
与 forward
函数,所以 forward 函数中通过 for 循环依次
调用添加到现有模块中的子模块,最后输出经过所有神经网络层的结果。