pytorch NN.Module和NN.Sequential有什么区别

ccrfmcuu  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(120)

我刚开始学习使用PyTorch,如果有谁熟悉PyTorch,你能告诉我nn.Modulenn.Sequential的区别吗?
我的问题是
1.使用nn.Module而不是nn.Sequential有何优势?
1.哪一项是经常用来建立模型的?
1.我们应该如何选择nn.Modulenn.Sequential

bnl4lu3b

bnl4lu3b1#

TLDR;回答您的问题

1.使用nn.Module而不是nn.Sequential有何优势?
nn.Module是实现PyTorch模型的基类,而nn.Sequential是一种在现有nn.Module内部或外部定义序列神经网络结构的快速方法。
1.通常使用哪一项来构建模型?
两者都被广泛使用。
1.我们应该如何选择nn.Modulenn.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

字符串
如果您定义的模型是循序的,* 也就是 * 会在输入上循序地逐一呼叫各层。然后,您可以简单地使用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

相关问题