训练部分网络

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

【讨论】:

以上是关于训练部分网络的主要内容,如果未能解决你的问题,请参考以下文章

如何确保部分输入不参与训练神经网络?

如何在 Matlab 中逐步训练神经网络?

神经网络为啥需要训练多轮运动

『TensorFlow』SSD源码学习_其八:网络训练

神经网络控制器基于神经网络的离线训练辨识在线控制的控制系统仿真

训练网络