PyTorch:为什么要创建同一类型层的多个实例?

PyTorch: Why create multiple instances of the same type of layer?

此代码来自 PyTorch 转换器:

    self.linear1 = Linear(d_model, dim_feedforward, **factory_kwargs)
    self.dropout = Dropout(dropout)
    self.linear2 = Linear(dim_feedforward, d_model, **factory_kwargs)
    self.norm1 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)
    self.norm2 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)
    self.norm3 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)
    self.dropout1 = Dropout(dropout)
    self.dropout2 = Dropout(dropout)
    self.dropout3 = Dropout(dropout)

self.dropout 已经存在并且功能完全相同时,为什么还要添加 self.dropout1...2...3

另外,(self.linear1, self.linear2) 和 self.linear 有什么区别?

那是因为要将一个Linear层或Dropout层彼此分开。这是非常简单的逻辑。您正在使用 self.dropout = Dropout(dropout).

在 Dropout 函数的网络中创建不同的实例或层

Dropout 的情况下,重用图层通常不成问题。因此,您可以创建一个 self.dropout = Dropout(dropout) 层并在 forward 函数中多次调用它。但是可能会有一些微妙的用例,当您这样做时,它们的行为会有所不同,例如,如果您出于某种原因在网络中跨层迭代。 This thread, and particularly this post,详细讨论一下。

对于线性层,每个 Linear 对象都具有一组权重和偏差。如果在 forward 函数中多次调用它,所有调用将共享和优化同一组权重。这可以有合法用途,但当您需要多个线性层时不合适,每个层都有自己的一组权重和偏差。