二分类问题输出一个节点还是两个节点

这两天在学pytorch的时候,看到是莫凡的pytorch教程,在二分类中用的是softmax,输出是[0,1],[1,0]这样的标签,而不是0,1标签,自己看了看torch的api函数改成了sigmoid激活函数可以用0,1标签输出一个节点了。

import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
n_data=torch.ones(100,2)
x_0=torch.normal(2*n_data,1)
y_0=torch.zeros(100)
x_1=torch.normal(-2*n_data,1)
y_1=torch.ones(100)

x=torch.cat((x_0,x_1),0).type(torch.FloatTensor)
y=torch.cat((y_0,y_1),).type(torch.FloatTensor)
x,y=Variable(x),Variable(y)
#plt.scatter(x.data.numpy()[:,0],x.data.numpy()[:,1],c=y.data.numpy(),s=100,lw=0,cmap='RdYlGn')
#plt.show()

class Net(torch.nn.Module):

    def __init__(self,feature,hidden,output):
        super(Net, self).__init__()
        self.hidden=torch.nn.Linear(feature,hidden)
        self.output=torch.nn.Linear(hidden,output)

    def forward(self, x):
        x=F.relu(self.hidden(x))
        x=self.output(x)
        return F.sigmoid(x)

net=Net(2,10,1)
print(net)

optimizer=torch.optim.SGD(net.parameters(),lr=0.02)
loss_func=torch.nn.BCELoss()
for t in range(200):
    predict=net(x)
    loss=loss_func(predict,y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print(loss)

两种都能运行,其实两者是没有区别的,但是在实际使用的时候,交叉熵函数有区别,在输出一个结点的时候,采用的是binary cross entropy,在下式中,t=0,1都不会让L为0

《二分类问题输出一个节点还是两个节点》

但是,交叉熵损失函数在多分类中如下:

《二分类问题输出一个节点还是两个节点》

如果还采用0,1标签的话,当标签是0的时候L就是0了

多分类

其实还有一个问题,二分类的问题解决了,多分类的标签中,四分类可以用[0,0,0,1]这样的标签来表示,但是也可以用[0,0],[0,1],[1,0],[1,1]来表示。这两种一样吗?

推导公式是一样的,但是实际使用中效果不一样,第一种每个标签里四类是独立的,而在第二种中[0,0]和[0,1]不是独立的,有一位是相同的,区分度不如上一个,这样计算损失函数的时候这两类在区分的时候有一个标签是没用的。经过测验,第二种在训练的时候会比第一种收敛慢。这种情况在二分类中是没有的

    原文作者:IT莫莫
    原文地址: https://blog.csdn.net/gt362ll/article/details/82955637
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞