问题描述
此代码来自 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,**factory_kwargs)
self.norm3 = Layernorm(d_model,**factory_kwargs)
self.dropout1 = Dropout(dropout)
self.dropout2 = Dropout(dropout)
self.dropout3 = Dropout(dropout)
当 self.dropout1
已经存在并且是完全相同的函数时,他们为什么要添加 ...2
、...3
、self.dropout
?
另外,(self.linear1
,self.linear2
) 和 self.linear
有什么区别?
解决方法
在 Dropout
的情况下,重用图层通常不会成为问题。因此,您可以创建单个 self.dropout = Dropout(dropout)
层并在 forward
函数中多次调用它。但是,在执行此操作时可能会有一些微妙的用例,它们的行为会有所不同,例如,如果您出于某种原因跨网络中的层进行迭代。 This thread,尤其是 this post,请详细讨论一下。
对于线性层,每个 Linear
对象都以一组权重和偏差为特征。如果您在 forward
函数中多次调用它,所有调用将共享和优化相同的权重集。这可以有合理的用途,但当您需要多个线性层时不合适,每个层都有自己的权重和偏差集。
那是因为要将一个 Linear 层或 Dropout 层彼此分开。这是非常简单的逻辑。您正在使用 self.dropout = Dropout(dropout)
在 Dropout 函数的网络中创建不同的实例或层。