【发布时间】:2022-01-18 21:19:09
【问题描述】:
我正在构建一个级联的神经网络,我想将主要损失反向传播回 DNN,并计算一个辅助损失回传给每个 DNN。
我试图弄清楚在构建此类模型时最佳做法是什么,以及如何确保正确计算我的损失。我是构建一个 torch.nn.Module 和一个优化器,还是必须为每个网络创建单独的模块和优化器?此外,我可能拥有三个以上的级联 DNN。
方法a)
import torch
from torch import nn, optim
class MasterNetwork(nn.Module):
def init(self):
super(MasterNetwork, self).__init__()
dnn1 = nn.ModuleList()
dnn2 = nn.ModuleList()
dnn3 = nn.ModuleList()
def forward(self, x, z1, z2):
out1 = dnn1(x)
out2 = dnn2(out1 + z1)
out3 = dnn3(out2 + z2)
return [out1, out2, out3]
def LossFunction(in):
# do stuff
return loss # loss is a scalar value
def ac_loss_1_fn(in):
# do stuff
return loss # loss is a scalar value
def ac_loss_2_fn(in):
# do stuff
return loss # loss is a scalar value
def ac_loss_3_fn(in):
# do stuff
return loss # loss is a scalar value
model = MasterNetwork()
optimizer = optim.Adam(model.parameters())
input = torch.tensor()
z1 = torch.tensor()
z2 = torch.tensor()
outputs = model(input, z1, z2)
main_loss = LossFunction(outputs[2])
ac1_loss = ac_loss_1_fn(outputs[0])
ac2_loss = ac_loss_2_fn(outputs[1])
ac3_loss = ac_loss_3_fn(outputs[2])
optimizer.zero_grad()
'''
This is where I am uncertain about how to backpropagate the AC losses for each DNN
in addition to the main loss.
'''
optimizer.step()
方法 b)
这将为每个 DNN 创建一个 nn.Module 类和优化器,然后将损失转发到下一个 DNN。
我希望为方法 a) 提供一个解决方案,因为它不那么乏味,而且我不必处理调整多个优化器的问题。但是,我不确定这是否可能。有一个类似的 question 关于反向传播多个损失,但是,我无法理解组合损失如何对不同的组件起作用。
【问题讨论】:
标签: python neural-network pytorch