Backpropagation pytorch中的神经网络预测二元变量

Backpropagation pytorch中的神经网络预测二元变量,backpropagation,pytorch,Backpropagation,Pytorch,假设我想要一个通用的神经网络架构: ---> BinaryOutput_A / Input --> nnLayer - \ ---> BinaryOutput_B 输入通过神经网络层输入,然后预测两个二进制变量(即,a是[0或1]和B是[0或1]) 在pytorch中,您可以通过以下方式建立这样的网络: clas

假设我想要一个通用的神经网络架构:

                     ---> BinaryOutput_A
                    / 
Input --> nnLayer -
                    \
                     ---> BinaryOutput_B
输入通过神经网络层输入,然后预测两个二进制变量(即,
a
[0或1]
B
[0或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_函数(输出,目标)
计算损耗。如果是这样,使用
loss.backward()将损耗正确地反向传播到
l2a
l2b
,我可以简单地
concat
目标和
l2a
l2b
的适当标签吗?从这个意义上说,输出将是
[outputPredictionA,outputPredictionB]
,我可以使目标是
[labelA,labelB]
,pytorch知道如何正确地将损耗分配给每一层吗?

事实证明,torch确实非常聪明,您可以通过以下公式计算总损耗:

loss = 0
loss += loss_function(pred_A, label_A)
loss += loss_function(pred_B, label_B)

loss.backward()
错误将通过网络正确反向传播。不需要
torch.cat()
或任何东西