训练部分网络
Posted
技术标签:
【中文标题】训练部分网络【英文标题】:Train part of the network 【发布时间】:2020-04-08 20:25:50 【问题描述】:我是深度学习和 Pytorch 的新手。我有以下问题:
我的整体架构由我定义的一个网络 (NN1) 和另一个预训练网络 (NN2) 组成,因此 NN1 的输出是 NN2 的输入。我想使用 NN2 的输出与已知的真实情况之间的差异 (RMSE) 来定义 NN1 的损失。 我需要通过 NN2 和 NN1 反向传播(训练 NN1),而不更改 NN2。
我可以在 NN2 上使用requires_grad=False
,但它会禁用通过 NN2 的反向传播吗?如何在 Pytorch 中指定此要求?
谢谢。
【问题讨论】:
通常requires_grad=False
应该这样做,但我不确定。也许你应该尝试对一批数据进行训练,看看它是否收敛(故意让它过拟合)。如果是这样,那么这有效。
【参考方案1】:
您将使用两个不同的模块。第一个是您的模块/模型/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
【讨论】:
以上是关于训练部分网络的主要内容,如果未能解决你的问题,请参考以下文章