繁体   English   中英

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

[英]What is difference between nn.Module and nn.Sequential

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

我的问题是

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

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

  3. 我们应该如何选择nn.Modulenn.Sequential

TLDR;<\/strong> 回答你的问题<\/strong>

  1. 使用nn.Module<\/code>代替nn.Sequential<\/code>什么nn.Sequential<\/code> ?<\/li><\/ol><\/blockquote>

    虽然nn.Module<\/code>是实现 PyTorch 模型的基类,但nn.Sequential<\/code>是一种在现有nn.Module<\/code>内部或外部定义顺序神经网络结构的快速方法。

    哪个经常用于构建模型?<\/li><\/ol><\/blockquote>

    两者都被广泛使用。

    1. 我们应该如何选择nn.Module<\/code>或nn.Sequential<\/code> ?<\/li><\/ol><\/blockquote>

      所有的神经网络都是用nn.Module<\/code>实现的。 如果按顺序使用层( self.layer3(self.layer2(self.layer1(x)))<\/code> ,您可以利用nn.Sequential<\/code>不必定义模型的forward<\/code>函数。


      我应该首先提到nn.Module<\/code><\/a>是nn.Module<\/code><\/a>中所有神经网络模块的基类。 因此nn.Sequential<\/code><\/a>实际上是nn.Sequential<\/code><\/a>的直接子类,您可以在这一行<\/a>中nn.Module<\/code>查找。

      在创建新的神经网络时,您通常会创建一个新类并从nn.Module<\/code>继承,并定义两个方法: __init__<\/code> nn.Module<\/code> __init__<\/code> (初始化程序,您定义层)和forward<\/code> (模块的推理代码,其中你使用你的图层)。 这就是您所需要的,因为 PyTorch 将使用Autograd<\/a>处理反向传递。 这是一个模块的示例:

      如果您定义的模型是顺序的,即<\/em>层在输入上被顺序调用,一个接一个。 然后,您可以简单地使用nn.Sequential<\/code> 。 正如我之前解释的, nn.Sequential<\/code>是一种特殊的nn.Module<\/code> , nn.Module<\/code>为这种特别广泛的神经网络类型而设计。 这里的等价物是:

      或者更简单的说法是:

       nn.Sequential<\/code>的目标是快速实现顺序模块,这样您就不需要编写前向定义,因为这些层是在输出上按顺序调用的,所以它是隐式知道的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM