nn.Module 和 nn.Sequential 之间有什么区别

Wak*_*ame 21 python pytorch

我刚刚作为初学者学习使用 PyTorch。如果有人熟悉 PyTorch,你能告诉我nn.Module和 之间的区别吗nn.Sequential

我的问题是

  1. nn.Module使用代替有什么好处nn.Sequential

  2. 经常使用哪个来构建模型?

  3. 我们应该如何选择nn.Module或者nn.Sequential

Iva*_*van 45

太长了;回答你的问题

  1. nn.Module使用代替有什么好处nn.Sequential

Whilenn.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处理向后传递。这是一个模块的示例:

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
Run Code Online (Sandbox Code Playgroud)

如果您定义的模型是顺序的,在输入上顺序地一层一层地调用层。然后,您可以简单地使用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())
Run Code Online (Sandbox Code Playgroud)

或者更简单的表达方式是:

NN = Sequential(
   nn.Linear(10, 4),
   nn.ReLU(),
   nn.Linear(4, 2),
   nn.ReLU())
Run Code Online (Sandbox Code Playgroud)

目的nn.Sequential是快速实现顺序模块,这样您就不需要编写前向定义,它是隐式已知的,因为在输出上顺序调用各层。

但在更复杂的模块中,您可能需要使用多个连续的子模块。例如,以 CNN 分类器为例,您可以nn.Sequential为 CNN 部分定义一个分类器,然后nn.Sequential为模型的全连接分类器部分定义另一个分类器。

  • 这就是很棒的解释。感谢您的帮助! (3认同)