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
激活将输出单位的值映射到0到1 之间的范围内(当然,您也需要以这种方式安排您的训练数据):
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
激活已经包含在这方面的损失函数。
归档时间: |
|
查看次数: |
4207 次 |
最近记录: |