nn.Sequential 一个顺序容器。模块将按照它们在构造函数中传递的顺序添加到其中。或者,也可以传入模块的有序dict。 译文:一个有序的容器,神经网络模块会按照传递给构造函数执行的顺序添加到计算图中,一个带有神经网络的有序字典作为元素的网络模块也可以用作传入参数。方法一:作为有序容器 作为有序容器,将具体的神经网络模块按照传递给构造函数执行的先后顺序添加到计算图中。官方示例:model=nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU())示例:net=nn.Sequential(nn.Linear(num_inputs,num_hidden)#传递给其他层)使用方法二:作为有序字典 传入一个带有指定神经网络模块的OrderedDict作为元素。官方示例:model=nn.Sequential(OrderedDict([('conv1',nn.Conv2d(1,20,5)),('relu1',nn.ReLU()),('conv2',nn.Conv2d(20,64,5)),('relu2',nn.ReLU())]))示例:net=nn.Sequential()net.add_module('linear1',nn.Linear(num_inputs,num_hiddens))net.add_module('linear2',nn.Linear(num_hiddens,num_ouputs))#net.add_module......源码分析初始化函数initdef__init__(self,*args):super(Sequential,self).__init__()iflen(args)==1andisinstance(args[0],OrderedDict):forkey,moduleinargs[0].items():self.add_module(key,module)else:foridx,moduleinenumerate(args):self.add_module(str(idx),模块) __init__首先使用if条件判断,如果传入参数为1,类型为OrderedDict,则使用add_module函数通过字典索引将子模块添加到已有模块中。否则,通过循环参数将所有子模块添加到现有模块。这里需要注意的是Sequential模块的初始转换函数是没有异常处理的。forwardfunctiondefforward(self,input):formoduleinself:input=module(input)returninput 因为每个模块继承自nn.Module,都会实现调用和转发功能,所以forward函数通过for循环依次调用添加到self._module中的子模块,最终输出所有神经网络层的结果
