如何在 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
我对计算图感到困惑,并且,
我很好奇如何在反向传播中训练这个模型?在我看来,渐变将永远存在于循环中。非常感谢。
您的图表没有问题。您可以像训练任何其他前馈模型一样训练它。
- 关于循环:因为它是有向无环图,所以没有实际的循环(查看箭头方向)。
- 关于反向传播: 让我们考虑
fc.bias
参数。由于您重复使用同一层两次,因此偏差有两个外向箭头(用于网络的两个位置)。在反向传播阶段,方向是相反的:bias 会从两个地方得到梯度,这些梯度会相加。
- 关于图:一个全连接层可以表示为:
Addmm(bias, x, T(weight)
,其中T
是转置,Addmm
是矩阵乘法加上向量。因此,您可以看到数据 (weight
、bias
) 是如何传递到函数 (Addmm
、T
) 中的
我有以下代码
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
我对计算图感到困惑,并且, 我很好奇如何在反向传播中训练这个模型?在我看来,渐变将永远存在于循环中。非常感谢。
您的图表没有问题。您可以像训练任何其他前馈模型一样训练它。
- 关于循环:因为它是有向无环图,所以没有实际的循环(查看箭头方向)。
- 关于反向传播: 让我们考虑
fc.bias
参数。由于您重复使用同一层两次,因此偏差有两个外向箭头(用于网络的两个位置)。在反向传播阶段,方向是相反的:bias 会从两个地方得到梯度,这些梯度会相加。 - 关于图:一个全连接层可以表示为:
Addmm(bias, x, T(weight)
,其中T
是转置,Addmm
是矩阵乘法加上向量。因此,您可以看到数据 (weight
、bias
) 是如何传递到函数 (Addmm
、T
) 中的