交叉熵损失函数详解
pytorch中torch.nn.CrossEntropyLoss(weight=None, size_average=True),将LogSoftMax和NLLLoss集成到一个类中。
对其参数进行说明:
weight(tensor): 1-D tensor,n个元素,分别代表n类的权重,如果你的训练样本很不均衡的话,是非常有用的。默认值为None。
size_average=True:计算出的loss对mini-batch的大小取了平均。
Loss可以表述为以下形式:
当weight参数被指定的时候,loss的计算公式变为:
其输入维度如下:
Input: (N,C) C 是类别的数量,N为mini-batch大小。
Target: (N) N是mini-batch的大小,0 <= targets[i] <= C-1。
交叉熵更直白的解释参考
输入数据从二维至多维
此时情况参考pytorch文档中class torch.nn.NLLLoss2d(weight=None, size_average=True)[source]的介绍。
此时输入特征形状要求:
Input: (N,C,H,W) N为mini-batch的大小,C是类的数量,H,W是其他维数。
Target: (N,H,W) where each value is 0 <= targets[i] <= C-1。
举例说明
当面对输入数据x:(mini-batch,seq_len,feature_dim),其中mini-batch为小批量的数目,seq_len是样本序列的长度,feature_dim是样本特征数。
经过网络输出为output:(mini-batch,seq_len,class_num),class_num为类别数。
标签值labels:(mini-batch,seq_len)
此时,output与labels不能直接输入nn.CrossEntropyLoss,要按照如下规则:
Input: (N,C,H,W) N为mini-batch的大小,C是类的数量,H,W是其他维数。
Target: (N,H,W) where each value is 0 <= targets[i] <= C-1。
对output数据进行维度变换。如下代码所示,将output的shape变为(batch_size, class_num, seq_len)即可。
output = output.permute(0, 2, 1) # 第2维 与 第3维互换, output的shape变为(batch_size, class_num, seq_len)
loss_c = loss_fc(output, label) # 计算分类损失 label的shape为(batch_size, seq_len)
其中permute函数用于调整张量(tensor)的维度顺序,其维度根据给定的参数顺序重新排列。