我刚刚作为初学者学习使用 PyTorch。如果有人熟悉 PyTorch,你能告诉我nn.Module和 之间的区别吗nn.Sequential?
我的问题是
nn.Module使用代替有什么好处nn.Sequential?
经常使用哪个来构建模型?
我们应该如何选择nn.Module或者nn.Sequential?
Iva*_*van 45
太长了;回答你的问题
nn.Module使用代替有什么好处nn.Sequential?
Whilenn.Module是实现 PyTorch 模型的基类,nn.Sequential是在现有nn.Module.
- 经常使用哪个来构建模型?
两者都被广泛使用。
- 我们应该如何选择
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为模型的全连接分类器部分定义另一个分类器。