我试图在PyTorch中编写一个用于二进制分类的神经网络,而我对损失函数感到困惑。

我看到BCELoss是专门用于二进制分类的通用函数。我还看到,对于N个可能的类,N个输出的输出层是常规分类的标准。但是,对于二进制分类,似乎可以是1个或2个输出。

因此,我应该有2个输出(每个标签1个),然后将0/1训练标签转换为[1,0]和[0,1]数组,还是对单变量输出使用类似S形的东西?

以下是相关的代码段,因此您可以看到:

self.outputs = nn.Linear(NETWORK_WIDTH, 2) # 1 or 2 dimensions?


def forward(self, x):
  # other layers omitted
  x = self.outputs(x)
  return F.log_softmax(x)  # <<< softmax over multiple vars, sigmoid over one, or other?

criterion = nn.BCELoss() # <<< Is this the right function?

net_out = net(data)
loss = criterion(net_out, target) # <<< Should target be an integer label or 1-hot vector?

提前致谢。

最佳答案

对于二进制输出,可以使用 1 输出单位,因此:

self.outputs = nn.Linear(NETWORK_WIDTH, 1)
然后,使用 sigmoid 激活将输出单位的值映射到 0 1 之间的范围(当然,您也需要以这种方式安排您的训练数据):
def forward(self, x):
    # other layers omitted
    x = self.outputs(x)
    return torch.sigmoid(x)
最后,您可以使用 torch.nn.BCELoss :
criterion = nn.BCELoss()

net_out = net(data)
loss = criterion(net_out, target)
这应该适合您。
您还可以使用 torch.nn.BCEWithLogitsLoss ,此丢失函数已经包含sigmoid函数,因此您可以将其保留在前进位置。
如果要使用 2个输出单位,这也是可能的。但是然后您需要使用 torch.nn.CrossEntropyLoss 而不是BCELossSoftmax激活已包含在此丢失函数中。

编辑:我只想强调,这样做确实有真正的差异。与使用 1 输出单位相比,使用 2 输出单位给您的权重是您的两倍。因此,这两种选择并不等效。

关于neural-network - 二进制分类PyTorch的损失函数及其输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53628622/

10-13 03:07