У меня есть следующий код
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()))
Здесь я повторно использую self.fc
дважды в forward
.
Вычислительный граф выглядит
Я запутался в вычислительном графе и, Мне любопытно, как обучить эту модель обратному распространению? Мне кажется, что градиент будет жить в цикле вечно. Большое спасибо.
С вашим графиком проблем нет. Вы можете обучить ее так же, как и любую другую модель с прямой связью.
fc.bias
. Поскольку вы повторно используете один и тот же слой два раза, смещение имеет две исходящие стрелки (используемые в двух местах вашей сети). На этапе обратного распространения направление обратное: смещение будет получать градиенты из двух мест, и эти градиенты складываются.Addmm(bias, x, T(weight)
, где T
— транспонирование, а Addmm
— умножение матриц плюс добавление вектора. Итак, вы видите, как данные (weight
, bias
) передаются в функции (Addmm
, T
)