二进制分类PyTorch的损失函数及其输入

Gen*_*Tel 8 neural-network pytorch

我试图在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?
Run Code Online (Sandbox Code Playgroud)

提前致谢。

blu*_*nox 10

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

self.outputs = nn.Linear(NETWORK_WIDTH, 1)
Run Code Online (Sandbox Code Playgroud)

然后使用sigmoid激活将输出单位的值映射到01 之间的范围内(当然,您也需要以这种方式安排您的训练数据)

self.outputs = nn.Linear(NETWORK_WIDTH, 1)
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用torch.nn.BCELoss

def forward(self, x):
    # other layers omitted
    x = self.outputs(x)           
    return F.sigmoid(x)  
Run Code Online (Sandbox Code Playgroud)

这应该适合您。

您也可以使用torch.nn.BCEWithLogitsLoss,该损失功能已经包含该sigmoid功能,因此您可以将其遗漏在前进中。

如果由于某种原因要使用2个输出单元,这也是可能的。但随后您需要使用torch.nn.CrossEntropyLoss而不是BCELoss。该Softmax激活已经包含在这方面的损失函数。