<p>我想要一个<code>Module</code>的PyTorch子类,它将子模块保存在一个列表中(因为根据构造函数的参数,子模块的数量可能是可变的)。我按以下方式设置此列表:</p>
<pre><code>self.hidden_layers = [torch.nn.Linear(i, o) for i, o in pairwise(self.layer_sizes)]
</code></pre>
<p>根据<a href="https://stackoverflow.com/questions/54994658/how-does-pytorchs-nn-module-register-submodule">this</a>和<a href="https://stackoverflow.com/questions/47324354/how-pytorch-nn-module-save-submodule">this</a>问题,当<code>__setattr__</code>对象被分配给<code>self</code>属性时,子模块仅由<code>__setattr__</code>注册。由于<code>hidden_layers</code>未分配类型为<code>Module</code>的对象,因此列表中的子模块未注册为子模块,因此<code>self.parameters()</code>不会迭代子模块的参数</p>
<p>我想我可以为列表中的每个元素显式地调用<code>__subattr__</code>,但那会非常难看。有没有更正确的方法来注册不是<code>Module</code>的直接属性的子模块</p>
<p>使用<code>nn.ModuleList</code></p>
<pre class="lang-py prettyprint-override"><code>self.hidden_layers = nn.ModuleList([torch.nn.Linear(i, o) for i, o in pairwise(self.layer_sizes)])
</code></pre>