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

时间:2021-05-11 04:13:59

标签: python pytorch instance dropout

此代码来自 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.dropout1 已经存在并且是完全相同的函数时,他们为什么要添加 ...2...3self.dropout

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

那是因为要将一个 Linear 层或 Dropout 层彼此分开。这是非常简单的逻辑。您正在使用 self.dropout = Dropout(dropout) 在 Dropout 函数的网络中创建不同的实例或层。

相关问题