1. softmax和softmax loss知识学习
在进行图像分类和分割任务时,经常会用到softmax和softmax loss,今天就来彻底搞清楚这两个的区别。
- softmax
softmax是用来输出多个分类的概率的,可以作为网络的输出层。softmax的定义如下:
其中z是softmax的输入,f(z)是softmax的输出,k代表第k个类别。
- sotfmax loss
sotfmax loss是用来计算损失loss的。交叉熵损失函数softmax loss,它是由softmax和交叉熵loss(cross-entropy loss)组合而成的。定义如下:
公式中的取0或1,表示当训练时的输出为第c类时, = 1,为其他类别时 = 0;
就是对上面softmax函数输出求对数ln.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
2. 在pytorch中的使用
pytorch代码中,在训练模型的时候,如果在网络定义里使用sotfmax作为输出层,那么在计算loss的时候就可以使用 nn.MSELoss() 来计算误差。
在pytorch中我们发现还有一个log_softmax函数(其实就是在softmax取了一个对数ln),这是用来干嘛的呢?
这就涉及到对数似然损失函数,在分类softmax函数上加一个激活函数。对应的损失函数一般都是用对数似然函数。定义如下:
- 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