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
函数中多次调用它,所有调用将共享和优化同一组权重。这可以有合法用途,但当您需要多个线性层时不合适,每个层都有自己的一组权重和偏差。
此代码来自 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
的情况下,重用图层通常不成问题。因此,您可以创建一个 self.dropout = Dropout(dropout)
层并在 forward
函数中多次调用它。但是可能会有一些微妙的用例,当您这样做时,它们的行为会有所不同,例如,如果您出于某种原因在网络中跨层迭代。 This thread, and particularly this post,详细讨论一下。
对于线性层,每个 Linear
对象都具有一组权重和偏差。如果在 forward
函数中多次调用它,所有调用将共享和优化同一组权重。这可以有合法用途,但当您需要多个线性层时不合适,每个层都有自己的一组权重和偏差。