我是深度学习和Pytorch的新手。我有以下问题:
我的总体体系结构由我定义的网络(NN1)和另一个预训练的网络(NN2)组成,因此NN1的输出是NN2的输入。我想使用NN2的输出和已知真相之间的差(RMSE)定义NN1的损耗。 我需要通过NN2和NN1进行反向传播(以训练NN1),而无需更改NN2。
我可以在NN2上使用requires_grad=False
,但是会禁用通过NN2的反向传播吗?如何在Pytorch中指定此要求?
谢谢。
答案 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