假设我想拥有通用神经网络架构:
---> BinaryOutput_A
/
Input --> nnLayer -
\
---> BinaryOutput_B
输入通过神经网络层然后预测两个二进制变量(即A
是[0 or 1]
而B
是[0 or 1]
。
在pytorch中,您可以通过以下方式建立这样的网络:
class NN(nn.Module):
def __init__(self, inputs):
super(NN, self).__init__()
# -- first layer
self.lin = nn.Linear(inputs,10)
# -- firstLayer --> binaryOutputA
self.l2a = nn.Linear(10,2)
# -- firstLayer --> binaryOutputB
self.l2b = nn.Linear(10,2)
def forward(self, inputs):
o = self.lin(inputs)
o1 = F.log_softmax(self.l2a(o))
o2 = F.log_softmax(self.l2b(o))
return o1, o2
在我的train
函数中,我使用loss = loss_function(output, target)
计算损失。如果是这种情况,要使用l2a
正确地将损失反向传播到l2b
和loss.backward()
图层,我是否可以concat
使用正确的标签target
对于l2a
和l2b
?从这个意义上说,输出将是[outputPredictionA, outputPredictionB]
,我可以使目标为[labelA, labelB]
,是否知道如何正确地将损失分配给每一层?
答案 0 :(得分:1)
事实证明,火炬实际上非常聪明,你可以将总损失计算为:
torch.cat()
并且错误将通过网络正确反向传播。不需要{{1}}或其他任何内容。