【问题标题】:PyTorch: Why create multiple instances of the same type of layer?PyTorch:为什么要创建相同类型层的多个实例?
【发布时间】:2021-08-01 10:47:00
【问题描述】:

这段代码来自 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.linear1self.linear2)和self.linear有什么区别?

【问题讨论】:

    标签: python pytorch instance dropout


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • “分开”是否意味着linear1和linear2的梯度不同?如果我不创建多个图层实例而只是在前进中多次使用它怎么办?
      • @user1173330 这里分开意味着不同。如果您多次使用,那么您将如何区分(例如)一个线性层与另一个?
      • 我想你在这里不理解。它们以不同的方式命名以相互区分。它们是相同的线性层,但它们在网络中以不同的名称多次使用。
      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 2018-08-26
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多