我刚开始学习使用PyTorch,如果有谁熟悉PyTorch,你能告诉我nn.Module和nn.Sequential的区别吗?我的问题是1.使用nn.Module而不是nn.Sequential有何优势?1.哪一项是经常用来建立模型的?1.我们应该如何选择nn.Module或nn.Sequential?
nn.Module
nn.Sequential
bnl4lu3b1#
TLDR;回答您的问题
1.使用nn.Module而不是nn.Sequential有何优势?nn.Module是实现PyTorch模型的基类,而nn.Sequential是一种在现有nn.Module内部或外部定义序列神经网络结构的快速方法。1.通常使用哪一项来构建模型?两者都被广泛使用。1.我们应该如何选择nn.Module或nn.Sequential?所有的神经网络都是使用nn.Module来实作。如果依序使用图层(self.layer3(self.layer2(self.layer1(x)))),您可以利用nn.Sequential,而不必定义模型的forward函数。我首先要提到的是,nn.Module是PyTorch中所有神经网络模块的基类,因此,nn.Sequential实际上是nn.Module的直接子类,您可以在这一行中查找。在创建一个新的神经网络时,通常需要创建一个新的类,从nn.Module继承,并定义两个方法:__init__个(初始化程序,在其中定义图层)和forward(模块的推理代码,在那里使用层)。这就是您所需要的,因为PyTorch将使用Autograd处理反向传递。下面是一个模块的示例:
self.layer3(self.layer2(self.layer1(x)))
forward
__init__
class NN(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(10, 4) self.fc2 = nn.Linear(4, 2) def forward(self, x) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) return x
字符串如果您定义的模型是循序的,* 也就是 * 会在输入上循序地逐一呼叫各层。然后,您可以简单地使用nn.Sequential。如我先前所解释,nn.Sequential是为这种特定广泛使用的神经网络类型所制作的特殊类型nn.Module。这里的对等用法是:
class NN(nn.Sequential): def __init__(self): super().__init__( nn.Linear(10, 4), nn.ReLU(), nn.Linear(4, 2), nn.ReLU())
型或者更简单的说法是:
NN = Sequential( nn.Linear(10, 4), nn.ReLU(), nn.Linear(4, 2), nn.Linear())
型nn.Sequential的目标是快速实现顺序模块,这样就不需要编写前向定义,这是隐式已知的,因为在输出上顺序调用了层。然而,在更复杂的模块中,您可能需要使用多个顺序子模块。例如,以CNN分类器为例,您可以为CNN部分定义一个nn.Sequential,然后为模型的完全连接分类器部分定义另一个nn.Sequential。
1条答案
按热度按时间bnl4lu3b1#
TLDR;回答您的问题
1.使用
nn.Module
而不是nn.Sequential
有何优势?nn.Module
是实现PyTorch模型的基类,而nn.Sequential
是一种在现有nn.Module
内部或外部定义序列神经网络结构的快速方法。1.通常使用哪一项来构建模型?
两者都被广泛使用。
1.我们应该如何选择
nn.Module
或nn.Sequential
?所有的神经网络都是使用
nn.Module
来实作。如果依序使用图层(self.layer3(self.layer2(self.layer1(x)))
),您可以利用nn.Sequential
,而不必定义模型的forward
函数。我首先要提到的是,
nn.Module
是PyTorch中所有神经网络模块的基类,因此,nn.Sequential
实际上是nn.Module
的直接子类,您可以在这一行中查找。在创建一个新的神经网络时,通常需要创建一个新的类,从
nn.Module
继承,并定义两个方法:__init__
个(初始化程序,在其中定义图层)和forward
(模块的推理代码,在那里使用层)。这就是您所需要的,因为PyTorch将使用Autograd处理反向传递。下面是一个模块的示例:字符串
如果您定义的模型是循序的,* 也就是 * 会在输入上循序地逐一呼叫各层。然后,您可以简单地使用
nn.Sequential
。如我先前所解释,nn.Sequential
是为这种特定广泛使用的神经网络类型所制作的特殊类型nn.Module
。这里的对等用法是:型
或者更简单的说法是:
型
nn.Sequential
的目标是快速实现顺序模块,这样就不需要编写前向定义,这是隐式已知的,因为在输出上顺序调用了层。然而,在更复杂的模块中,您可能需要使用多个顺序子模块。例如,以CNN分类器为例,您可以为CNN部分定义一个
nn.Sequential
,然后为模型的完全连接分类器部分定义另一个nn.Sequential
。