首页 > 解决方案 > PyTorch:为什么要创建相同类型层的多个实例?

问题描述

这段代码来自 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

标签: pythonpytorchinstancedropout

解决方案


在 的情况下Dropout,重用层通常不成问题。因此,您可以创建一个图层并在函数self.dropout = Dropout(dropout)中多次调用它。forward但是,当您这样做时,可能会有一些微妙的用例表现不同,例如,如果您出于某种原因在网络中的各个层之间进行迭代。这个线程,尤其是这篇文章,详细讨论了这个问题。

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


推荐阅读