训练网络的一部分

时间:2019-12-16 11:14:29

标签: pytorch

我是深度学习和Pytorch的新手。我有以下问题:

我的总体体系结构由我定义的网络(NN1)和另一个预训练的网络(NN2)组成,因此NN1的输出是NN2的输入。我想使用NN2的输出和已知真相之间的差(RMSE)定义NN1的损耗。 我需要通过NN2和NN1进行反向传播(以训练NN1),而无需更改NN2。

我可以在NN2上使用requires_grad=False,但是会禁用通过NN2的反向传播吗?如何在Pytorch中指定此要求?

谢谢。

1 个答案:

答案 0 :(得分:0)

您将使用两个不同的模块。第一个是您的模块/模型/ NN(NN1),第二个是预训练的。

然后,您将使用model_nn1.train()model_nn2.eval()。然后,您可以执行以下操作:

optimizer = torch.optim.Adam(model_nn1.parameters())  # You can use your own preferred optimizer

model_nn1.train()
model_nn2.eval()

for epoch in range(epochs):
  for x, y in dataloader:  # the dataloader is your dataloader according to the torch.utils.data.DataLoader
    optimizer.zero_grad()
    h_nn1 = model_nn1(x) # x is the input
    y_hat = model_nn2(h_nn1) # y_hat is the output
    loss = torch.sqrt(torch.mean((yhat-y)**2))
    loss.backward()
    optimizer.step()

您可以检查有关渐变操作的要求:

>>> import torch
>>> x = torch.nn.Linear(2, 3)
>>> x2 = torch.nn.Linear(3, 2)
>>> z = torch.rand(2, 2)
>>> y = torch.rand(2, 2)
>>> x.train()
Linear(in_features=2, out_features=3, bias=True)
>>> x2.eval()
Linear(in_features=3, out_features=2, bias=True)
>>> h = x(z)
>>> h.requires_grad
True
>>> y_hat = x2(h)
>>> y_hat.requires_grad
True