pytorch 中的softmax, log_softmax, nn.CrossEntropyLoss和NLLLoss

1. softmax和softmax loss知识学习

在进行图像分类和分割任务时,经常会用到softmax和softmax loss,今天就来彻底搞清楚这两个的区别。

 

  • softmax

softmax是用来输出多个分类的概率的,可以作为网络的输出层。softmax的定义如下:

\large f(z_k) = \frac{e^zk}{\sum_{j}e^zj}

其中z是softmax的输入,f(z)是softmax的输出,k代表第k个类别。

 

  • sotfmax loss

sotfmax loss是用来计算损失loss的。交叉熵损失函数softmax loss,它是由softmax和交叉熵loss(cross-entropy loss)组合而成的。定义如下:

\large l(y, z) = -\sum_{k=0}^{C}y_cln(f(z_c))

公式中的\large y_c取0或1,表示当训练时\large y_c的输出为第c类时,\large y_c = 1,为其他类别时\large y_c = 0;

\large ln(f(z_c))就是对上面softmax函数输出\large f(z_c)求对数ln.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

2. 在pytorch中的使用

pytorch代码中,在训练模型的时候,如果在网络定义里使用sotfmax作为输出层,那么在计算loss的时候就可以使用 nn.MSELoss() 来计算误差。

 

在pytorch中我们发现还有一个log_softmax函数(其实就是在softmax取了一个对数ln),这是用来干嘛的呢?

这就涉及到对数似然损失函数,在分类softmax函数上加一个激活函数。对应的损失函数一般都是用对数似然函数。定义如下:

\large J(W, b, a^L, y) = -\sum_{k}y_klna_{k}^{L}

 

  • NLLLoss损失函数

如果在网络定义里面使用log_softmax函数作为最后一层时,适合和NLLLoss来搭配使用来以计算loss(如下边代码)。

NLLLoss的输入是一个对数概率向量和一个目标标签

class SoftMax(nn.Module):
     def __init__(self,n_feature,n_hidden,n_out):
          super(SoftMax,self).__init__()
          self.hidden = nn.Linear(n_feature,n_hidden)
          self.out = nn.Linear(n_hidden,n_out)
 
     def forward(self, x):
          x = torch.sigmoid(self.hidden(x))
          x = self.out(x)
          out = F.log_softmax(x,dim=1) 
          return out
net = SoftMax(n_feature=2,n_hidden=10,n_out=2)

criterion = nn.NLLLoss()  
opitmizer = torch.optim.SGD(net.parameters(),lr=0.03)

 

  • nn.CrossEntropyLoss损失函数

nn.CrossEntropyLoss和nn.NLLLoss函数功能相同,都是为了计算交叉熵损失函数,唯一不同的就是nn.CrossEntropyLoss里面包含了softmax层,所以我们在使用nn.CrossEntropyLoss来计算loss的时候,不需要再加softmax层作为输出层,直接使用最后输出的特征向量来计算loss。如下:

class Net(nn.Module):
     def __init__(self,n_feature,n_hidden,n_out):
          super(Net,self).__init__()
          self.hidden = nn.Linear(n_feature,n_hidden)
          self.out = nn.Linear(n_hidden,n_out)
 
     def forward(self, x):
          x = F.sigmoid(self.hidden(x))
          out = self.out(x)
          return out
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

 


参考:

1.《深度学习之图像识别》

2. https://www.cnblogs.com/ranjiewen/p/10059490.html

3. https://blog.csdn.net/tianweidadada/article/details/82630735

 

你可能感兴趣的:(AI)