如何在 PyTorch 中训练共享层

How to train the Shared Layers in PyTorch

我有以下代码

import torch
import torch.nn as nn
from torchviz import make_dot, make_dot_from_trace

class Net(nn.Module):
    def __init__(self, input, output):
        super(Net, self).__init__()
        self.fc = nn.Linear(input, output)

    def forward(self, x):
        x = self.fc(x)
        x = self.fc(x)
        return x

model = Net(12, 12)
print(model)

x = torch.rand(1, 12)
y = model(x)
make_dot(y, params = dict(model.named_parameters()))

这里我在forward中重复使用了self.fc两次。

计算图是look

我对计算图感到困惑,并且, 我很好奇如何在反向传播中训练这个模型?在我看来,渐变将永远存在于循环中。非常感谢。

您的图表没有问题。您可以像训练任何其他前馈模型一样训练它。

  1. 关于循环:因为它是有向无环图,所以没有实际的循环(查看箭头方向)。
  2. 关于反向传播: 让我们考虑 fc.bias 参数。由于您重复使用同一层两次,因此偏差有两个外向箭头(用于网络的两个位置)。在反向传播阶段,方向是相反的:bias 会从两个地方得到梯度,这些梯度会相加。
  3. 关于图:一个全连接层可以表示为:Addmm(bias, x, T(weight),其中T是转置,Addmm是矩阵乘法加上向量。因此,您可以看到数据 (weightbias) 是如何传递到函数 (AddmmT)
  4. 中的